Почему перестает открываться расчетный листок в документе начисления зарплаты и как это исправить?

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При доработке типовых документов на платформе 1С с обычными формами (например, в конфигурации «Зарплата и Управление Персоналом 2.5» или «Управление производственным предприятием 1.3») разработчики нередко сталкиваются с неприятным поведением интерфейса. Достаточно добавить в табличную часть формы несколько новых колонок или изменить компоновку элементов, как вспомогательные панели перестают адекватно реагировать на действия пользователя. В документе «Начисление зарплаты работникам организаций» расчетный листок при первом запуске разворачивается штатно, но при повторном открытии кнопка показа и скрытия перестает работать, либо панель схлопывается в нулевую высоту без возможности восстановить нормальный вид.

Разберем детально, почему возникает такое поведение, как на него влияют системные параметры Windows и какими способами можно восстановить корректную работу формы.

Причины сбоя: масштабирование экрана (DPI) и координаты элементов

Проанализируем механику работы обычных форм в платформе «1С:Предприятие 8». В отличие от управляемого интерфейса, где за компоновку отвечает декларативная модель и компоновщик интерфейса, в обычных формах координаты, размеры элементов, разделители (сплиттеры) и привязки жестко завязаны на абсолютные пиксели.

Главная скрытая угроза кроется в параметрах масштабирования экрана Windows (DPI). Рассмотрим цепочку событий, приводящую к ошибке:

  1. Разработчик подключается к удаленному рабочему столу (RDP), где в параметрах экрана операционной системы установлен масштаб 125% или 150% (часто выставляется автоматически при подключении с ноутбуков с высоким разрешением).
  2. Форма документа редактируется и сохраняется в конфигураторе при этом нестандартном масштабе. Платформа пересчитывает координаты элементов с плавающей точкой и округлением.
  3. Пользователи или тестовые сеансы запускаются при масштабе 100%. Платформа производит обратный пересчет пикселей, из-за чего разделитель между таблицей начислений и табличным полем расчетного листка смещается за границы видимой области или схлопывается в нулевой размер.
  4. Платформа сохраняет испорченные координаты разделителя в системные настройки пользователя. В результате при каждом последующем открытии форма считывает сохраненное нулевое состояние и блокирует разворачивание расчетного листка.

Способ 1. Приведение масштаба экрана к 100% и пересохранение формы

Выясним базовый способ устранения проблемы, который является первопричиной сбоя. Любые изменения макета обычных форм в конфигураторе необходимо производить строго при масштабе 100%.

  1. Проверим параметры экрана на сервере разработки или локальном компьютере, где открыт конфигуратор. Значение должно быть установлено ровно в 100%.
  2. Если системный масштаб изменить невозможно (например, из-за ограничений групповых политик RDP), настроим переопределение масштабирования для платформы. Для этого найдем исполняемый файл 1cv8.exe, откроем его свойства, перейдем на вкладку «Совместимость», нажмем «Изменить параметры высокого DPI», включим пункт «Переопределение масштабирования высокой четкости» и выберем режим «Приложение» или «Система».
  3. Откроем конфигуратор в режиме 100% масштаба, внесем минимальное изменение в форму (например, чуть сдвинем границу и вернем назад) и выполним сохранение конфигурации.

Способ 2. Очистка сохраненных пользовательских настроек формы

Стандартная команда «Восстановить положение окна» в контекстном меню формы сбрасывает исключительно габариты самого внешнего окна Windows, но не сбрасывает координаты внутренних разделителей табличных полей. Очистка локального файлового кэша конфигурации также может не помочь, так как настройки положения элементов внутри формы хранятся непосредственно в базе данных.

Чтобы сбросить зафиксированное «схлопнутое» состояние панели у конкретного пользователя, воспользуемся хранилищем системных настроек. Проанализируем программный вызов для сброса данных формы:


// Сбросим сохраненное положение формы документа для текущего пользователя
КлючОбъекта = "Документ.НачислениеЗарплатыРаботникамОрганизаций.Форма.ФормаДокумента";
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, "", ИмяПользователя());

После выполнения данного кода платформа применит заводские координаты элементов, заданные в метаданных при масштабе 100%.

Способ 3. Проверка привязок и конфликтов геометрии

При добавлении новых колонок таблица может превысить расчетную минимальную ширину формы, в результате чего разделитель теряет допустимый диапазон свободного хода. Проверим геометрию формы следующим образом:

  1. Откроем форму в конфигураторе и нажмем сочетание клавиш Ctrl + R для перехода в режим предварительного просмотра.
  2. Растянем форму по диагонали во все стороны. Если при изменении размеров контуры элементов или разделителя подсвечиваются красным цветом, значит, нарушена логика взаимных привязок (например, нижняя граница таблицы привязана одновременно к верху и низу разделителя).
  3. Откроем контекстное меню таблицы и расчетного листка, выберем «Установить привязки» и убедимся, что верхняя панель привязана к разделителю своей нижней границей, а нижняя панель расчетного листка — своей верхней границей.
  4. У добавленных колонок табличного поля проверим свойство «Изменение размера» — рекомендуется установить автоматический режим, чтобы новые поля не распирали форму за пределы видимости.

Способ 4. Программный контроль минимальной высоты панели

Если пользователи работают на мониторах с разным разрешением и сброс разделителя периодически повторяется, защитим форму программно. В процедуре кнопки, отвечающей за видимость расчетного листка, добавим контроль фактического размера поля.

Посмотрим на пример обработки события показа расчетного листка:


Процедура ДействияФормыПоказатьРасчетныйЛисток(Кнопка)
    
    // Переключаем видимость панели
    ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Видимость = Не ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Видимость;
    ЭлементыФормы.РазделительРасчетныйЛисток.Видимость = ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Видимость;
    
    // Защита от схлопывания: если высота оказалась нулевой или слишком малой
    Если ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Видимость Тогда
        Если ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Высота < 50 Тогда
            ЭлементыФормы.ПолеТабличногоДокументаРасчетныйЛисток.Высота = 150;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Такой подход гарантирует, что даже при некорректно прочитанных из базы координатах разделителя поле расчетного листка принудительно восстановит читаемую высоту и не останется заблокированным в верхней или нижней части экрана.

← На главную