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