Как настроить обновление и групповую печать внешней печатной формы УПД в 1С:УНФ?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

При активной работе с документами в 1С:Управление нашей фирмой (УНФ) пользователи часто сталкиваются с неудобством: если внешняя печатная форма универсального передаточного документа (УПД) уже сформирована и окно предпросмотра не закрыто, то при вызове печати для следующего документа открытая форма не обновляется. Кроме того, при выделении нескольких расходных накладных в списке на печать выводится только один (последний) документ. Проанализируем причину такого поведения подсистемы печати и рассмотрим варианты решения этой задачи.

Причины возникновения проблемы

Разберем основные факторы, которые влияют на такое поведение платформы 1С:Предприятие и подсистемы печати:

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

Решение 1. Доработка модуля внешней печатной формы для групповой печати

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

Рассмотрим алгоритм доработки экспортной процедуры в модуле объекта внешней обработки:

  1. В процедуре Печать организуем цикл обхода по входящему параметру МассивОбъектов.
  2. Для каждого документа из массива формируем соответствующий макет.
  3. Перед выводом каждого последующего документа (начиная со второго) вставляем горизонтальный разделитель страниц с помощью метода ВывестиГоризонтальныйРазделительСтраниц().

Рассмотрим пример кода обработки массива объектов:


Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.АвтоМасштаб = Истина;
    
    ПервыйДокумент = Истина;

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

    // Заполнение коллекции печатных форм для БСП
    ПечатнаяФорма = УправлениеПечатью.СформироватьПечатнуюФорму(
        КоллекцияПечатныхФорм, 
        "УПД", 
        "УПД (Внешний)", 
        ТабличныйДокумент
    );

    Возврат ТабличныйДокумент;

КонецФункции

После внедрения данного решения пользователь сможет выделить 10–20 документов в журнале «Расходные накладные» и нажать кнопку печати. В одном окне появится единый табличный документ со всеми накладными, разделенными по страницам.

Решение 2. Передача уникального ключа уникальности при открытии формы

Если печатная форма вызывается из собственного алгоритма или из формы обработки, мы можем принудительно заставить платформу 1С открывать новое окно печати при каждом вызове. Для этого при вызове метода ОткрытьФорму необходимо передавать уникальный идентификатор в качестве параметра КлючУникальности.

Посмотрим на пример вызова формы печати:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ИсточникДанных", ИмяОбъекта);
ПараметрыОткрытия.Вставить("ПараметрыПечати", ПараметрыПечати);

// Передаем новый УникальныйИдентификатор в качестве ключа уникальности
УникальныйКлюч = Новый УникальныйИдентификатор;

ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ВладелецФормы, УникальныйКлюч);

При таком подходе платформа не будет активизировать старое окно предпросмотра, а откроет новое отдельное окно для каждого печатаемого документа.

Решение 3. Автоматическое закрытие формы предпросмотра после отправки на печать

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

Для этого в обработчике команды печати на клиенте добавляем вызов метода закрытия текущей формы:


&НаКлиенте
Процедура КомандаПечать(Команда)
    
    // Выполняем формирование и печать табличного документа
    СформироватьИНапечататьДокумент();
    
    // Закрываем форму предпросмотра, чтобы при следующем вызове открывалась новая
    ЭтаФорма.Закрыть();
    
КонецПроцедуры

Решение 4. Прямая печать без вывода окна предпросмотра

В случаях, когда просмотр печатной формы перед отправкой на принтер не требуется, выгодно настроить прямую печать. Метод Печать() объекта ТабличныйДокумент отправляет сформированный макет непосредственно на системный принтер по умолчанию.


// Прямая печать без вывода формы на экран
ТабличныйДокумент.Печать(РежимПечатиТабличногоДокумента.Авто);

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

← На главную