При доработке типовых конфигураций, таких как ЗУП 3.1 или ERP, разработчики часто сталкиваются с ситуацией, когда внесенные изменения в форму документа прекрасно работают в режиме отладчика, но абсолютно не видны конечным пользователям. Рассмотрим подробнее одну из самых коварных особенностей механизма списочных документов, на примере документа КадровыйПереводСписком.
Проанализируем типичную ситуацию. Программисту ставят задачу: при изменении оклада в документе КадровыйПереводСписком должна автоматически пересчитываться сумма аванса (если используется начисление с фиксированной суммой). Разработчик открывает конфигуратор, находит форму документа КадровыйПеревод (одиночный), вносит изменения через расширение, запускает отладку — всё работает. Однако пользователи сообщают, что у них ничего не изменилось.
Выясним причину этого поведения. Если заглянуть в программный код вызова формы редактирования строки в списочном документе, мы увидим следующую конструкцию:
Если ОбщегоНазначенияКлиент.РежимОтладки() Тогда
ПолноеИмяФормыОбъектаМетаданных = ПолноеИмяОбъектаМетаданных + ".ФормаОбъекта";
Иначе
ПолноеИмяФормыОбъектаМетаданных = ПолноеИмяОбъектаМетаданных + "Списком.Форма.ФормаСтроки";
КонецЕсли;
Разберем, что здесь происходит. Система проверяет, запущен ли сеанс в режиме отладки. Если да — открывается стандартная ФормаОбъекта одиночного документа КадровыйПеревод. Если же программу запустил обычный пользователь (не в режиме отладки), система открывает ФормаСтроки, которая принадлежит метаданному КадровыйПереводСписком. Это абсолютно разные объекты метаданных, и изменения в одном никак не влияют на другой автоматически.
Рассмотрим причины, по которым архитекторы 1С выбрали такой путь. Основных факторов два: производительность и удобство разработки.
ФормаСтроки — это облегченная версия, которая работает напрямую с данными текущей строки табличной части и открывается мгновенно.Представим задачу: кадровикам удобно сразу видеть и оклад, и сумму аванса в одной форме. Аванс составляет, например, 75% от оклада, но должна оставаться возможность ручной правки. Посмотрим, как реализовать это правильно, учитывая двойственность форм.
Проанализируем алгоритм доработки:
Во-первых, нам необходимо внести изменения в ФормаОбъекта документа КадровыйПеревод. Это обеспечит корректную работу при создании одиночных документов и в режиме отладки. Мы добавим обработчик события ПриИзменении для показателя оклада.
Во-вторых, нам нужно найти в дереве метаданных документ КадровыйПереводСписком, развернуть его формы и найти там ФормаСтроки. Именно её видят пользователи. Рассмотрим по шагам, что нужно сделать в этой форме:
Важно понимать, что КадровыйПереводСписком — это не просто набор ссылок. При открытии формы строки происходит сложный процесс: данные из строки табличной части «распаковываются» в структуру, имитирующую объект. За это отвечают процедуры в модулях менеджеров (например, КадровыйУчетВнутренний).
Если ваша доработка касается не только визуального отображения, но и записи данных в регистры, проанализируем, где происходит физическая запись. В ЗУП 3 данные из списочного документа переносятся в регистры не напрямую, а через создание виртуальных объектов одиночных документов в момент проведения. Поэтому, если вы добавили новый реквизит в ФормаСтроки, не забудьте:
КадровыйПереводСписком.КадровыйПеревод.При использовании расширений проблема усугубляется. Программист часто заимствует только одну форму, забывая про существование «дублера». Чтобы ваша доработка была надежной, всегда проверяйте наличие пары «Документ» и «ДокументСписком».
Совет: Если вы видите в коде использование метода ОбщегоНазначенияКлиент.РежимОтладки() при выборе формы — это верный сигнал того, что вам придется дублировать логику интерфейса в двух местах. Это плата за высокую скорость работы программы у конечных пользователей.
Посмотрим на итоговый чек-лист при доработке кадровых документов в ЗУП 3.1:
ФормаСтроки.ФормаОбъекта (для одиночных документов), и в ФормаСтроки (для списков).Такой подход позволит избежать ситуации «у меня на компьютере всё работает», обеспечит стабильность системы и комфортную работу пользователей с кадровыми документами.