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