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