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