Как реализовать групповую печать документов с использованием стандартных макетов в 1С 8.3

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

Разработка внешних обработок для печати — одна из самых частых задач программиста 1С. Основная сложность заключается не в создании собственного макета, а в использовании уже существующих в конфигурации форм, чтобы не дублировать код и поддерживать актуальность печатных форм (например, при обновлении законодательных форм счетов-фактур). В данной статье мы разберем, как правильно организовать групповую печать, используя механизмы Библиотеки стандартных подсистем (БСП), и решим типичные проблемы с контекстом выполнения и ориентацией страниц.

Основные принципы вызова стандартной печати

В современных конфигурациях 1С, построенных на БСП (УНФ, БП 3.0, УТ 11 и др.), печать управляется через общий модуль УправлениеПечатью. Вместо того чтобы вручную копировать макеты в свою обработку, мы можем обратиться к менеджеру документа или к командам печати. Основной метод для инициирования процесса на клиенте — это УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.

Рассмотрим базовый пример вызова печати для документа «Счет-фактура выданный». Для этого нам понадобится имя команды или макета, а также массив ссылок на объекты.


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

Важный момент: Если конфигурация «закрыта» для изменений, вы всё равно можете обращаться к её экспортным методам. Главное — правильно определить имя объекта и имя печатной формы.

Разбор ошибки «Переменная не определена (УправлениеПечатьюКлиент)»

В процессе разработки многие сталкиваются с ошибкой компиляции: Переменная не определена (УправлениеПечатьюКлиент) (Проверка: Сервер). Давайте проанализируем причину её возникновения. В системе 1С модули имеют разные области видимости:

Если вы пытаетесь вызвать УправлениеПечатьюКлиент внутри процедуры с директивой &НаСервере, система выдаст ошибку. Рассмотрим типичную ситуацию: вы перебираете документы в цикле на сервере, формируете массив и тут же пытаетесь вызвать команду печати. Это в корне неверно. Правильный алгоритм выглядит так:

  1. На сервере собираем массив ссылок на документы, которые нужно напечатать.
  2. Возвращаем этот массив на клиент.
  3. На клиенте вызываем процедуру печати БСП.

&НаКлиенте
Процедура ВыполнитьПечать(Команда)
    // Шаг 1: Получаем список объектов для печати с сервера
    МассивОбъектов = ПолучитьМассивДляПечатиНаСервере();
    
    // Шаг 2: Вызываем клиентский метод печати
    УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
        "Документ.РеализацияТоваровУслуг", 
        "Акт", 
        МассивОбъектов, 
        ЭтаФорма
    );
КонецПроцедуры

Проблема групповой печати: 100 окон на экране

Проанализируем ситуацию, когда нам нужно напечатать сразу много документов. Если вызывать ВыполнитьКомандуПечати в цикле для каждого отдельного документа, система откроет соответствующее количество окон с печатными формами. Если документов 100, работа пользователя будет парализована.

Чтобы избежать этого, необходимо передавать в метод весь массив объектов сразу. Механизм БСП самостоятельно сформирует один общий табличный документ, где каждый объект будет отделен разделителем страниц. Это позволит пользователю увидеть одно окно предпросмотра и отправить всё на принтер одной кнопкой.

Решение проблемы разной ориентации (Портрет и Ландшафт)

Часто возникает задача напечатать комплект: например, «Акт» (портретная ориентация) и «Счет-фактура» (ландшафтная ориентация). В рамках одного объекта ТабличныйДокумент невозможно задать разную ориентацию для разных листов — свойство ОриентацияСтраницы применяется ко всему документу.

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

Рассмотрим, как сформировать такую коллекцию на сервере:


&НаСервере
Функция СформироватьКоллекциюНаСервере(МассивОбъектов)
    // Создаем коллекцию для нескольких видов печатных форм
    КоллекцияПечатныхФорм = УправлениеПечатью.НоваяКоллекцияПечатныхФорм("Акт, СчетФактура");
    
    // Формируем Акт (Портрет)
    ПечатнаяФормаАкт = КоллекцияПечатныхФорм.Найти("Акт", "Имя");
    ПечатнаяФормаАкт.ТабличныйДокумент = СформироватьАкт(МассивОбъектов);
    ПечатнаяФормаАкт.ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
    
    // Формируем Счет-фактуру (Ландшафт)
    ПечатнаяФормаСФ = КоллекцияПечатныхФорм.Найти("СчетФактура", "Имя");
    ПечатнаяФормаСФ.ТабличныйДокумент = СформироватьСФ(МассивОбъектов);
    ПечатнаяФормаСФ.ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    
    Возврат КоллекцияПечатныхФорм;
КонецФункции

После формирования коллекции на сервере, на клиенте достаточно вызвать:


&НаКлиенте
Процедура ПечатьКомплекта(Команда)
    Результат = СформироватьКоллекциюНаСервере(Объект.МассивСсылок);
    УправлениеПечатьюКлиент.ПечатьДокументов(Результат);
КонецПроцедуры

Использование менеджера документа для получения макета

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

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

Резюмируем рекомендации:

  1. Всегда разделяйте логику: сбор ссылок и данных — &НаСервере, вызов визуальных форм — &НаКлиенте.
  2. Используйте КоллекциюПечатныхФорм, если нужно объединить документы с разной ориентацией страницы.
  3. Не используйте метод ПолучитьФорму().Открыть() в цикле для печати, это плохой тон в программировании 1С.
  4. Для работы в безопасном режиме внешних обработок (если вы загружаете их через справочник «Дополнительные отчеты и обработки»), убедитесь, что в профиле безопасности разрешен вызов необходимых общих модулей.

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

← На главную