Как создать кнопку печати и вызов печатных форм в новом документе 1С?

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

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

Вариант 1. Интеграция с подсистемой печати БСП

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

Рассмотрим по шагам, какие экспортные процедуры необходимо добавить в модуль менеджера нового документа.

Шаг 1. Определение команд печати

В модуле менеджера объекта создается процедура ДобавитьКомандыПечати. Она регистрирует состав доступных печатных форм для документа.


// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "ПеремещениеПечать";
    КомандаПечати.Представление = НСтр("ru = 'Перемещение товаров'");
    КомандаПечати.Обработчик    = "УправлениеПечатьюБПКлиент.ВыполнитьКомандуПечати";
    
КонецПроцедуры

Шаг 2. Формирование печатных форм

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


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

Шаг 3. Функция генерации табличного документа

Непосредственное заполнение макета данными из базы осуществляется локальной функцией. Проанализируем пример получения данных с помощью запроса и вывода их в табличный документ:


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

Почему кнопка может не появиться автоматически?

Даже если код в модуле менеджера написан верно, кнопка печати БСП может не выводиться на форме. Чтобы вызов команды заработал, проанализируем необходимые условия:

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

Вариант 2. Создание прямой кнопки печати без БСП

Если конфигурация разрабатывается с нуля или не требуется сложный механизм БСП (с отправкой по почте, сохранением в PDF и пакетной печатью), можно создать кнопку вручную через команду формы.

Рассмотрим по шагам этот простой способ:

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

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


&НаКлиенте
Процедура КомандаПечать(Команда)
    ТабДок = СформироватьПечатнуюФормуНаСервере();
    ТабДок.Показать("Печать документа");
КонецПроцедуры

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

Выяснив разницу между подходами, вы можете выбрать наиболее подходящий: стандартный механизм БСП обеспечит полный функционал типовых решений, а ручное создание команды формы отлично подойдет для простых задач и пользовательских конфигураций.

← На главную