После очередного обновления технологической платформы 1С:Предприятие 8.3 многие разработчики и пользователи сталкиваются с неприятным визуальным багом: интерфейс привычных управляемых форм неожиданно «ломается». Элементы управления накладываются друг на друга, кнопки съезжают, таблицы сжимаются, а на форме появляются пустые неиспользуемые области. Особенно часто это происходит с комплексными интерфейсами, такими как форма подбора номенклатуры в документах продажи.
Интересной особенностью этого бага является его нестабильность. Если пользователь вручную изменяет состояние формы — например, сворачивает и разворачивает ее, переключает какой-либо флажок или меняет масштаб, — интерфейс мгновенно перерисовывается и принимает абсолютно нормальный, рабочий вид. Однако при следующем открытии той же формы проблема возвращается. Давайте подробно проанализируем эту ситуацию, выясним глубинную причину сбоя и рассмотрим по шагам все доступные способы решения проблемы.
Описанный сбой представляет собой известный зарегистрированный баг платформы 1С:Предприятие 8.3 (начиная с релизов линейки 8.3.10 и особенно ярко проявляющийся в версиях 8.3.15, 8.3.16 и новее). Проблема напрямую связана с системным механизмом автоматического масштабирования интерфейса (High DPI), когда в настройках операционной системы Windows установлен масштаб экрана, отличный от 100% (например, 125% или 150% на современных мониторах с высоким разрешением).
Когда управляемая форма открывается в первый раз, платформа рассчитывает ее геометрию, привязки и размеры элементов. Эти данные кэшируются и сохраняются непосредственно в системные таблицы информационной базы 1С для каждого конкретного пользователя, чтобы при повторном запуске окно открывалось мгновенно в том же месте и тех же размерах. Из-за внутренней ошибки платформы при повторном чтении кэшированных настроек геометрия рассчитывается некорректно: коэффициенты масштабирования Windows накладываются на координаты повторно, привязки «плывут», и форма визуально разрушается. Принудительное изменение любого реквизита на форме вызывает событие обновления отображения, платформа пересчитывает интерфейс «с нуля», и форма временно нормализуется до следующего открытия.
Рассмотрим подробнее эффективные методы борьбы с этой проблемой — от простых пользовательских манипуляций до программных решений на уровне конфигуратора.
Если проблема носит массовый характер и проявляется у многих пользователей, наиболее эффективным решением будет принудительное обновление конфигурации метаданных формы. Платформа должна заново пересчитать базовую разметку формы без искажений масштабирования.
Разберем этот процесс по шагам:
Этот простой прием сбрасывает закэшированные платформой параметры разметки по умолчанию и генерирует верную структуру интерфейса.
Если предыдущий способ не помог или формы продолжают ломаться у пользователей с нестандартными мониторами, мы можем применить гарантированное программное решение. Мы заставим платформу полностью игнорировать сохраненные ранее настройки геометрии окна для этой конкретной формы.
Для этого мы воспользуемся встроенным свойством управляемой формы КлючСохраненияПоложенияОкна. Рассмотрим пример кода, который необходимо внедрить в модуль проблемной формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Принудительно генерируем уникальный ключ при каждом открытии формы
КлючСохраненияПоложенияОкна = Новый УникальныйИдентификатор();
КонецПроцедуры
Посмотрим, как работает этот код. При каждом вызове формы в обработчике события ПриСозданииНаСервере свойству КлючСохраненияПоложенияОкна присваивается абсолютно новый, уникальный GUID (УникальныйИдентификатор). Поскольку платформа не находит в базе данных сохраненных настроек для этого нового ключа, она вынуждена каждый раз отрисовывать форму в первозданном виде, полностью исключая считывание «кривого» кэша.
Иногда очистка локального кэша на компьютере пользователя (путем удаления базы из списка запуска и повторного добавления) не приносит результатов, поскольку настройки положения окон хранятся внутри самой информационной базы. В таком случае администратор может очистить настройки отображения точечно.
Выполним очистку по шагам:
При следующем запуске сеанса у пользователя восстановится чистый системный вид формы.
Если ломающийся интерфейс наблюдается только у одного сотрудника, работающего на ультрабуке или современном 4K-мониторе с включенным масштабированием (например, 150%), мы можем решить проблему системными настройками ярлыка запуска 1С без внесения изменений в конфигурацию.
Для этого выполним следующие действия:
C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8c.exe (или 1cv8.exe).Данная настройка сообщает операционной системе Windows, что отрисовку масштаба и элементов управления берет на себя непосредственно платформа 1С:Предприятие, запрещая Windows принудительно масштабировать и искажать шрифты и границы управляемых форм.
В качестве временной меры, чтобы пользователю не приходилось постоянно закрывать программу или искать обходные пути на форме, можно использовать встроенную сервисную команду платформы 1С.
Находясь на открытой, визуально «сломанной» форме, пользователю достаточно нажать комбинацию клавиш Alt + Shift + R. Эта системная команда мгновенно сбрасывает текущие настройки положения, размеров и привязок активного окна к стандартным значениям. Форма сразу же примет корректный вид.