При переходе на платформу 1С:Предприятие 8.3 пользователи конфигураций на обычных (толстых) формах — таких как «Управление торговлей 10.3», «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1» — часто сталкиваются с крайне неприятным багом. В какой-то момент формы списка или выбора справочника Номенклатура начинают отображаться некорректно: табличные части сжимаются, границы элементов «налезают» друг на друга, а кнопки панели инструментов и вовсе исчезают из видимости.
В этой статье мы подробно разберем, почему возникает этот сбой, как устроены механизмы платформы, приводящие к искажению интерфейса, и рассмотрим несколько эффективных способов решения проблемы — от тонкой настройки привязок в Конфигураторе до программных методов обхода ошибки.
Для того чтобы эффективно бороться с проблемой, проанализируем физику процесса. Исторически обычные формы проектировались разработчиками под стандартное разрешение экрана с плотностью пикселей 96 DPI (что соответствует масштабу интерфейса Windows 100%). Все элементы управления на форме позиционировались по фиксированной пиксельной сетке.
Начиная с версий платформы 1С 8.3.9 и 8.3.10, разработчики изменили алгоритмы масштабирования под мониторы с высоким разрешением (High DPI). Теперь, если у пользователя в настройках операционной системы установлено масштабирование экрана более 100% (например, 125% или 150% на современных Full HD и 4K мониторах ноутбуков), платформа пытается на лету пересчитать координаты и размеры элементов формы.
Если в форме настроены сложные цепочки взаимных привязок (когда правая граница одного поля привязана к левой границе другого, а то, в свою очередь, привязано к границе панели), математический округлитель координат в платформе дает сбой. При изменении размеров окна элементы начинают хаотично сжиматься или улетать за пределы экрана. Особенно сильно эта проблема проявляется при программном сворачивании панелей или динамическом изменении видимости элементов формы.
Многие системные администраторы замечают, что после удаления локального кэша пользователя в каталоге AppData формы на некоторое время возвращаются в нормальный вид, но затем проблема повторяется. Давайте разберем, почему это происходит.
Дело в том, что платформа сохраняет параметры окон (ширину, высоту, состояние развернутости и положение разделителей) не только в локальных файлах на компьютере пользователя, но и непосредственно в информационной базе данных. Для этого используются системные таблицы настроек, доступные через механизмы ХранилищеСистемныхНастроек или ХранилищеНастроекДанныхФорм.
Как только форма отрисовалась некорректно из-за сбоя масштабирования DPI, платформа фиксирует эти разрушенные координаты и записывает их в базу данных как «последнее успешное положение окна». При последующих запусках система игнорирует исходные настройки формы из конфигурации и принудительно считывает искаженные координаты из хранилища настроек. Обычная чистка локального кэша файлов при этом оказывается бессильной.
Это самый надежный и правильный метод, который полностью устраняет первопричину проблемы в структуре самой формы. Выполним исправление по шагам:
Если вы не хотите менять структуру привязок типовой формы или база находится на поддержке без возможности редактирования, можно прибегнуть к программному обходу проблемы. Для этого мы заставим платформу игнорировать некорректные сохраненные координаты из базы данных.
Рассмотрим пример кода, который необходимо вставить в модуль формы в обработчик события ПередОткрытием:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Динамически назначаем уникальный ключ сохранения положения окна.
// Платформа будет считать, что форма открывается впервые,
// и проигнорирует сломанные координаты из базы данных.
ЭтаФорма.ИмяСохраненияПоложенияОкна = Новый УникальныйИдентификатор();
КонецПроцедуры
Также в свойствах формы в Конфигураторе можно полностью отключить запись координат, установив свойство СохранятьПоложениеОкна в значение Ложь. Программно это реализуется следующим образом:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Отключаем автоматическую запись и чтение координат формы
ЭтаФорма.СохранятьПоложениеОкна = Ложь;
КонецПроцедуры
При использовании данного метода форма всегда будет открываться в своем первоначальном, правильном виде, задуманном разработчиком конфигурации, независимо от того, на каком мониторе работает пользователь.
Если форма «поплыла» у конкретного пользователя, а вносить изменения в конфигурацию нельзя, выполним выборочную очистку его настроек прямо в режиме «1С:Предприятие»:
Номенклатура и удалим сохраненные данные.После этой процедуры при следующем открытии форма у пользователя отобразится корректно, так как координаты будут прочитаны напрямую из конфигурации базы данных.
Проанализируем методы, которые часто советуют на различных форумах, но эффективность которых крайне мала:
WScript.Shell для отправки команды восстановления положения окна. Данный подход крайне нестабилен, так как отправка нажатий клавиш может сработать с опозданием и выполниться в другом активном окне Windows, нарушив работу пользователя.Резюме: Наиболее качественным решением проблемы является исправление структуры привязок формы в Конфигураторе при разрешении экрана 96 DPI. В качестве надежной альтернативы без изменения интерфейса рекомендуется использовать программное отключение сохранения положения окна через свойство СохранятьПоложениеОкна = Ложь.