При работе с обычными формами в решениях на платформе 1С:Предприятие 8.2 и 8.3 (например, в конфигурации «Управление торговлей 10.3») разработчики часто сталкиваются с неприятным поведением интерфейса. Пользователь открывает форму подбора номенклатуры или любой другой сложный диалог — в первый раз всё отображается идеально. Однако при повторном открытии этой же формы в рамках одного сеанса табличная часть «схлопывается», съезжает или уменьшается ровно наполовину. При этом стоит пользователю слегка потянуть мышкой за край окна, как элементы мгновенно принимают правильные размеры. Давайте подробно проанализируем эту проблему, выясним её скрытые причины и разберем практические способы решения.
На первый взгляд может показаться, что ошибка кроется в неверной настройке привязок внутри конфигуратора. Однако проверка формы на ошибки позиционирования (меню «Форма» — «Проверить») не показывает никаких красных перекрестий. Более того, при первом запуске элементы встают на свои места корректно. Это доказывает, что сами привязки настроены верно.
На самом деле корень проблемы лежит в механизме кэширования и автосохранения состояния окон платформой 1С. Процесс протекает по следующему сценарию:
ПередОткрытием или ПриОткрытии программно изменяется видимость или доступность элементов (например, скрывается дерево групп, панель быстрых фильтров или колонка цен), происходит конфликт. Платформа сначала восстанавливает сохраненные «старые» размеры внешних границ формы, а затем пытается применить привязки к динамически изменившейся структуре элементов. В итоге привязки «теряются», и табличная часть деформируется.Эта проблема особенно обострилась на платформе версии 8.3.15 и выше, где разработчики изменили алгоритмы отрисовки обычных форм, запущенных в режиме совместимости.
Рассмотрим несколько эффективных способов программного и административного решения этой проблемы.
Самый надежный способ победить «улетающие» привязки — это запретить платформе сохранять и восстанавливать геометрическое состояние формы при повторных вызовах. Для этого мы можем воспользоваться свойством формы СохранятьДанныеВыбораИСостоянияРазметки.
Разберем по шагам, как это реализовать в конфигураторе. Нам необходимо открыть модуль проблемной формы и добавить строку кода в обработчик события ПередОткрытием:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Отключаем автосохранение разметки формы во избежание конфликта привязок
ЭтаФорма.СохранятьДанныеВыбораИСостоянияРазметки = Ложь;
КонецПроцедуры
Если в форме используется свойство Автосохранение данных в настройках, убедитесь, что оно отключено или настроено избирательно только для реквизитов, но не для разметки окна. Этот простой метод заставит форму каждый раз открываться в чистом виде — ровно так, как она спроектирована в конфигураторе, игнорируя кривой кэш разметки.
Если по каким-то причинам первый способ вам не подходит (например, пользователям критически важно, чтобы форма подбора сохраняла свой увеличенный размер, который они растянули на весь экран), можно применить программную симуляцию ручного изменения размеров окна. Мы выяснили, что при изменении размера формы мышкой привязки пересчитываются корректно. Мы можем спровоцировать этот пересчет программно в самом конце процедуры ПриОткрытии.
Посмотрим на пример реализации такого «пинка» для формы:
Процедура ПриОткрытии()
// [Здесь выполняются стандартные действия при открытии формы]
// Инициируем принудительный пересчет привязок платформой
ТекущаяШирина = ЭтаФорма.Ширина;
ЭтаФорма.Ширина = ТекущаяШирина + 1;
ЭтаФорма.Ширина = ТекущаяШирина;
КонецПроцедуры
Этот код незаметно для глаза пользователя увеличивает ширину формы на один пиксель и сразу возвращает её в исходное состояние. Данная манипуляция заставляет платформу полностью пересчитать координаты всех привязанных элементов, мгновенно выстраивая интерфейс в правильном виде.
Довольно часто в сложных формах подбора номенклатуры (как в типовой УТ 10.3) используется глубокая вложенность элементов: табличные части находятся внутри панелей, которые, в свою очередь, лежат на других панелях или вкладках. Если хотя бы у одного промежуточного контейнера привязки настроены некорректно, пострадает вся цепочка.
Проанализируем правила настройки привязок для вложенных структур:
Если код формы закрыт для редактирования или вы хотите решить проблему для конкретного пользователя без изменения конфигурации, можно сбросить сохраненные настройки отображения окон. Для этого выполните следующие действия:
Также стоит учитывать влияние системного масштабирования Windows (актуально для современных мониторов высокого разрешения 4K). При масштабе экрана 125% или 150% обычные формы 1С могут некорректно рассчитывать пиксельные координаты при повторном открытии. В таких случаях помогает запуск 1С с отключенным масштабированием в свойствах ярлыка приложения (вкладка «Совместимость» — «Изменить параметры высокого DPI»).