Как прописать путь к макету во внешнем отчете 1С:ЗУП и ЗГУ 3.1 при возникновении ошибки «Макет не существует»

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

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

Выясним причину возникновения ошибки

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

Проблема заключается в том, что когда отчет становится внешним, его контекст меняется. Программный код типового модуля продолжает искать макет внутри основной конфигурации, используя идентификатор или имя, которое было актуально для встроенного отчета. Не находя этого объекта в составе метаданных (так как внешний отчет — это автономный файл), система блокирует формирование, считая, что структура отчета нарушена.

Многие разработчики ошибочно полагают, что достаточно вызвать метод ПолучитьМакет() в модуле объекта, как это делается в обычных обработках:


ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); 
Макет = ОтчетОбъект.ПолучитьМакет("Макет");

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

Пошаговое решение проблемы через программную подмену макета

Рассмотрим основной способ решения, который позволяет «обмануть» типовой механизм и подсунуть ему нужный макет из состава внешнего отчета. Для этого нам потребуется внести изменения в Модуль объекта внешнего отчета.

Разберем алгоритм действий по шагам:

  1. Откройте ваш внешний отчет в конфигураторе.
  2. Перейдите в Модуль объекта.
  3. Найдите процедуру ПриКомпоновкеРезультата. Если ее нет, создайте ее.
  4. В этой процедуре нам нужно обратиться к настройкам компоновщика и передать имя макета в его дополнительные свойства.

Проанализируем пример кода, который необходимо добавить перед вызовом типовой процедуры формирования:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Указываем системе, какой именно макет использовать. 
    // Это критически важно для корректной работы общего модуля ЗарплатаКадрыОтчеты.
    КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства.Вставить("МакетПечатнойФормы", "ПФ_MXL_РасчетныйЛистокНастраиваемый");
    
    // Далее следует типовой вызов формирования, который уже «увидит» наш макет
    ЗарплатаКадрыОтчеты.ПриКомпоновкеРезультатаРасчетныйЛисток(ЭтотОбъект, ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка);

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

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

Особенности работы с другими отчетами

Рассмотрим подробнее вопрос: распространяется ли эта логика на другие отчеты? Разработчики 1С используют принцип унификации. Однако для разных отчетов (например, «Анализ зарплаты» или «Полный свод начислений») ключи в ДополнительныеСвойства могут отличаться. Если предложенный выше вариант с МакетПечатнойФормы не помогает для другого отчета, рекомендуется выполнить следующие действия:

  1. Запустите отладку и установите точку останова в начале процедуры ПриКомпоновкеРезультата.
  2. Зайдите внутрь типовой процедуры общего модуля (например, ЗарплатаКадрыОтчеты.ПриКомпоновкеРезультата...).
  3. Посмотрите, какие параметры считываются из ЭтотОбъект.КомпоновщикНастроек.

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

Альтернативные методы решения задачи

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

  1. Использование расширений конфигурации. Это наиболее современный и стабильный метод. Вы можете создать расширение, заимствовать в него типовой отчет и его макет. В этом случае система воспринимает отчет как «родной», и все пути к макетам разрешаются автоматически без написания сложного кода в модулях.
  2. Редактирование макетов в пользовательском режиме. В 1С:ЗУП 3.1 есть встроенный механизм (раздел «Администрирование» — «Печатные формы, отчеты и обработки» — «Макеты печатных форм»). Вы можете найти там макет «Расчетный листок (настраиваемый)», нажать «Изменить» и внести правки прямо в интерфейсе программы. Система сохранит этот макет в базе данных и будет приоритетно использовать его вместо стандартного.

Влияние безопасного режима

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

Таким образом, мы выяснили, что для решения проблемы во внешнем отчете необходимо явно передать имя макета через дополнительные свойства компоновщика настроек. Это позволяет преодолеть жесткие проверки типовых модулей 1С и успешно сформировать отчет на основе вашего макета. А для автоматизации последующего учета выданных документов в бухгалтерии можно использовать инструмент для формирования и печати ведомостей выдачи расчетных листков.

← На главную