При доработке типовых документов на платформе 1С с обычными формами (например, в конфигурации «Зарплата и Управление Персоналом 2.5» или «Управление производственным предприятием 1.3») разработчики нередко сталкиваются с неприятным поведением интерфейса. Достаточно добавить в табличную часть формы несколько новых колонок или изменить компоновку элементов, как вспомогательные панели перестают адекватно реагировать на действия пользователя. В документе «Начисление зарплаты работникам организаций» расчетный листок при первом запуске разворачивается штатно, но при повторном открытии кнопка показа и скрытия перестает работать, либо панель схлопывается в нулевую высоту без возможности восстановить нормальный вид.
Разберем детально, почему возникает такое поведение, как на него влияют системные параметры Windows и какими способами можно восстановить корректную работу формы.
Проанализируем механику работы обычных форм в платформе «1С:Предприятие 8». В отличие от управляемого интерфейса, где за компоновку отвечает декларативная модель и компоновщик интерфейса, в обычных формах координаты, размеры элементов, разделители (сплиттеры) и привязки жестко завязаны на абсолютные пиксели.
Главная скрытая угроза кроется в параметрах масштабирования экрана Windows (DPI). Рассмотрим цепочку событий, приводящую к ошибке:
Выясним базовый способ устранения проблемы, который является первопричиной сбоя. Любые изменения макета обычных форм в конфигураторе необходимо производить строго при масштабе 100%.
1cv8.exe, откроем его свойства, перейдем на вкладку «Совместимость», нажмем «Изменить параметры высокого DPI», включим пункт «Переопределение масштабирования высокой четкости» и выберем режим «Приложение» или «Система».Стандартная команда «Восстановить положение окна» в контекстном меню формы сбрасывает исключительно габариты самого внешнего окна Windows, но не сбрасывает координаты внутренних разделителей табличных полей. Очистка локального файлового кэша конфигурации также может не помочь, так как настройки положения элементов внутри формы хранятся непосредственно в базе данных.
Чтобы сбросить зафиксированное «схлопнутое» состояние панели у конкретного пользователя, воспользуемся хранилищем системных настроек. Проанализируем программный вызов для сброса данных формы:
// Сбросим сохраненное положение формы документа для текущего пользователя
КлючОбъекта = "Документ.НачислениеЗарплатыРаботникамОрганизаций.Форма.ФормаДокумента";
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, "", ИмяПользователя());
После выполнения данного кода платформа применит заводские координаты элементов, заданные в метаданных при масштабе 100%.
При добавлении новых колонок таблица может превысить расчетную минимальную ширину формы, в результате чего разделитель теряет допустимый диапазон свободного хода. Проверим геометрию формы следующим образом:
Ctrl + R для перехода в режим предварительного просмотра.Если пользователи работают на мониторах с разным разрешением и сброс разделителя периодически повторяется, защитим форму программно. В процедуре кнопки, отвечающей за видимость расчетного листка, добавим контроль фактического размера поля.
Посмотрим на пример обработки события показа расчетного листка:
Процедура ДействияФормыПоказатьРасчетныйЛисток(Кнопка)
// Переключаем видимость панели
ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Видимость = Не ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Видимость;
ЭлементыФормы.РазделительРасчетныйЛисток.Видимость = ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Видимость;
// Защита от схлопывания: если высота оказалась нулевой или слишком малой
Если ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Видимость Тогда
Если ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Высота < 50 Тогда
ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Высота = 150;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Такой подход гарантирует, что даже при некорректно прочитанных из базы координатах разделителя поле расчетного листка принудительно восстановит читаемую высоту и не останется заблокированным в верхней или нижней части экрана.