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