Переход с устаревших конфигураций «1С:Предприятие» версии 2.0 на современные управляемые приложения версии 3.0 (например, «Бухгалтерия предприятия, редакция 3.0») принес разработчикам множество архитектурных изменений. Одним из наиболее заметных новшеств стал полный отказ от использования старого общего модуля УниверсальныеМеханизмы и его популярного метода УниверсальныеМеханизмы.НапечататьДокументПоУмолчанию().
В этой статье мы подробно разберем, как устроена современная объектно-ориентированная подсистема «Печать» из состава Библиотеки стандартных подсистем (БСП), которая пришла на замену старым методам. Мы научимся программно отправлять документы на принтер, выводить их на экран для предварительного просмотра, а также генерировать табличные документы на сервере для последующего сохранения в PDF или отправки по электронной почте.
В версиях конфигураций на обычных формах (1С 8.2 и более ранних) клиентская и серверная логика часто были тесно переплетены. Метод УниверсальныеМеханизмы.НапечататьДокументПоУмолчанию(Объект, КолЭкземпляров, НаПринтер) позволял одной строкой кода отправить документ на печать. Он самостоятельно определял макет по умолчанию, получал настройки принтера пользователя и отправлял задание в очередь операционной системы.
В управляемом приложении «1С:Предприятие 8.3» действует строгое разделение на клиентский и серверный контексты. Интерактивные действия (вывод формы на экран, отправка на физический принтер) могут выполняться только на клиенте, в то время как выборка данных и формирование самого макета происходят исключительно на сервере. Именно поэтому подсистема «Печать» БСП построена на взаимодействии клиентских и серверных общих модулей. Вызвать «универсальный метод» в одну строчку без учета контекста выполнения теперь невозможно.
Давайте подробно проанализируем различные сценарии программной работы с печатью в БП 3.0.
---
Если перед вами стоит задача открыть стандартную форму предпросмотра БСП со списком сформированных документов (как если бы пользователь нажал кнопку «Печать» в форме списка или документа), необходимо использовать клиентский метод общего модуля УправлениеПечатьюКлиент.
Рассмотрим по шагам пример кода, который формирует массив документов и выводит их печатные формы на экран:
// Код выполняется на клиенте (в модуле формы или команды)
&НаКлиенте
Процедура НапечататьДокументыНаЭкран()
// Шаг 1. Формируем массив ссылок на документы, которые нужно напечатать
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(Объект.Ссылка); // Например, текущий документ на форме
// Шаг 2. Задаем параметры печати (при необходимости)
ПараметрыПечати = Новый Структура;
// Шаг 3. Вызываем команду вывода формы предварительного просмотра
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
"Документ.РеализацияТоваровУслуг", // Имя менеджера объекта печати
"Накладная", // Идентификатор макета печатной формы
МассивДокументов, // Массив объектов (один или несколько)
ЭтотОбъект, // Владелец формы (откуда вызываем печать)
ПараметрыПечати // Дополнительные параметры
);
КонецПроцедуры
В данном примере метод ВыполнитьКомандуПечати берет на себя всю рутину по передаче данных на сервер, генерации табличного документа и открытию специализированной формы БСП ПечатьДокументов.
---
Если вашей целью является быстрая отправка пакета документов на принтер «в один клик» (что полностью соответствует старому параметру НаПринтер = Истина), БСП предоставляет аналогичную клиентскую процедуру. Она формирует документы в фоновом режиме и сразу отправляет их на принтер, установленный в операционной системе по умолчанию.
Разберем пример реализации такой задачи:
&НаКлиенте
Процедура ОтправитьНаПринтерНапрямую()
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(СсылкаНаДокумент1);
МассивДокументов.Добавить(СсылкаНаДокумент2);
ПараметрыПечати = Новый Структура;
// Можно указать количество копий
ПараметрыПечати.Вставить("КоличествоЭкземпляров", 1);
// Отправка напрямую в очередь печати операционной системы
УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер(
"Документ.РеализацияТоваровУслуг",
"Накладная",
МассивДокументов,
ПараметрыПечати
);
КонецПроцедуры
Использование метода ВыполнитьКомандуПечатиНаПринтер позволяет автоматизировать массовую печать документов при проведении или закрытии смены, минимизируя лишние действия пользователя.
---
Очень часто перед разработчиком стоит задача не вывести макет на экран или принтер, а перехватить сам объект ТабличныйДокумент на сервере. Это требуется для широкого спектра задач: автоматическое сохранение накладных в формате PDF, архивирование счетов во внешних папках или отправка реестров по электронной почте.
Для решения этой задачи мы должны использовать серверный метод УправлениеПечатью.СформироватьПечатныеФормы. Проанализируем пример кода на сервере:
&НаСервере
Процедура СформироватьИСохранитьПечатнуюФорму()
// Шаг 1. Подготовка параметров
ИмяМенеджераПечати = "Документ.РеализацияТоваровУслуг";
ИменаМакетов = "Накладная"; // Идентификатор макета из модуля менеджера
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(Объект.Ссылка);
ПараметрыПечати = Новый Структура;
КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Новый Структура;
// Шаг 2. Вызов серверного метода БСП для формирования коллекции
РезультатПечати = УправлениеПечатью.СформироватьПечатныеФормы(
ИмяМенеджераПечати,
ИменаМакетов,
МассивДокументов,
ПараметрыПечати,
КоллекцияПечатныхФорм,
ОбъектыПечати,
ПараметрыВывода
);
// Шаг 3. Извлечение табличного документа из коллекции
// БСП возвращает структуру, содержащую таблицу КоллекцияПечатныхФорм
Если РезультатПечати.КоллекцияПечатныхФорм.Количество() > 0 Тогда
СтрокаКоллекции = РезультатПечати.КоллекцияПечатныхФорм[0];
ТабДок = СтрокаКоллекции.ТабличныйДокумент;
// Шаг 4. Работа с полученным табличным документом
ПутьКФайлу = "C:\Temp\Накладная_" + Строка(Объект.Номер) + ".pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;
КонецПроцедуры
Этот подход гарантирует стабильную работу, поскольку использует стандартные алгоритмы конфигурации, описанные в модулях менеджеров соответствующих документов.
---
При использовании подсистемы «Печать» БСП в «Бухгалтерии предприятия 3.0» необходимо учитывать несколько важных технических особенностей:
В Бухгалтерии 3.0 факсимиле (подписи руководителя, главного бухгалтера и оттиск печати) накладывается на табличный документ интерактивно, в момент открытия формы предварительного просмотра. Если вы формируете табличный документ чисто программно на сервере с помощью СформироватьПечатныеФормы(), факсимиле на него по умолчанию наложено не будет. Чтобы управлять выводом подписей и печатей, используйте специальное заполнение параметров с помощью общего модуля конфигурации:
ОбщегоНазначенияБП.ЗаполнитьДополнительныеПараметрыПечати(
МассивОбъектов,
КоллекцияПечатныхФорм,
ОбъектыПечати,
ПараметрыПечати
);
БСП позволяет легко формировать единый пакет из разных документов. Например, вы можете передать в параметр ИменаМакетов строку с идентификаторами через запятую ("Накладная,СчетФактура,УПД"). Система автоматически обработает этот запрос и вернет коллекцию, содержащую все запрошенные печатные формы.
Если печатная форма зарегистрирована в информационной базе как дополнительный отчет или обработка, напрямую обратиться к менеджеру документа не получится. Для программной печати внешних обработок следует использовать механизмы справочника ДополнительныеОтчетыИОбработки, обращаясь к методу ПолучитьОбъект() внешней обработки и вызывая её экспортный метод формирования печатной формы.
Таким образом, несмотря на то, что новая подсистема печати в 1С 8.3 на первый взгляд кажется более сложной и громоздкой по сравнению со старыми «Универсальными механизмами», она предоставляет разработчикам гораздо более гибкие, надежные и масштабируемые инструменты для реализации задач любой сложности.