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