В процессе разработки и поддержки систем на базе 1С:Предприятие программисты часто сталкиваются с необъяснимым поведением интерфейса. Одной из таких неприятных проблем является ситуация, когда элементы управляемой формы ведут себя нестабильно: при первом открытии формы все элементы растягиваются корректно, однако после закрытия и повторного открытия «растягивание» пропадает, и форма выглядит сжатой или пустой. Рассмотрим подробнее, почему это происходит и какие шаги необходимо предпринять для решения этой задачи.
Проанализируем ситуацию, описанную пользователями. Проблема наиболее остро проявилась в релизах платформы ветки 8.3.16 (в частности, 8.3.16.1063). Основной симптом — «эффект второго открытия». Платформа при первом сеансе работы с формой корректно вычисляет геометрию элементов, но при сохранении настроек окна или при кэшировании параметров формы возникают ошибки. Выясним причину такого поведения.
В этой версии платформы разработчики 1С внедряли существенные изменения в движок отрисовки форм для поддержки мобильных клиентов и корректной работы с High DPI (высоким разрешением экранов). Это привело к регрессии: алгоритм автоматического расчета размеров (Stretch) начал давать сбои. Особенно это заметно в следующих случаях:
Группа - Страницы или разделителей (Splitters).Разберем самый быстрый, но «радикальный» метод, который обсуждался участниками сообщества. Если конфигурация позволяет, можно изменить Режим совместимости. В ходе обсуждения было выявлено, что установка режима «Не использовать» может решить проблему с отрисовкой, но часто порождает критические ошибки в других механизмах (печать, работа со строками, расширения).
Более стабильным вариантом в данной ситуации оказалось использование режима совместимости 8.3.7. Рассмотрим, почему это помогает: при откате на старый режим совместимости платформа переключает алгоритм рендеринга интерфейса «Такси» на более раннюю версию, которая лишена багов отрисовки, появившихся в 16-й платформе.
Важное замечание: Переход на режим совместимости 8.3.7 — это крайняя мера. Если ваша конфигурация использует современные возможности (например, асинхронные вызовы или расширения), такой откат может полностью заблокировать работу системы. Мы рекомендуем сначала протестировать промежуточные режимы, такие как 8.3.12 или 8.3.14.
Посмотрим на более изящный способ решения, не требующий изменения глобальных настроек всей базы. Если платформа ошибается в автоматическом расчете, мы можем «помочь» ей, жестко задав параметры в свойствах элементов формы. Разберем по шагам, что нужно изменить в конфигураторе:
Авто для свойства РастягиватьПоГоризонтали установите Да. Аналогично поступите со свойством РастягиватьПоВертикали.МинимальнуюШирину и МинимальнуюВысоту для ключевых контейнеров (групп). Это заставит движок отрисовки выделить пространство под элемент, даже если алгоритм автоматического расчета «схлопнул» его в ноль.Проанализируем ситуацию с программным изменением свойств. Иногда полезно при создании формы принудительно устанавливать размеры для элементов, если они зависят от динамических данных:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Принудительно устанавливаем растягивание для основной группы
Элементы.ГруппаСписок.РастягиватьПоВертикали = Истина;
Элементы.ГруппаСписок.РастягиватьПоГоризонтали = Истина;
КонецПроцедуры
Выясним, почему проблема повторяется именно при втором открытии. 1С сохраняет состояние формы (размеры окна, положение разделителей) в системном хранилище настроек. Если в первый раз форма закрылась с некорректно рассчитанными координатами, платформа запишет их в кэш и будет использовать постоянно.
Попробуйте выполнить следующие действия для проверки этой гипотезы:
Если форма приняла нормальный вид, значит, корень проблемы в механизме сохранения настроек. В этом случае может помочь программная очистка настроек окна при закрытии или обновлении версии платформы до исправленного релиза.
Проанализируем техническую сторону вопроса: ветка 8.3.16 имела множество «детских болезней» в начале своего пути. Релиз 8.3.16.1063 признан проблемным в части интерфейсных решений. Рассмотрим возможность обновления на более стабильные патчи внутри той же ветки, например 8.3.16.1814 или выше.
В более поздних сборках разработчики 1С внесли исправления в объект УправляемаяФорма, которые устраняют ошибки рендеринга при использовании разделителей и сложных группировок. Это самый правильный путь, так как он не требует снижения режима совместимости и сохраняет весь функционал конфигурации.
Подводя итог, мы видим, что проблема «прыгающих» элементов формы — это комплексный баг платформы. Для его решения рекомендуем следующий алгоритм действий:
РастягиватьПоВертикали и РастягиватьПоГоризонтали для проблемных групп вместо значения Авто.Совместная работа над структурой формы и понимание механизмов рендеринга 1С позволят вам создавать интерфейсы, которые будут работать стабильно вне зависимости от версии платформы или настроек монитора пользователя.