Разработка внешних обработок для печати — одна из самых частых задач программиста 1С. Основная сложность заключается не в создании собственного макета, а в использовании уже существующих в конфигурации форм, чтобы не дублировать код и поддерживать актуальность печатных форм (например, при обновлении законодательных форм счетов-фактур). В данной статье мы разберем, как правильно организовать групповую печать, используя механизмы Библиотеки стандартных подсистем (БСП), и решим типичные проблемы с контекстом выполнения и ориентацией страниц.
В современных конфигурациях 1С, построенных на БСП (УНФ, БП 3.0, УТ 11 и др.), печать управляется через общий модуль УправлениеПечатью. Вместо того чтобы вручную копировать макеты в свою обработку, мы можем обратиться к менеджеру документа или к командам печати. Основной метод для инициирования процесса на клиенте — это УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.
Рассмотрим базовый пример вызова печати для документа «Счет-фактура выданный». Для этого нам понадобится имя команды или макета, а также массив ссылок на объекты.
// Пример вызова печати из модуля формы обработки
&НаКлиенте
Процедура ПечатьСчетФактур(МассивОбъектов)
ИмяМакета = "ПФ_MXL_СчетФактура981"; // Техническое имя макета в конфигурации
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
"Документ.СчетФактураВыданный",
ИмяМакета,
МассивОбъектов,
ЭтаФорма,
Неопределено
);
КонецПроцедуры
Важный момент: Если конфигурация «закрыта» для изменений, вы всё равно можете обращаться к её экспортным методам. Главное — правильно определить имя объекта и имя печатной формы.
В процессе разработки многие сталкиваются с ошибкой компиляции: Переменная не определена (УправлениеПечатьюКлиент) (Проверка: Сервер). Давайте проанализируем причину её возникновения. В системе 1С модули имеют разные области видимости:
УправлениеПечатьюКлиент) доступны только в коде, который выполняется на стороне пользователя (директива &НаКлиенте).УправлениеПечатью) доступны только на сервере.Если вы пытаетесь вызвать УправлениеПечатьюКлиент внутри процедуры с директивой &НаСервере, система выдаст ошибку. Рассмотрим типичную ситуацию: вы перебираете документы в цикле на сервере, формируете массив и тут же пытаетесь вызвать команду печати. Это в корне неверно. Правильный алгоритм выглядит так:
&НаКлиенте
Процедура ВыполнитьПечать(Команда)
// Шаг 1: Получаем список объектов для печати с сервера
МассивОбъектов = ПолучитьМассивДляПечатиНаСервере();
// Шаг 2: Вызываем клиентский метод печати
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
"Документ.РеализацияТоваровУслуг",
"Акт",
МассивОбъектов,
ЭтаФорма
);
КонецПроцедуры
Проанализируем ситуацию, когда нам нужно напечатать сразу много документов. Если вызывать ВыполнитьКомандуПечати в цикле для каждого отдельного документа, система откроет соответствующее количество окон с печатными формами. Если документов 100, работа пользователя будет парализована.
Чтобы избежать этого, необходимо передавать в метод весь массив объектов сразу. Механизм БСП самостоятельно сформирует один общий табличный документ, где каждый объект будет отделен разделителем страниц. Это позволит пользователю увидеть одно окно предпросмотра и отправить всё на принтер одной кнопкой.
Часто возникает задача напечатать комплект: например, «Акт» (портретная ориентация) и «Счет-фактура» (ландшафтная ориентация). В рамках одного объекта ТабличныйДокумент невозможно задать разную ориентацию для разных листов — свойство ОриентацияСтраницы применяется ко всему документу.
Для решения этой задачи в БСП используется механизм Коллекции печатных форм. Мы создаем коллекцию, в которую добавляем разные табличные документы. Процедура УправлениеПечатьюКлиент.ПечатьДокументов умеет работать с такой коллекцией и выводит их в единое окно печати, сохраняя индивидуальные настройки принтера для каждого макета.
Рассмотрим, как сформировать такую коллекцию на сервере:
&НаСервере
Функция СформироватьКоллекциюНаСервере(МассивОбъектов)
// Создаем коллекцию для нескольких видов печатных форм
КоллекцияПечатныхФорм = УправлениеПечатью.НоваяКоллекцияПечатныхФорм("Акт, СчетФактура");
// Формируем Акт (Портрет)
ПечатнаяФормаАкт = КоллекцияПечатныхФорм.Найти("Акт", "Имя");
ПечатнаяФормаАкт.ТабличныйДокумент = СформироватьАкт(МассивОбъектов);
ПечатнаяФормаАкт.ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
// Формируем Счет-фактуру (Ландшафт)
ПечатнаяФормаСФ = КоллекцияПечатныхФорм.Найти("СчетФактура", "Имя");
ПечатнаяФормаСФ.ТабличныйДокумент = СформироватьСФ(МассивОбъектов);
ПечатнаяФормаСФ.ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Возврат КоллекцияПечатныхФорм;
КонецФункции
После формирования коллекции на сервере, на клиенте достаточно вызвать:
&НаКлиенте
Процедура ПечатьКомплекта(Команда)
Результат = СформироватьКоллекциюНаСервере(Объект.МассивСсылок);
УправлениеПечатьюКлиент.ПечатьДокументов(Результат);
КонецПроцедуры
Чтобы окончательно отказаться от копирования кода, мы можем программно вызвать процедуру Печать из менеджера документа конфигурации. Большинство типовых документов имеют экспортную процедуру Печать в своем модуле менеджера.
Выглядит это следующим образом: мы подготавливаем структуру параметров и пустую коллекцию, передаем их в менеджер документа, и он сам заполняет ТабличныйДокумент стандартными данными. Это самый надежный способ, так как при изменении логики формирования (например, расчет НДС) ваша внешняя обработка автоматически подхватит эти изменения.
Резюмируем рекомендации:
&НаСервере, вызов визуальных форм — &НаКлиенте.КоллекциюПечатныхФорм, если нужно объединить документы с разной ориентацией страницы.ПолучитьФорму().Открыть() в цикле для печати, это плохой тон в программировании 1С.Используя данные методы, вы сможете создавать профессиональные инструменты для групповой обработки документов, которые будут стабильно работать даже после обновлений конфигурации.