Почему в ЗУП 3.1 при редактировании «Кадрового перевода списком» открываются разные формы и как это правильно доработать?

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

При доработке типовых конфигураций, таких как ЗУП 3.1 или ERP, разработчики часто сталкиваются с ситуацией, когда внесенные изменения в форму документа прекрасно работают в режиме отладчика, но абсолютно не видны конечным пользователям. Рассмотрим подробнее одну из самых коварных особенностей механизма списочных документов, на примере документа КадровыйПереводСписком.

Суть проблемы: ловушка режима отладки

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

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


Если ОбщегоНазначенияКлиент.РежимОтладки() Тогда
    ПолноеИмяФормыОбъектаМетаданных = ПолноеИмяОбъектаМетаданных + ".ФормаОбъекта";
Иначе
    ПолноеИмяФормыОбъектаМетаданных = ПолноеИмяОбъектаМетаданных + "Списком.Форма.ФормаСтроки";
КонецЕсли;

Разберем, что здесь происходит. Система проверяет, запущен ли сеанс в режиме отладки. Если да — открывается стандартная ФормаОбъекта одиночного документа КадровыйПеревод. Если же программу запустил обычный пользователь (не в режиме отладки), система открывает ФормаСтроки, которая принадлежит метаданному КадровыйПереводСписком. Это абсолютно разные объекты метаданных, и изменения в одном никак не влияют на другой автоматически.

Зачем 1С использует такой «винегрет»?

Рассмотрим причины, по которым архитекторы 1С выбрали такой путь. Основных факторов два: производительность и удобство разработки.

  1. Оптимизация интерфейса: Одиночная форма кадрового перевода — это «тяжелый» объект. Она содержит множество динамических списков, проверок, связей с регистрами и подключаемых модулей. Если бы при редактировании каждой строки в огромном списке из 100 сотрудников система каждый раз инициализировала полную форму объекта, это вызывало бы колоссальные задержки (overhead). ФормаСтроки — это облегченная версия, которая работает напрямую с данными текущей строки табличной части и открывается мгновенно.
  2. Прозрачность отладки: Режим отладки принудительно включает полноценную форму для того, чтобы разработчик мог видеть работу всех типовых механизмов и проверок в «эталонном» интерфейсе. Это упрощает поиск ошибок бизнес-логики, которые могут быть скрыты в упрощенной форме строки.

Практический пример: автоматизация расчета аванса

Представим задачу: кадровикам удобно сразу видеть и оклад, и сумму аванса в одной форме. Аванс составляет, например, 75% от оклада, но должна оставаться возможность ручной правки. Посмотрим, как реализовать это правильно, учитывая двойственность форм.

Проанализируем алгоритм доработки:

Во-первых, нам необходимо внести изменения в ФормаОбъекта документа КадровыйПеревод. Это обеспечит корректную работу при создании одиночных документов и в режиме отладки. Мы добавим обработчик события ПриИзменении для показателя оклада.

Во-вторых, нам нужно найти в дереве метаданных документ КадровыйПереводСписком, развернуть его формы и найти там ФормаСтроки. Именно её видят пользователи. Рассмотрим по шагам, что нужно сделать в этой форме:

Синхронизация данных: Механизм «распаковки»

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

Если ваша доработка касается не только визуального отображения, но и записи данных в регистры, проанализируем, где происходит физическая запись. В ЗУП 3 данные из списочного документа переносятся в регистры не напрямую, а через создание виртуальных объектов одиночных документов в момент проведения. Поэтому, если вы добавили новый реквизит в ФормаСтроки, не забудьте:

  1. Добавить этот реквизит в табличную часть документа КадровыйПереводСписком.
  2. Убедиться, что он добавлен в табличную часть (или основные реквизиты) одиночного документа КадровыйПеревод.
  3. Проверить процедуры заполнения в модуле менеджера, которые связывают эти два документа.

Ловушки при использовании расширений

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

Совет: Если вы видите в коде использование метода ОбщегоНазначенияКлиент.РежимОтладки() при выборе формы — это верный сигнал того, что вам придется дублировать логику интерфейса в двух местах. Это плата за высокую скорость работы программы у конечных пользователей.

Резюме для разработчика

Посмотрим на итоговый чек-лист при доработке кадровых документов в ЗУП 3.1:

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

← На главную