Как исключить внешнюю печатную форму из комплекта документов в 1С ЗУП 3.1, если она вызывает ошибку?

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

При работе с 1С ЗУП 3.1 пользователи часто сталкиваются с ситуацией, когда внешние печатные формы (ВПФ), разработанные для печати отдельных документов, автоматически подхватываются при формировании комплекта документов. Это может приводить к ошибкам, если ВПФ не адаптирована для пакетной печати, что блокирует весь процесс формирования комплекта. Рассмотрим эту проблему подробно и выясним, как можно «отцепить» такую ВПФ от комплекта документов, при этом сохранив ее работоспособность для индивидуальной печати.

Выясняем причину автоматического включения ВПФ в комплект документов

Основная причина, по которой внешние печатные формы автоматически включаются в комплект документов, кроется в логике работы конфигурации. В модуле менеджера документа (например, для документа "Увольнение") существует специальное свойство, которое управляет этим поведением. Обычно это свойство называется ДополнитьКомплектВнешнимиПечатнымиФормами. Если оно установлено в значение Истина, то система автоматически пытается включить все зарегистрированные для данного документа внешние печатные формы в список доступных для печати в комплекте.

Мы обнаруживаем, что это свойство, установленное в Истина, сообщает системе, что комплект документов должен быть дополнен внешними печатными формами. Например, для документа "Увольнение" это может выглядеть следующим образом в модуле менеджера:


Процедура ПриОпределенииКомандПечати(КомандыПечати) Экспорт
    // ...
    КомандыПечати.ДополнитьКомплектВнешнимиПечатнымиФормами = Истина;
    // ...
КонецПроцедуры

Именно из-за этого механизма ВПФ, даже если они не предназначены для пакетной печати, попадают в комплект и могут вызывать ошибки, если их код не готов к такому сценарию.

Варианты решения проблемы

Для решения этой проблемы существует несколько подходов, каждый из которых имеет свои преимущества и ограничения. Мы разберем их по очереди, начиная с самых простых и заканчивая наиболее надежными, но требующими доработки.

1. Ручное исключение ВПФ из комплекта документов (временное решение)

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

  1. Перейдем к документу, для которого формируется комплект.
  2. Нажмем кнопку "Печать".
  3. Выберем пункт "Печать комплекта документов с настройкой".
  4. В открывшемся диалоговом окне будут представлены все доступные печатные формы для этого комплекта, включая внешние.
  5. Найдем проблемную ВПФ и снимем с нее флажок.
  6. После этого продолжим печать. Проблемная форма не будет включена в текущий комплект.

Важное ограничение: Этот метод работает только в том случае, если ошибка возникает не на самом раннем этапе, то есть до того, как система успеет отобразить диалоговое окно настроек комплекта печати. Если ошибка блокирует открытие этого диалога, данный способ нам не поможет. Кроме того, это ручное действие, которое придется выполнять каждый раз, когда вы печатаете комплект документов, что не всегда удобно, особенно если проблемных форм много.

2. Изменение логики включения ВПФ через расширение (для продвинутых пользователей)

Для более системного подхода, если ручное отключение невозможно или нецелесообразно, мы можем использовать расширение конфигурации. Этот метод позволяет изменить стандартное поведение программы без снятия ее с поддержки.

Суть подхода заключается в изменении значения свойства ДополнитьКомплектВнешнимиПечатнымиФормами с Истина на Ложь в модуле менеджера нужного документа. Для этого:

  1. Создадим новое расширение конфигурации.
  2. В расширение добавим объект "Модуль менеджера" для того документа, который вызывает проблемы (например, "Увольнение").
  3. В этом модуле переопределим процедуру ПриОпределенииКомандПечати.
  4. Изменим значение свойства ДополнитьКомплектВнешнимиПечатнымиФормами.

Вот гипотетический пример кода, который мы могли бы добавить в модуль менеджера документа "Увольнение" в расширении:


#Область ПрограммныйИнтерфейс

