Как добавить код начисления в Расчетный листок ЗУП 3.1 после наименования

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

В типовой конфигурации «Зарплата и управление персоналом 3.1» расчетный листок формируется на базе отчета Анализ начислений и удержаний. Часто возникает задача дополнить наименование начисления (например, «Оплата по окладу») его кодом из справочника (например, «001»), чтобы получилось «Оплата по окладу (001)». Однако при попытке просто добавить вычисляемое поле в схему компоновки данных (СКД) пользователи часто сталкиваются с тем, что в итоговом печатном макете данные не отображаются. Разберем подробно, почему так происходит и какие существуют методы решения этой задачи.

Почему стандартное вычисляемое поле в СКД не выводится в макет

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

Этот макет содержит жестко заданные имена параметров. Когда мы создаем новое вычисляемое поле, например, ВидНачисленияСКодом, программный алгоритм заполнения макета просто «не видит» это поле, так как он ищет стандартное поле ВидРасчета или Наименование. Чтобы решить задачу, нам нужно либо подменить представление объекта на уровне всей системы, либо вмешаться в процесс формирования данных внутри отчета.

Способ 1: Использование ОбработкиПолученияПредставления в расширении

Это самый эффективный и «чистый» способ с точки зрения программирования. Он позволяет изменить текстовое описание начисления везде, где оно выводится через стандартное Представление(). Рассмотрим по шагам, как это реализовать:

  1. Создадим новое расширение конфигурации (или используем существующее).
  2. Добавим в расширение планы видов расчета Начисления и Удержания.
  3. В модуле менеджера каждого из этих планов видов расчета создадим обработчик события ОбработкаПолученияПредставления.

Пример кода для модуля менеджера плана видов расчета Начисления:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Если ЗначениеЗаполнено(Данные.Код) Тогда
        Представление = Строка(Данные.Наименование) + " (" + Строка(Данные.Код) + ")";
    Иначе
        Представление = Строка(Данные.Наименование);
    КонецЕсли;
КонецПроцедуры

Преимущество этого метода: Вам не нужно менять ни один макет или отчет. Код начисления автоматически появится в расчетном листке, во всех расчетных документах и других отчетах. Недостаток: Изменение глобальное, оно затронет всю программу, что не всегда желательно.

Способ 2: Изменение выражения представления в СКД

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

Выясним причину, по которой простое добавление поля не работает: макет ищет конкретное поле ВидРасчета. Вместо создания нового поля, мы изменим настройки отображения существующего.

  1. Откроем СКД отчета Анализ начислений и удержаний.
  2. Найдем в наборе данных поле ВидРасчета.
  3. У этого поля есть свойство Выражение представления. По умолчанию оно пустое, и система выводит просто наименование.
  4. Пропишем в этой колонке следующее выражение:

ВидРасчета.Наименование + " (" + ВидРасчета.Код + ")"

Теперь, когда программный код будет обращаться к полю ВидРасчета для вывода его в макет расчетного листка, СКД вернет уже сформированную строку с кодом. При этом структура данных не изменится, и алгоритм заполнения макета отработает корректно.

Способ 3: Программная модификация в ПриКомпоновкеРезультата

Рассмотрим ситуацию, когда требуется еще более гибкая настройка. Мы можем перехватить процесс компоновки отчета в модуле объекта отчета через процедуру ПриКомпоновкеРезультата. Это позволяет программно изменить текст запроса или настройки компоновки непосредственно перед выполнением.

Разберем пример добавления кода через модификацию настроек в расширении модуля объекта отчета:


&ВРасширении
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Получаем схему и настройки
    Схема = ЭтотОбъект.СхемаКомпоновкиДанных;
    Настройки = ЭтотОбъект.КомпоновщикНастроек.Настройки;
    
    // Находим нужное поле в схеме и меняем его выражение представления
    Для Каждого Поле Из Схема.НаборыДанных.НаборДанных1.Поля Цикл
        Если Поле.ПутьКДанным = "ВидРасчета" Тогда
            Поле.ВыражениеПредставления = "ВидРасчета.Наименование + "" ("" + ВидРасчета.Код + "")""";
        КонецЕсли;
    КонецЦикла;

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

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

Почему не стоит править макет ПФ_MXL_РасчетныйЛистокНастраиваемый напрямую

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

Если вы измените имя параметра в макете, но не обновите код, который передает данные в этот макет, поле останется пустым. Именно это и произошло у автора вопроса в Сообщении 3. Программный код передает структуру, где есть ключ Наименование, а макет ожидает ВидНачисленияСКодом. Происходит нестыковка имен, и результат — пустота.

Рекомендации по выбору решения

Подведем итог и выберем оптимальный путь для вашей ситуации:

  1. Если нужно быстро и везде: Используйте Способ 1 (ОбработкаПолученияПредставления). Это требует минимум кода и гарантирует единообразие во всей системе.
  2. Если нужно только в расчетном листке: Используйте Способ 2 (Изменение выражения представления в СКД) через расширение. Это наиболее безопасный метод, не затрагивающий другие участки учета.
  3. Если вы не хотите использовать расширения: Вы можете создать Пользовательское поле в настройках отчета в режиме «1С:Предприятие». Однако помните, что из-за особенностей вывода расчетного листка через MXL-макет, пользовательские поля могут игнорироваться программным кодом заполнения. Поэтому расширение является приоритетным вариантом.

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

← На главную