При работе с базами данных на платформе 1С:Предприятие 8, особенно использующими обычные формы (например, в редакции 2.0 конфигурации «Бухгалтерия предприятия КОРП»), разработчики и системные администраторы часто сталкиваются с неприятным визуальным багом. После изменения формы документа (добавления новых реквизитов, изменения привязок) у части пользователей форма отображается корректно, а у другой части — элементы управления остаются сжатыми, «сбиваются в кучу» в левом верхнем углу, а сама форма отказывается разворачиваться на весь экран. При этом стандартная чистка кэша платформы не приносит долгосрочного результата.
В этой статье мы подробно проанализируем причины возникновения этой проблемы, связанные с особенностями масштабирования операционной системы Windows (DPI) и работой на нескольких мониторах, а также разберем по шагам все возможные способы её окончательного устранения.
---
Чтобы понять, как решить проблему, давайте выясним её первопричину. Обычные формы в 1С позиционируют свои элементы по жестким координатам (в пикселях). Масштабирование и поведение элементов при изменении размеров окна задается с помощью механизма привязок. Этот механизм крайне чувствителен к системным настройкам экрана.
Выделим три главные причины сжатия формы:
v8sp.lst). Если форма один раз открылась некорректно из-за сбоя DPI, эти «сломанные» координаты намертво записываются в настройки. Функция «Восстановить положение окна» помогает только до первого закрытия формы, так как при последующем выходе 1С снова перезаписывает кэш некорректными данными.---
Это базовое и самое правильное решение, которое должен выполнить разработчик. Нам необходимо пересохранить форму в «чистой» графической среде.
Рассмотрим этот процесс по шагам:
ПоступлениеТоваровУслуг).Важное примечание: Если привязки формы были серьезно повреждены предыдущими сохранениями в некорректном масштабе, проще всего восстановить форму до типового состояния (путем сравнения и объединения с конфигурацией поставщика), а затем заново аккуратно добавить ваш реквизит, строго соблюдая масштаб разработчика 100%.
---
Если у пользователей установлены мониторы с высоким разрешением (например, 4K или FullHD на небольшой диагонали), работать при масштабе 100% им будет некомфортно из-за слишком мелкого текста. В таком случае мы можем заставить операционную систему Windows самостоятельно и корректно масштабировать интерфейс 1С без искажения привязок.
Проанализируем, как настроить ярлык запуска:
1cv8.exe в папке bin установленной платформы).Этот способ заставляет Windows масштабировать окно 1С как единый растровый объект, предотвращая внутренний сбой расчета координат привязок в коде самой платформы.
---
По умолчанию у большинства документов в типовых конфигурациях свойство формы СостояниеОкна установлено в значение Обычное. При работе на нескольких мониторах такие окна пытаются жестко привязаться к границам главного окна приложения 1С, что вызывает сжатие интерфейса.
Давайте изменим это свойство:
Обычное на Свободное.Свободные окна обрабатываются операционной системой более независимо. Они стабильно сохраняют свои пропорции и корректно разворачиваются на весь экран независимо от того, на каком из мониторов они были открыты.
---
Как мы уже выяснили, «одноразовый» эффект от стандартного восстановления положения окна связан с тем, что поврежденные координаты постоянно перезаписываются в базу данных или файлы настроек пользователя. Нам нужно полностью затереть эту информацию.
Выполните следующие действия в режиме «1С:Предприятие»:
ФормаДокументаПоступлениеТоваровУслуг).%localappdata%\1C\1Cv8 и %appdata%\1C\1Cv8.---
Если по каким-то причинам вы не можете изменить аппаратные настройки мониторов пользователей, а форма упорно продолжает открываться сжатой, можно применить программный «костыль». Мы заставим платформу принудительно имитировать нажатие комбинации клавиш восстановления положения окна при каждом открытии этого документа.
Для этого в модуле формы документа найдите предопределенную процедуру ПриОткрытии и добавьте в ее конец следующий код:
Процедура ПриОткрытии()
// [Ваш существующий код процедуры]
#Если Клиент Тогда
Попытка
// Создаем COM-объект для работы с операционной системой
Шелл = Новый COMОбъект("WScript.Shell");
// Отправляем системную комбинацию клавиш Alt + Shift + R (Восстановить положение окна)
Шелл.SendKeys("%+R");
Исключение
// Игнорируем ошибку, если объект не смог создаться в терминальном сеансе
КонецПопытки;
#КонецЕсли
КонецПроцедуры
Данный код сработает незаметно для пользователя: в момент открытия документа форма мгновенно сбросит некорректные сохраненные координаты геометрии и примет нормальный, развернутый вид.
---
Мы рассмотрели все аспекты борьбы со сжатием обычных форм в 1С. Подводя итог, рекомендуем придерживаться следующего плана действий: