Как исправить ошибку «Метод объекта не обнаружен (ПодготовитьКоллекциюПечатныхФорм)» в 1С при обновлении БСП?

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

При обновлении типовых конфигураций 1С (таких как ЗУП 3.1.10+, УТ 11.4.8+, ERP 2.4.8+, КА 2.4.8+ и других) на новые версии Библиотеки стандартных подсистем (БСП) разработчики массово столкнулись с неприятной проблемой. При попытке программного вывода документов на печать система генерирует ошибку о том, что метод ПодготовитьКоллекциюПечатныхФорм в общем модуле УправлениеПечатью не обнаружен.

В этой статье мы подробно разберем, почему разработчики фирмы «1С» приняли решение скрыть этот метод, к каким ошибкам приводит обычное копирование старого кода и как правильно переписать алгоритмы печати в соответствии с современными стандартами БСП.

Выясняем причину: зачем убрали экспорт функции?

Начиная со второй половины 2019 года, в БСП был взят курс на глубокую инкапсуляцию (скрытие) внутренних механизмов работы подсистем. Функция ПодготовитьКоллекциюПечатныхФорм лишилась ключевого слова Экспорт совершенно намеренно.

Дело в том, что состав колонок таблицы значений, которая служит коллекцией печатных форм, регулярно меняется от версии к версии БСП. Например, в последних релизах появились такие колонки, как ОфисныеДокументы (для интеграции с шаблонами Word/PDF) и ПолныйПутьКМакету. Если бы сторонние разработчики продолжали напрямую обращаться к структуре этой таблицы из внешнего кода, любое обновление платформы или конфигурации приводило бы к моментальному падению доработанных механизмов печати.

Тем не менее, решать задачу формирования печатных форм нам все еще необходимо. Рассмотрим детально все возможные варианты решения — от быстрых «костылей» до методологически верных подходов БСП.

Анализируем ошибку «Значение не является значением объектного типа (Экземпляров)»

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

Значение не является значением объектного типа (Экземпляров)

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

Если вам все же крайне необходимо инициализировать таблицу коллекции вручную, никогда не прописывайте колонки жестко. Вместо этого используйте специальный клиент-серверный метод БСП, который всегда возвращает актуальный набор полей для текущей версии конфигурации. Посмотрим на пример правильной инициализации:


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

Этот способ убережет ваш код от ошибок при последующих обновлениях, однако фирма «1С» рекомендует полностью отказаться от ручной генерации коллекции печатных форм. Ниже мы разберем правильные методы.

Решение №1: Правильный серверный метод (Стандарт БСП)

Вместо ручной подготовки таблиц, вызова менеджера печати и последующего вывода табличного документа, современный стандарт БСП предлагает использовать единый универсальный серверный метод — функцию УправлениеПечатью.СформироватьПечатныеФормы.

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

Разберем синтаксис этого метода:


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

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


// 1. Инициализируем исходные данные
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);

// 2. Создаем переменные-приемники для выходных параметров БСП
КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Новый Структура;

// 3. Вызываем стандартный серверный метод БСП
УправлениеПечатью.СформироватьПечатныеФормы(
    "Документ.РеализацияТоваровУслуг", 
    "Накладная", 
    МассивОбъектов, 
    Новый Структура, 
    КоллекцияПечатныхФорм, 
    ОбъектыПечати, 
    ПараметрыВывода
);

// 4. Безопасно получаем готовый табличный документ из коллекции
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
    ТабличныйДокумент = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
    // Дальнейшие действия с ТабличныйДокумент (вывод на экран, отправка по почте и т.д.)
КонецЕсли;

Решение №2: Правильный клиентский метод для вызова печати

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


ПараметрыПечати = Новый Структура("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);

МассивПечати = Новый Массив;
МассивПечати.Добавить(Объект.Ссылка);

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

Этот метод автоматически выполнит все необходимые серверные вызовы, сформирует печатную форму и выведет её в стандартное диалоговое окно печати БСП, где пользователь сможет отправить её на принтер, сохранить в PDF или отправить по электронной почте.

Решение №3: Разработка Внешних печатных форм (ВПФ)

Очень часто с рассматриваемой ошибкой сталкиваются разработчики при создании или адаптации Внешних печатных форм (ВПФ). Важно понимать, что при правильном проектировании ВПФ по стандартам БСП вызывать метод инициализации коллекции печатных форм вообще не требуется!

При подключении внешней обработки через механизм «Дополнительные отчеты и обработки» БСП берет на себя всю подготовку окружения. Она сама создает и инициализирует таблицу КоллекцияПечатныхФорм нужной структуры и передает её в качестве готового параметра в экспортную процедуру Печать вашей обработки.

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


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

При использовании такого подхода ваш код ВПФ становится полностью неуязвимым к любым обновлениям конфигурации и изменениям состава колонок в БСП.

Подведем итоги

Для надежной работы ваших доработок в среде 1С выполняйте следующие правила:

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