Почему «слетают» привязки на обычной форме 1С при повторном открытии и как это исправить?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с обычными формами в решениях на платформе 1С:Предприятие 8.2 и 8.3 (например, в конфигурации «Управление торговлей 10.3») разработчики часто сталкиваются с неприятным поведением интерфейса. Пользователь открывает форму подбора номенклатуры или любой другой сложный диалог — в первый раз всё отображается идеально. Однако при повторном открытии этой же формы в рамках одного сеанса табличная часть «схлопывается», съезжает или уменьшается ровно наполовину. При этом стоит пользователю слегка потянуть мышкой за край окна, как элементы мгновенно принимают правильные размеры. Давайте подробно проанализируем эту проблему, выясним её скрытые причины и разберем практические способы решения.

Выясняем причину: почему ломаются привязки?

На первый взгляд может показаться, что ошибка кроется в неверной настройке привязок внутри конфигуратора. Однако проверка формы на ошибки позиционирования (меню «Форма» — «Проверить») не показывает никаких красных перекрестий. Более того, при первом запуске элементы встают на свои места корректно. Это доказывает, что сами привязки настроены верно.

На самом деле корень проблемы лежит в механизме кэширования и автосохранения состояния окон платформой 1С. Процесс протекает по следующему сценарию:

  1. При первом открытии формы платформа отрисовывает её строго по координатам конфигуратора и применяет заданные привязки.
  2. При закрытии формы платформа сохраняет её последние геометрические параметры (размер, положение на экране) в системное хранилище настроек пользователя.
  3. Во время повторного открытия платформа пытается восстановить сохраненные размеры окна.
  4. Если в модуле формы в процедурах ПередОткрытием или ПриОткрытии программно изменяется видимость или доступность элементов (например, скрывается дерево групп, панель быстрых фильтров или колонка цен), происходит конфликт. Платформа сначала восстанавливает сохраненные «старые» размеры внешних границ формы, а затем пытается применить привязки к динамически изменившейся структуре элементов. В итоге привязки «теряются», и табличная часть деформируется.

Эта проблема особенно обострилась на платформе версии 8.3.15 и выше, где разработчики изменили алгоритмы отрисовки обычных форм, запущенных в режиме совместимости.

Рассмотрим несколько эффективных способов программного и административного решения этой проблемы.

Способ 1: Программное отключение сохранения состояния разметки

Самый надежный способ победить «улетающие» привязки — это запретить платформе сохранять и восстанавливать геометрическое состояние формы при повторных вызовах. Для этого мы можем воспользоваться свойством формы СохранятьДанныеВыбораИСостоянияРазметки.

Разберем по шагам, как это реализовать в конфигураторе. Нам необходимо открыть модуль проблемной формы и добавить строку кода в обработчик события ПередОткрытием:


Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    
    // Отключаем автосохранение разметки формы во избежание конфликта привязок
    ЭтаФорма.СохранятьДанныеВыбораИСостоянияРазметки = Ложь;
    
КонецПроцедуры

Если в форме используется свойство Автосохранение данных в настройках, убедитесь, что оно отключено или настроено избирательно только для реквизитов, но не для разметки окна. Этот простой метод заставит форму каждый раз открываться в чистом виде — ровно так, как она спроектирована в конфигураторе, игнорируя кривой кэш разметки.

Способ 2: Метод принудительного изменения размера (Force Resize)

Если по каким-то причинам первый способ вам не подходит (например, пользователям критически важно, чтобы форма подбора сохраняла свой увеличенный размер, который они растянули на весь экран), можно применить программную симуляцию ручного изменения размеров окна. Мы выяснили, что при изменении размера формы мышкой привязки пересчитываются корректно. Мы можем спровоцировать этот пересчет программно в самом конце процедуры ПриОткрытии.

Посмотрим на пример реализации такого «пинка» для формы:


Процедура ПриОткрытии()
    
    // [Здесь выполняются стандартные действия при открытии формы]
    
    // Инициируем принудительный пересчет привязок платформой
    ТекущаяШирина = ЭтаФорма.Ширина;
    ЭтаФорма.Ширина = ТекущаяШирина + 1;
    ЭтаФорма.Ширина = ТекущаяШирина;
    
КонецПроцедуры

Этот код незаметно для глаза пользователя увеличивает ширину формы на один пиксель и сразу возвращает её в исходное состояние. Данная манипуляция заставляет платформу полностью пересчитать координаты всех привязанных элементов, мгновенно выстраивая интерфейс в правильном виде.

Способ 3: Наведение порядка в цепочке привязок

Довольно часто в сложных формах подбора номенклатуры (как в типовой УТ 10.3) используется глубокая вложенность элементов: табличные части находятся внутри панелей, которые, в свою очередь, лежат на других панелях или вкладках. Если хотя бы у одного промежуточного контейнера привязки настроены некорректно, пострадает вся цепочка.

Проанализируем правила настройки привязок для вложенных структур:

Способ 4: Очистка кэша настроек пользователя

Если код формы закрыт для редактирования или вы хотите решить проблему для конкретного пользователя без изменения конфигурации, можно сбросить сохраненные настройки отображения окон. Для этого выполните следующие действия:

  1. Откройте информационную базу в режиме «1С:Предприятие».
  2. В меню выберите «Сервис» — «Настройки пользователя» (или перейдите в справочник пользователей).
  3. Найдите настройки интерфейса и окон для проблемного пользователя и очистите их.
  4. В крайнем случае удалите базу из списка запуска и добавьте её заново, что приведет к полной очистке локального кэша конфигурации на компьютере пользователя.

Также стоит учитывать влияние системного масштабирования Windows (актуально для современных мониторов высокого разрешения 4K). При масштабе экрана 125% или 150% обычные формы 1С могут некорректно рассчитывать пиксельные координаты при повторном открытии. В таких случаях помогает запуск 1С с отключенным масштабированием в свойствах ярлыка приложения (вкладка «Совместимость» — «Изменить параметры высокого DPI»).

← На главную