Процедура ПриОпределенииКомандПечати(КомандыПечати) Экспорт
    // Вызываем оригинальную процедуру, если это необходимо,
    // или полностью переопределяем логику.
    // Пример вызова оригинальной процедуры (если она есть и нужна):
    // СтандартныеПодсистемы.УправлениеПечатью.ПриОпределенииКомандПечати(КомандыПечати, ЭтотОбъект);

    // Главное изменение: запрещаем автоматическое дополнение комплекта ВПФ
    КомандыПечати.ДополнитьКомплектВнешнимиПечатнымиФормами = Ложь;

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

КонецПроцедуры

#КонецОбласти

Важное ограничение: Этот подход влияет на все внешние печатные формы для данного документа. Если у вас есть другие ВПФ, которые должны быть включены в комплект и корректно в нем работают, они также будут исключены. В этом случае придется вручную добавлять их в список команд печати, как показано в закомментированном примере, что усложняет расширение.

3. Комплексная доработка кода внешней печатной формы (наиболее надежный способ)

Наиболее правильным и надежным решением, которое устраняет саму причину ошибок и дает максимальную гибкость, является доработка кода проблемной внешней печатной формы. Это требует навыков программирования на 1С, но гарантирует корректную работу ВПФ как при индивидуальной, так и при пакетной печати.

Типовые причины ошибок ВПФ при печати комплектов

Прежде чем приступать к доработке, мы должны понять, почему ВПФ выдает ошибки в комплекте. Часто это связано со следующими моментами:

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

Подробный разбор доработки процедуры Печать:

Основная задача — адаптировать экспортную процедуру Печать в модуле объекта внешней печатной формы таким образом, чтобы она корректно обрабатывала как одиночный документ, так и массив документов. Для этого мы можем использовать проверку типа переданного параметра.


// В модуле объекта внешней печатной формы

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

// Вспомогательная процедура для формирования печатной формы одного документа
Процедура ОбработатьОдинДокумент(СсылкаНаДокумент, ОбъектыПечати, ПараметрыВывода)
    // Здесь размещаем весь основной код формирования печатной формы для одного документа
    // Например:
    Макет = ПолучитьМакет("МакетПечатнойФормы"); // Получаем наш макет

    ТабличныйДокумент = Новый ТабличныйДокумент;
    // ... Заполняем ТабличныйДокумент данными из СсылкаНаДокумент ...

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

    // Добавляем сформированный табличный документ в коллекцию для печати
    ОбъектыПечати.Добавить(ТабличныйДокумент);
КонецПроцедуры

Дополнительные рекомендации по адаптации ВПФ:

  1. Проверка прав доступа: Убедитесь, что код ВПФ не содержит жестко закодированных проверок прав или ролей, которые могут отличаться при выполнении в контексте пакетной печати.
  2. Оптимизация запросов: Если ВПФ выполняет тяжелые запросы к базе данных, оптимизируйте их, чтобы они работали эффективно при обработке множества документов. Избегайте повторяющихся запросов внутри цикла.
  3. Использование универсальных механизмов: Применяйте стандартные функции и общие модули конфигурации 1С для работы с данными, а не прямой доступ к регистрам, если это возможно. Это повышает стабильность и совместимость ВПФ с будущими обновлениями.

4. Использование отладчика для диагностики

Если мы сталкиваемся с ошибками, и неясно, что именно их вызывает, самым эффективным инструментом будет отладчик. Он позволяет пошагово проанализировать выполнение кода ВПФ в режиме печати комплекта документов.

  1. Запустим 1С в режиме отладки.
  2. Установим точки останова в ключевых местах кода нашей ВПФ, особенно в процедуре Печать и в местах, где происходит работа с переданными параметрами.
  3. Попытаемся напечатать комплект документов.
  4. Когда выполнение кода дойдет до точки останова, мы сможем проанализировать значения переменных, такие как МассивОбъектов, и увидеть, какие функции вызываются и где именно происходит ошибка.

Это позволит нам точно определить проблемное место и скорректировать код ВПФ для корректной обработки пакетной печати.

Итоги и перспективы

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

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

Таким образом, мы видим, что решение проблемы "отцепления" ВПФ от комплекта документов может быть многогранным. Начиная от простых ручных действий и заканчивая глубокой доработкой кода ВПФ, каждый из подходов направлен на обеспечение стабильной и безошибочной работы системы при печати документов.

← На главную