Как исправить ошибку «При формировании печатной формы возникла ошибка» при пакетной печати в 1С?

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

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

Анализ механизма формирования ошибки в БСП

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


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

Проанализируем, как работает общий модуль УправлениеПечатью на стороне сервера. В типовой подсистеме при формировании макетов выполняется следующий алгоритм проверки сформированного результата:


Отказ = ВременнаяКоллекцияДляОднойПечатнойФормы.Количество() = 0;
Для Каждого ВременнаяПечатнаяФорма Из ВременнаяКоллекцияДляОднойПечатнойФормы Цикл 
    Если ВременнаяПечатнаяФорма.ТабличныйДокумент <> Неопределено Тогда
        ПечатнаяФорма = КоллекцияПечатныхФорм.Добавить();
        ЗаполнитьЗначенияСвойств(ПечатнаяФорма, ВременнаяПечатнаяФорма);
        Если ВременнаяКоллекцияДляОднойПечатнойФормы.Количество() = 1 Тогда
            ПечатнаяФорма.ИмяМакета = ИмяМакета;
            ПечатнаяФорма.ИмяВРЕГ = ВРег(ИмяМакета);
        КонецЕсли;
    Иначе
        Отказ = Истина;
    КонецЕсли;
КонецЦикла;

Если Отказ Тогда
    ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
        "ru = 'При формировании печатной формы ""%1"" возникла ошибка. Обратитесь к администратору.'"), ИмяМакета);
    ВызватьИсключение ТекстСообщенияОбОшибке;
КонецЕсли;

Исключение выбрасывается в двух случаях: либо коллекция печатных форм осталась совершенно пустой (Количество() = 0), либо в процессе формирования свойство ТабличныйДокумент не было инициализировано (осталось равным Неопределено).

Почему не срабатывают точки останова при отладке

Если при попытке пошаговой отладки конфигуратор не останавливается в общем модуле УправлениеПечатью или модуле менеджера документа, выясним причину такого поведения:

  1. Отключена отладка на сервере 1С: Формирование табличных документов выполняется на стороне сервера. Если служба ragent запущена в обычном режиме без ключа -debug, точки останова в серверных процедурах срабатывать не будут, хотя на клиенте отладка функционирует штатно.
  2. Тестирование в файловой базе: Чтобы быстро локализовать проблему без перезапуска рабочего сервера 1С:Предприятия, создадим копию базы в файловом режиме. В файловой базе все вызовы выполняются в рамках одного клиентского процесса с полным доступом к отладчику.
  3. Анализ системного журнала регистрации: Если перезапуск сервера невозможен, откроем Журнал регистрации с отбором по уровню «Ошибка». В типовых конфигурациях многие внутренние исключения сервера логируются до вызова финального исключения БСП.

Основные причины ошибки после обновления конфигурации

Рассмотрим, какие изменения в типовых конфигурациях приводят к очистке коллекции печатных форм:

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

Способы исправления и рекомендации

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

Шаг 1. Проверяем регистрацию команд печати в модуле менеджера. Откроем модуль менеджера документа СчетНаОплатуПокупателю и найдем процедуру ДобавитьКомандыПечати(КомандыПечати). Посмотрим, какой именно МенеджерПечати и Идентификатор зарегистрированы для нужной формы счета.

Шаг 2. Инициализируем структуру параметров. Вместо передачи значения Неопределено передадим корректную структуру параметров печати:


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

УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер(
    "Документ.СчетНаОплатуПокупателю", 
    "СчетЗаказ", 
    МассивСчет, 
    ПараметрыПечати
);

Шаг 3. Альтернативный серверный вариант формирования пакета. Вместо отправки каждого документа отдельным заданием через клиентскую процедуру объединим получение печатных форм на сервере:


// Серверное формирование печатных форм через БСП
ПараметрыПечати = Новый Структура;
ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы(
    "Документ.СчетНаОплатуПокупателю",
    "СчетЗаказ",
    МассивСчет,
    ПараметрыПечати
);

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

Такой подход исключает рассинхронизацию заданий в очереди печати и позволяет перехватывать ошибки формирования документа в блоке Попытка ... Исключение непосредственно в коде конфигурации.

← На главную