Рассмотрим распространенную и весьма неприятную проблему, с которой сталкиваются пользователи и разработчики конфигураций на обычных (неуправляемых) формах в платформе 1С:Предприятие 8.3. Симптомы ошибки выглядят следующим образом: при первом запуске базы форма документа или справочника открывается корректно. Однако при повторном открытии того же документа форма оказывается сильно сжатой, а привязки левой и нижней границ элементов «слетают». Очистка временного кэша платформы помогает ровно на один раз, после чего искажение геометрии окна повторяется.
Проанализируем механику работы платформы, чтобы понять, почему возникает такое поведение. Ошибка обусловлена давним конфликтом механизма расчета относительных координат обычных форм платформы 8.3 с увеличенным масштабом экрана в операционной системе Windows (DPI выше 100%, например 125% или 150%).
При первом открытии формы платформа рассчитывает координаты элементов согласно конфигурации. Однако перед закрытием окна 1С автоматически сохраняет текущие геометрические размеры и координаты формы в пользовательские настройки. При повторном открытии платформа считывает сохраненное положение окна и пытается повторно применить коэффициент масштабирования Windows к уже скейленным координатам. В результате происходит повторный пересчет привязок, форма катастрофически сжимается, а границы элементов сдвигаются.
Разберем основные способы решения этой проблемы — от быстрых настроек операционной системы и ярлыка до программной доработки формы в Конфигураторе.
Если проблему необходимо решить на стороне конфигурации, чтобы она не проявлялась у пользователей с высокими разрешениями мониторов, воспользуемся программным изменением ключа сохранения настроек геометрии окна.
Для этого открываем проблемную форму в Конфигураторе и выполним следующие действия:
ПередОткрытием переопределим свойство КлючСохраненияПоложенияОкна, присвоив ему новый уникальный идентификатор при каждом открытии.СпособОтображенияОкна в состояние Максимизированное (если требуется открытие на весь экран).Посмотрим на пример кода в модуле формы:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
// Принудительно обновляем ключ сохранения геометрии окна,
// чтобы платформа не загружала искаженные координаты из настроек пользователя
КлючСохраненияПоложенияОкна = Новый УникальныйИдентификатор();
КонецПроцедуры
Благодаря этому ходу платформа воспринимает каждое открытие формы как первоначальное и не загружает сжатые размеры из системного хранилища пользовательских настроек.
Если доработка конфигурации невозможно по причине отсутствия прав на изменение или запрета на снятие с поддержки, решением является изменение параметров отображения на рабочем столе пользователя.
После установки стандартного масштабирования 100% расчет привязок обычных форм 1С начинает работать корректно во всех режимах открытия.
В случаях, когда физический монитор имеет высокое разрешение (4K или Full HD на небольшой диагонали) и работать при системном масштабе 100% невозможно, настроим переопределение работы с DPI для самого исполняемого файла 1С.
1cv8.exe).Иногда искаженная геометрия «залипает» в системной базе данных для конкретного пользователя. Чтобы избавиться от накопленной ошибки без полной очистки общего кэша, выполним очистку пользовательских настроек:
Таким образом, комбинируя программное назначение КлючСохраненияПоложенияОкна = Новый УникальныйИдентификатор(); и корректную настройку масштабирования Windows, мы полностью исключаем проблему сжатия обычных форм при повторном открытии.