Как добавить печать и настроить автоматическую подстановку получателей почты для автономной обработки?

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

При разработке на платформе 1С:Предприятие 8.3 с использованием Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с ситуацией, когда необходимо реализовать печатные формы для объекта, который не является документом или справочником. Например, это может быть сложная обработка-журнал, которая аккумулирует данные из разных регистров сведений. Основная сложность здесь заключается в том, что стандартный механизм печати БСП «ожидает» ссылку на объект (документ или справочник), а в обработке её зачастую нет.

В данной статье мы подробно разберем, как подключить стандартные команды печати к такой обработке и как программно заполнить список получателей (Email), чтобы при нажатии кнопки «Отправить по почте» пользователю не приходилось вводить адреса вручную.

Регистрация команд печати для объектов без ссылок

Рассмотрим ситуацию: у нас есть обработка, которая не имеет ссылочного типа в базе данных, но нам нужно, чтобы в её командной панели появилась кнопка «Печать». Для этого нам необходимо задействовать механизм подключаемых команд БСП. Проанализируем, как это сделать правильно.

Во-первых, нам нужно обратиться к общему модулю УправлениеПечатьюПереопределяемый. В нем существует процедура ПередДобавлениемКомандПечати. Именно здесь мы можем принудительно «подсказать» системе, что для нашей формы существуют определенные команды печати.

Посмотрим на пример кода, который необходимо разместить в модуле УправлениеПечатьюПереопределяемый:


Процедура ПередДобавлениемКомандПечати(ИмяФормы, КомандыПечати, СтандартнаяОбработка) Экспорт
    Если ИмяФормы = "Обработка.МояАвтономнаяОбработка.Форма.Форма" Тогда 
        // Вызываем метод добавления команд из менеджера нашей обработки
        Обработки.МояАвтономнаяОбработка.ДобавитьКомандыПечати(КомандыПечати);
    КонецЕсли;
КонецПроцедуры

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


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

Инициализация команд в форме обработки

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


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

Реализация печати и программная подстановка Email

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

Разберем структуру этой процедуры. Когда пользователь нажимает кнопку печати, система вызывает экспортную процедуру в менеджере объекта. Именно здесь мы формируем табличный документ и указываем настройки отправки.


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // 1. Находим нашу печатную форму в коллекции
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "МояПечатнаяФорма");
    Если ПечатнаяФорма <> Неопределено Тогда
        // 2. Формируем табличный документ (логика формирования может быть любой)
        ПечатнаяФорма.ТабличныйДокумент = СформироватьМойТабличныйДокумент(МассивОбъектов);
        ПечатнаяФорма.ПолныйПутьКМакету = "Обработка.МояАвтономнаяОбработка.ПФ_MXL_Макет";
        
        // 3. Заполняем параметры отправки по почте
        СписокАдресатов = Новый СписокЗначений;
        СписокАдресатов.Добавить("director@company.ru", "Директору");
        СписокАдресатов.Добавить("accountant@company.ru", "Бухгалтерия");
        
        // ПараметрыВывода.ПараметрыОтправки — это структура, управляющая формой письма
        ПараметрыВывода.ПараметрыОтправки.Получатель = СписокАдресатов;
        ПараметрыВывода.ПараметрыОтправки.Тема = "Отчет из обработки: " + ТекущаяДата();
        ПараметрыВывода.ПараметрыОтправки.Текст = "Добрый день! Во вложении сформированный отчет.";
    КонецЕсли;

КонецПроцедуры

Альтернативный способ через «ПередОтправкойПоПочте»

Если вы по каким-то причинам не используете стандартный цикл ПодключаемыеКоманды, а вызываете форму печати напрямую через УправлениеПечатьюКлиент.ПечатьДокументов, есть еще один элегантный способ подставить email. Рассмотрим использование общего модуля УправлениеПечатьюПереопределяемый и его процедуру ПередОтправкойПоПочте.

Этот метод хорош тем, что он срабатывает непосредственно перед открытием окна нового письма, когда табличные документы уже сформированы. Мы можем проанализировать, какая именно форма отправляется, и подставить нужные данные:


Процедура ПередОтправкойПоПочте(ПечатныеФормы, ПараметрыОтправки, СтандартнаяОбработка) Экспорт
    // Проанализируем список печатных форм
    Для Каждого СтрокаФормы Из ПечатныеФормы Цикл
        Если СтрокаФормы.ИмяМакета = "ПФ_MXL_МойМакетИзОбработки" Тогда
            // Если это наша форма — заполняем получателей
            ПараметрыОтправки.Получатель = "service@partner.ru";
            ПараметрыОтправки.Тема = "Срочный отчет";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Использование метода «ВыполнитьКомандуПечати»

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


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

Подведем итог. Чтобы реализовать качественную печать в автономной обработке, нам не нужно «взламывать» типовые формы или писать громоздкие расширения. Достаточно правильно зарегистрировать команды в УправлениеПечатьюПереопределяемый и использовать структуру ПараметрыВывода.ПараметрыОтправки в модуле менеджера. Это обеспечит бесшовную интеграцию с типовым функционалом рассылки почты и сохранит чистоту кода.

← На главную