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

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

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

Анализ причины 1: Конфликт имен и идентификаторов

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

Проанализируем структуру функции регистрации. В таблице команд есть колонка Идентификатор. Именно это имя является ключевым для всей подсистемы печати БСП. Если ваш идентификатор называется ТрудовойДоговорНовый, то именно эта строка должна передаваться во все последующие процедуры. Ошибка «Макет не существует» часто возникает тогда, когда разработчик пытается получить макет по его имени из конфигуратора (например, ПФ_MXL_ТрудовойДоговор), в то время как система ожидает идентификатор команды.

Анализ причины 2: Неправильное получение макета в модуле объекта

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

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

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

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


НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Трудовой договор (новый)";
НоваяКоманда.Идентификатор = "ТрудовойДоговорНовый"; // Это критически важный ID
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыПечать();
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL";

Теперь разберем, как использовать этот идентификатор в основной процедуре Печать. Проанализируем типичную ошибку: попытку передать в коллекцию имя макета вместо идентификатора. Правильный подход заключается в использовании функции УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию.

Рассмотрим правильный пример реализации процедуры Печать:


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

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

Как правильно получить макет внутри функции формирования

Перейдем к самой функции СформироватьПечатнуюФорму. Здесь часто совершают ошибку, пытаясь вызвать макет через РеквизитФормыВЗначение. Помните: печать внешней формы происходит в модуле объекта на сервере, формы в этот момент может вообще не существовать. Поэтому используем прямой метод получения макета обработки.

Разберем пример функции формирования:


Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
    
    // Получаем макет именно по его Имени в дереве метаданных обработки
    // Например, в конфигураторе макет называется "ПФ_MXL_ТрудовойДоговор"
    Макет = ПолучитьМакет("ПФ_MXL_ТрудовойДоговор");
    
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ТрудовойДоговор";
    
    // Дальнейшая логика заполнения областей макета...
    // ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    // ... заполнили параметры ...
    // ТабДок.Вывести(ОбластьЗаголовок);
    
    Возврат ТабДок;

КонецФункции

Типичные ошибки при вызове процедур БСП

Проанализируем параметры процедуры УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию, так как именно в них кроется секрет успеха:

  1. КоллекцияПечатныхФорм: Передается транзитом из процедуры Печать.
  2. ИмяМакета: Это НЕ имя макета в конфигураторе. Это Идентификатор, который вы прописали в СведенияОВнешнейОбработке. Если они не совпадут, вы получите ошибку о том, что табличный документ не сформирован.
  3. СинонимМакета: Человекочитаемое название, которое увидит пользователь.
  4. ТабличныйДокумент: Ваш готовый объект ТабличныйДокумент.
  5. Картинка: Обычно Неопределено.
  6. ПолныйПутьКМакету: Для внешних обработок этот параметр крайне важно оставлять пустым или заполнять очень внимательно. Если вы укажете там путь к макету основной конфигурации, система попытается найти его в составе ЗУП, а не в вашей обработке.

Рекомендации по отладке

Если вы исправили имена, но ошибка «Макет не существует» сохраняется, попробуйте следующие шаги:

  1. Очистка кэша: 1С часто кэширует внешние обработки. После внесения изменений в код или макет, обязательно удалите обработку из справочника «Дополнительные отчеты и обработки» и загрузите её заново.
  2. Отладка через «Файл - Открыть»: Чтобы не перезаписывать обработку в справочнике каждый раз, добавьте в модуль формы обработки кнопку, которая вызывает функцию печати. Это позволит вам поставить точку останова и увидеть, на какой именно строке метод ПолучитьМакет() возвращает Неопределено.
  3. Проверка имен: Убедитесь, что в имени макета нет кириллических символов, которые выглядят как латинские (и наоборот). Лучше всего скопировать имя макета из дерева метаданных конфигуратора и вставить его в код.

Подведем итог: В большинстве случаев проблема заключается в том, что разработчик путает ИмяМакета в метаданных и Идентификатор в коде БСП. Всегда проверяйте, чтобы в ВывестиТабличныйДокументВКоллекцию вторым параметром шел именно ID команды. Соблюдение этой структуры гарантирует корректную работу печатной формы в любой современной конфигурации 1С.

← На главную