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