При разработке новых документов в конфигурациях на платформе 1С:Предприятие 8.3 часто возникает задача добавить кнопку печати на форму. В типовых конфигурациях, построенных на базе Библиотеки Стандартных Подсистем (БСП), механизм печати реализован через специализированные модули и подсистемы. Разберем подробнее, как корректно настроить вывод команд печати и написать необходимый программный код.
В типовых решениях кнопки печати формируются динамически. Для того чтобы подсистема БСП распознала печатные формы нового документа и отобразила соответствующую кнопку в командной панели формы, необходимо выполнить настройку в модуле менеджера и подсистеме БСП.
Рассмотрим по шагам, какие экспортные процедуры необходимо добавить в модуль менеджера нового документа.
Шаг 1. Определение команд печати
В модуле менеджера объекта создается процедура ДобавитьКомандыПечати. Она регистрирует состав доступных печатных форм для документа.
// Заполняет список команд печати.
//
// Параметры:
// КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ПеремещениеПечать";
КомандаПечати.Представление = НСтр("ru = 'Перемещение товаров'");
КомандаПечати.Обработчик = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";
КонецПроцедуры
Шаг 2. Формирование печатных форм
Далее в модуле менеджера описывается экспортная процедура Печать, которая вызывается подсистемой при нажатии кнопки пользователем. В ней проверяется, какая именно форма запрошена, и вызывается функция формирования табличного документа.
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем, нужно ли для макета формировать табличный документ
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПеремещениеПечать") Тогда
// Формируем табличный документ и добавляем его в коллекцию печатных форм
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ПеремещениеПечать",
"Перемещение товаров",
ПечатьПеремещениеТоваров(МассивОбъектов, ОбъектыПечати), ,
"Документ.ПеремещениеТовараСоСклада.Печать"
);
КонецЕсли;
ОбщегоНазначенияБП.ЗаполнитьДополнительныеПараметрыПечати(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры
Шаг 3. Функция генерации табличного документа
Непосредственное заполнение макета данными из базы осуществляется локальной функцией. Проанализируем пример получения данных с помощью запроса и вывода их в табличный документ:
Функция ПечатьПеремещениеТоваров(МассивОбъектов, ОбъектыПечати)
УстановитьПривилегированныйРежим(Истина);
ТекстЗапроса =
"ВЫБРАТЬ
| ПеремещениеТовараСоСклада.Ссылка КАК Ссылка,
| ПеремещениеТовараСоСклада.Дата КАК Дата,
| ПеремещениеТовараСоСклада.СкладОтправитель,
| ПеремещениеТовараСоСклада.СкладПолучатель,
| ПеремещениеТовараСоСклада.Ответственный,
| ПеремещениеТовараСоСклада.Товары.(
| Номенклатура,
| Количество
| )
|ИЗ
| Документ.ПеремещениеТовараСоСклада КАК ПеремещениеТовараСоСклада
|ГДЕ
| ПеремещениеТовараСоСклада.Ссылка В(&МассивОбъектов)";
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Запрос.Текст = ТекстЗапроса;
Шапка = Запрос.Выполнить().Выбрать();
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.ПеремещениеТовараСоСклада.Печать");
ПервыйДокумент = Истина;
Пока Шапка.Следующий() Цикл
ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
Если Не ПервыйДокумент Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПервыйДокумент = Ложь;
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
// Заполняем секции макета
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ТабличныйДокумент.Вывести(ОбластьЗаголовок);
ОбластьТовары = Макет.ПолучитьОбласть("Товары");
Ном = 0;
Пока ВыборкаСтрокТовары.Следующий() Цикл
Ном = Ном + 1;
ОбластьТовары.Параметры.Заполнить(ВыборкаСтрокТовары);
ОбластьТовары.Параметры.НомерСтроки = Ном;
ТабличныйДокумент.Вывести(ОбластьТовары);
КонецЦикла;
// Задаем область печати для корректной покомплектной печати
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент,
НомерСтрокиНачало, ОбъектыПечати, Шапка.Ссылка);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
Почему кнопка может не появиться автоматически?
Даже если код в модуле менеджера написан верно, кнопка печати БСП может не выводиться на форме. Чтобы вызов команды заработал, проанализируем необходимые условия:
УправлениеПечатьюПереопределяемый в процедуре ПриОпределенииОбъектовСКомандамиПечати необходимо добавить строку: СписокОбъектов.Добавить(Документы.МойНовыйДокумент);.ПриСозданииНаСервере должен присутствовать вызов инициализации подключаемых команд: ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);.ПодменюПечать).Если конфигурация разрабатывается с нуля или не требуется сложный механизм БСП (с отправкой по почте, сохранением в PDF и пакетной печатью), можно создать кнопку вручную через команду формы.
Рассмотрим по шагам этот простой способ:
КомандаПечать) и перетащим ее в командную панель формы.Пример кода модуля формы для ручного вызова печатной формы:
&НаКлиенте
Процедура КомандаПечать(Команда)
ТабДок = СформироватьПечатнуюФормуНаСервере();
ТабДок.Показать("Печать документа");
КонецПроцедуры
&НаСервере
Функция СформироватьПечатнуюФормуНаСервере()
ТабличныйДокумент = Новый ТабличныйДокумент;
Макет = Документы.МойНовыйДокумент.ПолучитьМакет("Печать");
// Заполнение макета данными объекта (Объект.Ссылка)
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Номер = Объект.Номер;
ОбластьШапка.Параметры.Дата = Объект.Дата;
ТабличныйДокумент.Вывести(ОбластьШапка);
Возврат ТабличныйДокумент;
КонецФункции
Выяснив разницу между подходами, вы можете выбрать наиболее подходящий: стандартный механизм БСП обеспечит полный функционал типовых решений, а ручное создание команды формы отлично подойдет для простых задач и пользовательских конфигураций.