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