Почему возникает ошибка «Печатная форма не найдена» при подключении внешней печатной формы в 1С:Управление торговлей 11.3 и как её исправить?

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

Разработчики часто сталкиваются с ситуацией, когда созданная внешняя печатная форма идеально открывается и печатается через меню Файл — Открыть, но при попытке зарегистрировать её в справочнике Дополнительные отчеты и обработки подсистема печати выдает ошибку «Печатная форма не найдена».

Рассмотрим подробно причины возникновения этой ошибки в конфигурациях на базе Библиотеки Стандартных Подсистем (БСП), таких как «1С:Управление торговлей 11.3», и разберем правильный шаблон кода для внешних печатных форм.

Причины ошибки и механизм работы БСП

При интерактивном открытии обработки через меню «Файл — Открыть» отработка кода происходит напрямую из формы обработки. Однако когда форма зарегистрирована в системе как дополнительная печатная форма, подсистема печати вызывает экспортную процедуру Печать непосредственно из модуля объекта обработки.

Разберем основные причины, по которым подсистема БСП не может найти печатную форму:

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

Шаг 1. Регистрируем обработку через СведенияОВнешнейОбработке()

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

Рассмотрим пример правильного заполнения функции регистрации в модуле объекта внешней обработки:


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

Шаг 2. Реализуем экспортную процедуру Печать()

Посмотрим на классическую ошибку: частой практикой является ручной поиск строки в таблице КоллекцияПечатныхФорм через метод Найти(). Если имя макета или идентификатора не совпало хотя бы в одном символе или регистре, поиск возвращает Неопределено, и печатная форма не формируется.

Чтобы избежать ошибок сопоставления, воспользуемся штатным методом подсистемы печати БСП — УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(). Этот метод автоматически помещает сформированный табличный документ в коллекцию по заданному идентификатору.

Разберем пример процедуры Печать в модуле объекта:


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

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

Проанализируем дополнительные важные нюансы при разработке внешних печатных форм:

  1. Строгое совпадение идентификаторов: Идентификатор команды из функции СведенияОВнешнейОбработке() (например, ПечатьТоварнаяНакладнаяТОРГ12) должен точно совпадать с именем макета, передаваемым в метод УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию().
  2. Использование типовых данных: Если необходимо изменить логику заполнения колонок (например, выводить наименование из справочника «Номенклатура поставщика»), не обязательно переписывать весь запрос. Можно перехватить формирование печатной формы в функции СформироватьПечатнуюФорму(), дозапросить нужные сведения по массиву ссылок и подменить значения в табличном документе перед его возвратом.
  3. Безопасный режим: При тестировании обработок с обращением к внешним файлам или COM-объектам убедитесь, что параметр БезопасныйРежим установлен в значение Ложь.
← На главную