При разработке пакетной печати или доработке нестандартных механизмов вывода документов часто используется вызов методов подсистемы печати Библиотеки стандартных подсистем (БСП). Однако после обновления конфигурации (например, «1С:Бухгалтерия предприятия 3.0») привычный программный вызов может завершаться исключением: При формировании печатной формы "..." возникла ошибка. Обратитесь к администратору. Разберем по шагам, почему возникает эта ошибка, как правильно настроить отладку и как восстановить работоспособность пакетной печати.
Рассмотрим исходный фрагмент кода, где вызывается печать пакета документов:
Процедура ПечатьДокументов(Команда)
Для Каждого ТекСтрока Из Объект.Документы Цикл
Если ТекСтрока.Пометка Тогда
МассивСчет = Новый Массив;
МассивСчет.Добавить(ТекСтрока.СчетНаОплату);
МассивРеализация = Новый Массив;
МассивРеализация.Добавить(ТекСтрока.РеализацияТоваровУслуг);
МассивСчетФактура = Новый Массив;
МассивСчетФактура.Добавить(ТекСтрока.СчетФактураВыданный);
УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер("Документ.СчетНаОплатуПокупателю", "СчетЗаказ", МассивСчет, Неопределено);
УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер("Документ.РеализацияТоваровУслуг", "Акт", МассивРеализация, Неопределено);
УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер("Документ.СчетФактураВыданный", "СчетФактура1137", МассивСчетФактура, Неопределено);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем, как работает общий модуль УправлениеПечатью на стороне сервера. В типовой подсистеме при формировании макетов выполняется следующий алгоритм проверки сформированного результата:
Отказ = ВременнаяКоллекцияДляОднойПечатнойФормы.Количество() = 0;
Для Каждого ВременнаяПечатнаяФорма Из ВременнаяКоллекцияДляОднойПечатнойФормы Цикл
Если ВременнаяПечатнаяФорма.ТабличныйДокумент <> Неопределено Тогда
ПечатнаяФорма = КоллекцияПечатныхФорм.Добавить();
ЗаполнитьЗначенияСвойств(ПечатнаяФорма, ВременнаяПечатнаяФорма);
Если ВременнаяКоллекцияДляОднойПечатнойФормы.Количество() = 1 Тогда
ПечатнаяФорма.ИмяМакета = ИмяМакета;
ПечатнаяФорма.ИмяВРЕГ = ВРег(ИмяМакета);
КонецЕсли;
Иначе
Отказ = Истина;
КонецЕсли;
КонецЦикла;
Если Отказ Тогда
ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
"ru = 'При формировании печатной формы ""%1"" возникла ошибка. Обратитесь к администратору.'"), ИмяМакета);
ВызватьИсключение ТекстСообщенияОбОшибке;
КонецЕсли;
Исключение выбрасывается в двух случаях: либо коллекция печатных форм осталась совершенно пустой (Количество() = 0), либо в процессе формирования свойство ТабличныйДокумент не было инициализировано (осталось равным Неопределено).
Если при попытке пошаговой отладки конфигуратор не останавливается в общем модуле УправлениеПечатью или модуле менеджера документа, выясним причину такого поведения:
ragent запущена в обычном режиме без ключа -debug, точки останова в серверных процедурах срабатывать не будут, хотя на клиенте отладка функционирует штатно.Рассмотрим, какие изменения в типовых конфигурациях приводят к очистке коллекции печатных форм:
Документ.СчетНаОплатуПокупателю в специализированную обработку (например, Обработка.ПечатьСчетаНаОплату) или общий модуль ПечатьТорговыхДокументов. Если вызывается старый менеджер, процедура Печать(...) просто не находит соответствующего обработчика и возвращает пустую коллекцию.Печать модуля менеджера выполняется проверка условия:
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПредварительныйПросмотрПечатнойФормыСчетНаОплату") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ПредварительныйПросмотрПечатнойФормыСчетНаОплату",
"Счет на оплату",
ПечатьТорговыхДокументов.ПечатьПредварительныйПросмотрСчетаНаОплату(ПараметрыПечати.Организация, ОбъектыПечати, "СчетЗаказ")
);
КонецЕсли;
"СчетЗаказ") не совпадает с тем, что проверяет метод НужноПечататьМакет, блок вывода пропускается, и переменная Отказ принимает значение Истина.ВыполнитьКомандуПечатиНаПринтер четвертым параметром передавалось значение Неопределено. Если обновленный метод ожидает структуру параметров (например, свойство ПараметрыПечати.Организация), обращение к свойству значения Неопределено на сервере прерывает выполнение.Разберем, как исправить программный код для надежной работы пакетной печати:
Шаг 1. Проверяем регистрацию команд печати в модуле менеджера. Откроем модуль менеджера документа СчетНаОплатуПокупателю и найдем процедуру ДобавитьКомандыПечати(КомандыПечати). Посмотрим, какой именно МенеджерПечати и Идентификатор зарегистрированы для нужной формы счета.
Шаг 2. Инициализируем структуру параметров. Вместо передачи значения Неопределено передадим корректную структуру параметров печати:
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);
УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер(
"Документ.СчетНаОплатуПокупателю",
"СчетЗаказ",
МассивСчет,
ПараметрыПечати
);
Шаг 3. Альтернативный серверный вариант формирования пакета. Вместо отправки каждого документа отдельным заданием через клиентскую процедуру объединим получение печатных форм на сервере:
// Серверное формирование печатных форм через БСП
ПараметрыПечати = Новый Структура;
ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы(
"Документ.СчетНаОплатуПокупателю",
"СчетЗаказ",
МассивСчет,
ПараметрыПечати
);
Если ПечатныеФормы.КоллекцияПечатныхФорм.Количество() > 0 Тогда
ТабДок = ПечатныеФормы.КоллекцияПечатныхФорм[0].ТабличныйДокумент;
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецЕсли;
Такой подход исключает рассинхронизацию заданий в очереди печати и позволяет перехватывать ошибки формирования документа в блоке Попытка ... Исключение непосредственно в коде конфигурации.