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

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

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

В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы взаимодействия отчетов с Библиотекой стандартных подсистем (БСП) и рассмотрим три практических способа решения этой проблемы.

Выясняем причину: почему типовой отчет «ломается» во внешнем файле?

Для того чтобы эффективно решить проблему, нам необходимо понять физику процесса. Ошибка возникает из-за совокупности нескольких факторов, заложенных в архитектуру современных конфигураций на платформе 1С:Предприятие 8.3:

  1. Особенности работы БСП с внешними объектами. Большинство сложных отчетов в ЗУП 3.1 тесно интегрированы с общими модулями (такими как ЗарплатаКадрыОтчеты, ВариантыОтчетов и др.). Когда отчет выполняется в составе конфигурации, его типом является ОтчетОбъект. Как только мы сохраняем его на диск и открываем через меню «Файл — Открыть», его тип меняется на ВнешнийОтчетОбъект. Стандартный код БСП пытается динамически определить имя макета на основе метаданных встроенного отчета. Для внешнего же файла функция определения имени возвращает пустую строку, что приводит к сбою при вызове метода УправлениеПечатью.МакетПечатнойФормы().
  2. Фоновое выполнение отчетов. В управляемом интерфейсе 1С длительные отчеты формируются в фоновом задании на сервере. При запуске внешнего файла напрямую с локального диска серверный сеанс не всегда имеет доступ к этому файлу или к его контексту. Это вызывает сопутствующие ошибки при передаче управления в общую форму формирования отчета.
  3. Инициализация механизмов «Представлений». В ЗУП 3.1 для сборки кадровых данных в запросах СКД активно используется механизм виртуальных таблиц («Представлений»). Они требуют обязательного вызова специального инициализатора наборов данных. Во внешнем отчете стандартный механизм инициализации часто пропускается.
  4. Параметры СКД по умолчанию. Новые релизы конфигураций требуют строгого заполнения внутренних параметров схемы компоновки данных (например, ВыводитьВсеПоказателиНачисленийИУдержаний). Без инициализации этих параметров через модуль менеджера встроенного отчета СКД выдает ошибку о незаполненных значениях.

Ниже мы детально разберем три рабочих сценария обхода и решения этой проблемы: от простого организационного до программного изменения кода.

Способ 1. Правильная регистрация в базе (без изменения кода)

Самая распространенная ошибка — запуск файла .erf через стандартное меню Файл -> Открыть. В этом режиме система не может корректно сопоставить метаданные внешнего объекта и контекст выполнения на сервере.

Рассмотрим правильный алгоритм подключения внешнего отчета:

  1. Перейдем в раздел Администрирование, далее выберем пункт Печатные формы, отчеты и обработки.
  2. Убедимся, что установлена галочка напротив опции Дополнительные отчеты и обработки, и перейдем по одноименной ссылке.
  3. Нажмем кнопку Добавить из файла и выберем наш сохраненный файл внешнего отчета.
  4. Укажем раздел интерфейса, в котором будет доступен отчет, и настроим права доступа для пользователей.
  5. Нажмем Записать и закрыть.

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

Способ 2. Использование расширения конфигурации (рекомендуемый метод)

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

Проанализируем шаги по созданию расширения:

  1. Создадим новое расширение в конфигураторе (меню Конфигурация -> Расширения конфигурации).
  2. Перенесем в расширение макет печатной формы расчетного листка (например, скопируем его из общего макета ОбщиеМакеты.ПФ_MXL_РасчетныйЛистокНастраиваемый).
  3. Заимствуем в расширение общий модуль ЗарплатаКадрыОтчеты.
  4. Переопределим процедуру вывода расчетного листка с помощью аннотации &Вместо или &ИзменениеИКонтроль:
    • ПриКомпоновкеРезультатаРасчетныйЛистокПоФизическимЛицам
    • ВывестиСотрудникаРасчетныйЛисток

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

Способ 3. Программная доработка кода внешнего отчета

Если вам обязательно нужно использовать именно изолированный внешний файл .erf, нам придется внести изменения в программный код модуля объекта этого отчета. Разберем по шагам, как переписать обработчик компоновки.

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

Посмотрим на пример реализации данного кода:


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

Проанализируем, что мы сделали в этом коде. Во-первых, вызов метода ЗаполнитьОбщиеИсточникиДанныхОтчета подготавливает временные таблицы для построения кадровых срезов. Во-вторых, мы вручную получили макет через функцию УправлениеПечатью.МакетПечатнойФормы и принудительно поместили его в структуру ДополнительныеСвойства пользовательских настроек компоновщика, откуда его без труда сможет прочитать стандартный механизм БСП. Наконец, мы программно инициализировали параметр ВыводитьВсеПоказателиНачисленийИУдержаний, защитив отчет от падения при обращении к незаполненным переменным схемы.

Также, если отчет продолжает выдавать ошибки при фоновом выполнении, рекомендуется отключить фоновое формирование в свойствах формы отчета или принудительно установить свойство ВыполнятьВФоне = Ложь в параметрах открытия формы внешнего отчета.

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

← На главную