При обновлении конфигураций на платформе 1С:Предприятие, особенно таких динамичных, как 1С:Зарплата и Управление Персоналом (ЗУП) 3.1, программисты часто сталкиваются с тем, что внешние печатные формы (ВПФ) перестают работать. Одной из самых распространенных ошибок в редакциях 3.1.10 и выше является сообщение: Метод объекта не обнаружен (ПодготовитьКоллекциюПечатныхФорм). Это происходит из-за глубоких изменений в Библиотеке стандартных подсистем (БСП), на которой базируется ЗУП.
В этой статье мы подробно разберем, почему возникает эта проблема, как правильно перенести код в модуль вашей обработки и как избежать сопутствующих ошибок, связанных с отсутствием необходимых колонок в коллекции.
Разберем ситуацию: раньше в общем модуле УправлениеПечатью существовала экспортная функция ПодготовитьКоллекциюПечатныхФорм. Она использовалась внешними обработками для создания структуры таблицы значений, которая хранит макеты и параметры печати. В новых версиях БСП (начиная с 3.0 и выше) разработчики 1С провели рефакторинг и изменили программный интерфейс подсистемы печати. В результате функция либо перестала быть экспортной, либо была вовсе удалена из общего модуля.
Когда внешняя форма пытается вызвать УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ПечатнаяФорма), система не находит этот метод в контексте общего модуля и прерывает работу программы с ошибкой. Чтобы исправить это, нам необходимо изменить логику инициализации коллекции внутри самой обработки.
Поскольку метод больше не доступен глобально, самым надежным способом будет добавление собственной реализации этой функции непосредственно в модуль вашей внешней печатной формы. Это сделает обработку автономной и независимой от изменений в будущих обновлениях БСП.
Рассмотрим пошагово, как реализовать этот метод. Проанализируем структуру функции, которая создаст правильную таблицу значений со всеми необходимыми полями.
В модуль вашей обработки (обычно это Модуль объекта или Модуль формы, в зависимости от того, где вызывается печать) необходимо добавить следующий код:
Функция ПодготовитьКоллекциюПечатныхФорм(Знач ИменаМакетов) Экспорт
Коллекция = Новый ТаблицаЗначений;
Коллекция.Колонки.Добавить("ИмяМакета", Новый ОписаниеТипов("Строка"));
Коллекция.Колонки.Добавить("ИмяВРЕГ", Новый ОписаниеТипов("Строка"));
Коллекция.Колонки.Добавить("СинонимМакета", Новый ОписаниеТипов("Строка"));
Коллекция.Колонки.Добавить("ТабличныйДокумент");
Коллекция.Колонки.Добавить("Экземпляров", Новый ОписаниеТипов("Число"));
Коллекция.Колонки.Добавить("Картинка");
Коллекция.Колонки.Добавить("ПолныйПутьКМакету", Новый ОписаниеТипов("Строка"));
Коллекция.Колонки.Добавить("ИмяФайлаПечатнойФормы", Новый ОписаниеТипов("Строка"));
// Важно для новых версий БСП:
Коллекция.Колонки.Добавить("ОфисныеДокументы");
Если ТипЗнч(ИменаМакетов) = Тип("Строка") Тогда
ИменаМакетов = СтрРазделить(ИменаМакетов, ",");
КонецЕсли;
Для Каждого ИмяМакета Из ИменаМакетов Цикл
ИмяМакета = СокрЛП(ИмяМакета);
СтрокаКоллекции = Коллекция.Найти(ИмяМакета, "ИмяМакета");
Если СтрокаКоллекции = Неопределено Тогда
СтрокаКоллекции = Коллекция.Добавить();
СтрокаКоллекции.ИмяМакета = ИмяМакета;
СтрокаКоллекции.ИмяВРЕГ = ВРег(ИмяМакета);
СтрокаКоллекции.Экземпляров = 1;
Иначе
СтрокаКоллекции.Экземпляров = СтрокаКоллекции.Экземпляров + 1;
КонецЕсли;
КонецЦикла;
Возврат Коллекция;
КонецФункции
После добавления этой функции, найдите в коде вызов:
КоллекцияФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ПечатнаяФорма);
И замените его на обращение к вашей новой локальной функции:
КоллекцияФорм = ПодготовитьКоллекциюПечатныхФорм(ПечатнаяФорма);
Часто после простого копирования кода из старых конфигураций возникает вторая ошибка: Значение не является значением объектного типа (Экземпляров). Выясним причину этой ситуации.
Проанализируем строку кода: ПечатнаяФорма.Экземпляров = ПечатнаяФорма.Экземпляров + 1;. Ошибка возникает, если переменная ПечатнаяФорма не является строкой таблицы значений. Это может случиться в двух случаях:
Результат забыли добавить колонку Экземпляров. В этом случае метод Найти вернет строку, но обращение к свойству вызовет ошибку.Неопределено, а алгоритм пытается обратиться к свойствам этого Неопределено.Именно поэтому в приведенном выше примере кода мы явно добавляем колонку Экземпляров с типом Число. Также обратите внимание на колонку ОфисныеДокументы. В последних версиях БСП отсутствие этой колонки может привести к критической ошибке при попытке вывода формы в форматы Word или Excel.
Если ваша конфигурация ЗУП 3.1 достаточно свежая, мы рекомендуем посмотреть в сторону более современных методов общего модуля УправлениеПечатью. Вместо того чтобы вручную формировать таблицу, можно воспользоваться функцией, которая пришла на замену удаленной.
Рассмотрим использование метода СоздатьКоллекциюПечатныхФорм. Этот метод является официальным интерфейсом БСП для создания структуры коллекции. Посмотрим на пример его использования:
// Вместо ручного создания ТЗ используем штатный метод
КоллекцияФорм = УправлениеПечатью.СоздатьКоллекциюПечатныхФорм(ПечатнаяФорма);
Этот метод хорош тем, что он автоматически создает все колонки, требуемые текущей версией БСП. Однако, если вы работаете в контексте клиентского вызова (например, в процедуре ВыполнитьПечать на форме), помните, что этот метод может быть доступен только на сервере. В таком случае вызов должен происходить через серверную функцию-обертку.
Проанализируем типичную процедуру печати во внешней обработке и посмотрим, как встроить туда наше решение. Рассмотрим фрагмент кода, где подготавливаются параметры и вызывается формирование печатных листов:
Процедура ВыполнитьПечать(ИмяКоманды)
// Подготовка массива объектов для печати
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
ОбъектыПечати = Новый СписокЗначений;
// Используем нашу локальную функцию для подготовки коллекции
КоллекцияФорм = ПодготовитьКоллекциюПечатныхФорм(ПечатнаяФорма);
// Вызываем процедуру печати из модуля обработки
ЭтотОбъект.Печать(МассивОбъектов, КоллекцияФорм, ОбъектыПечати, ПараметрыВывода);
// Вывод результата пользователю
Для Каждого СтрокаКоллекции Из КоллекцияФорм Цикл
Если СтрокаКоллекции.ТабличныйДокумент <> Неопределено Тогда
СтрокаКоллекции.ТабличныйДокумент.Показать(СтрокаКоллекции.СинонимМакета);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важный совет: всегда проверяйте актуальность имен полей через метод УправлениеПечатьюКлиентСервер.ИменаПолейКоллекцииПечатныхФорм(). Хотя он возвращает строку, это отличный ориентир для понимания того, какие колонки БСП ожидает увидеть в вашей таблице значений.
Для исправления ошибки "Метод объекта не обнаружен" в ЗУП 3.1 необходимо:
УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм, так как этот метод устарел и удален.ПодготовитьКоллекциюПечатныхФорм с полным набором колонок (включая Экземпляров и ОфисныеДокументы).УправлениеПечатью.СоздатьКоллекциюПечатныхФорм, если позволяет версия БСП и контекст выполнения.Соблюдение этих рекомендаций позволит восстановить работоспособность ваших печатных форм и обеспечит их стабильную работу после последующих обновлений программы 1С.