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