При работе с типовыми конфигурациями 1С, построенными на базе Библиотеки стандартных подсистем (БСП), часто возникает задача автоматизации рутинных действий. Одной из таких задач является автоматическое заполнение адреса электронной почты в поле "Кому" при нажатии кнопки "Отправить сейчас" в стандартной форме отчета. Разберем подробно, как это реализовать, не создавая собственных форм и не снимая конфигурацию с поддержки.
Для начала проанализируем ситуацию. В современных версиях 1С (Управляемое приложение) отчеты на базе Системы компоновки данных (СКД) используют общие формы для вывода и отправки данных. Кнопка отправки письма не встроена в каждый отдельный отчет — она вызывается из общей формы, предоставляемой БСП. Это означает, что правка модуля самого отчета не даст прямого результата для управления формой отправки почты.
Выясним причину, почему стандартные средства не всегда позволяют задать адрес напрямую. Система стремится к универсальности, поэтому форма отправки письма инициируется через общие механизмы работы с почтовыми сообщениями. Чтобы вмешаться в этот процесс, нам необходимо использовать специально предусмотренные разработчиками "точки входа", которые называются переопределяемыми модулями.
Для управления параметрами письма перед открытием формы в БСП предусмотрен глобальный механизм. Нам потребуется общий модуль РаботаСПочтовымиСообщениямиКлиентПереопределяемый. В нем находится процедура ПередОткрытиемФормыОтправкиПисьма. Рассмотрим подробнее ее структуру и возможности.
Эта процедура вызывается системой непосредственно перед тем, как пользователь увидит окно формирования электронного письма. В нее передается структура ПараметрыОтправки, которую мы и будем модифицировать. Посмотрим на пример того, как может выглядеть код в этом модуле:
Процедура ПередОткрытиемФормыОтправкиПисьма(ПараметрыОтправки, ОповещениеОЗакрытииФормы, СтандартнаяОбработка) Экспорт
// Проверяем, что это именно наш отчет
Если ПараметрыОтправки.Тема Содержит "Продажи" Тогда
// Создаем массив для получателей, если он еще не создан
Если Не ПараметрыОтправки.Свойство("Получатели") Или ТипЗнч(ПараметрыОтправки.Получатели) <> Тип("Массив") Тогда
ПараметрыОтправки.Вставить("Получатели", Новый Массив);
КонецЕсли;
// Добавляем адрес в список получателей
ПараметрыОтправки.Получатели.Добавить("manager@company.com");
КонецЕсли;
КонецПроцедуры
Сформулируем правильный подход к внедрению данного решения. Чтобы сохранить возможность беспрепятственного обновления типовой конфигурации, крайне рекомендуется использовать Расширение. Мы создадим в расширении метод-перехватчик для указанной выше процедуры.
Разберем по шагам процесс создания расширения:
РаботаСПочтовымиСообщениямиКлиентПереопределяемый в основной конфигурации и добавляем его в расширение.&После или &Вместо. Использование &После предпочтительнее, так как оно не блокирует исполнение типового кода.Посмотрим на пример кода в расширении, который реализует более гибкую логику:
&После("ПередОткрытиемФормыОтправкиПисьма")
Процедура Расш1_ПередОткрытиемФормыОтправкиПисьма(ПараметрыОтправки, ОповещениеОЗакрытииФормы, СтандартнаяОбработка)
// Проанализируем контекст отправки.
// В ПараметрыОтправки обычно передается Тема, Текст и Вложения.
Если СтрНайти(ПараметрыОтправки.Тема, "Отчет по остаткам") > 0 Тогда
// Задаем адрес получателя
АдресПолучателя = "sklad@example.com";
// Если структура параметров позволяет, записываем адрес
ПараметрыОтправки.Вставить("Получатели", АдресПолучателя);
// Можно также дополнить тему письма, чтобы она была информативнее
ПараметрыОтправки.Тема = ПараметрыОтправки.Тема + " (сформирован автоматически)";
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, когда у нас много отчетов и для каждого нужен свой адрес. Поскольку процедура ПередОткрытиемФормыОтправкиПисьма является общей для всей системы, нам нужно точно идентифицировать, какой отчет отправляется в данный момент.
В структуру ПараметрыОтправки система помещает данные, сформированные на предыдущем шаге. Обычно это:
Тема — заголовок письма, который по умолчанию совпадает с заголовком отчета.Текст — тело письма.Вложения — массив структур, содержащих двоичные данные отчета и имя файла.Если нам нужно различать отчеты максимально точно, мы можем проанализировать имена вложенных файлов или ключевые слова в теме. Выясним причину, по которой стоит использовать внешние настройки: хранение e-mail прямо в коде (хардкод) — плохая практика. Рассмотрим, как сделать это правильно.
Вместо того чтобы прописывать адреса в коде, создадим механизм, где пользователь сам сможет указать почту для конкретного отчета. Для этого можно использовать:
Проанализируем пример кода, который считывает адрес из воображаемого регистра настроек:
// Внутри процедуры ПередОткрытиемФормыОтправкиПисьма
ИмяОтчета = ПолучитьИмяОтчетаИзТемы(ПараметрыОтправки.Тема);
НужныйАдрес = РегистрыСведений.НастройкиРассылкиОтчетов.ПолучитьАдресПоИмени(ИмяОтчета);
Если ЗначениеЗаполнено(НужныйАдрес) Тогда
ПараметрыОтправки.Вставить("Получатели", НужныйАдрес);
КонецЕсли;
Рассмотрим ситуацию, когда программирование вовсе не требуется. В составе БСП есть мощный инструмент — "Рассылка отчетов". Если ваша задача состоит в том, чтобы отчет регулярно или по требованию уходил определенному кругу лиц, этот функционал подойдет лучше всего.
В этом случае вы создаете настройку в пользовательском режиме:
Этот способ является наиболее предпочтительным с точки зрения поддержки системы, так как он не требует внесения изменений в код и легко масштабируется силами администраторов или опытных пользователей.
Мы разобрали несколько способов автоматического заполнения адреса получателя. Для оперативной отправки "здесь и сейчас" через стандартную кнопку отчета оптимальным является использование расширения с перехватом процедуры ПередОткрытиемФормыОтправкиПисьма модуля РаботаСПочтовымиСообщениямиКлиентПереопределяемый. Если же требуется регулярная отправка, стоит обратить внимание на типовой функционал рассылок. Применяя эти знания, мы можем значительно повысить удобство работы пользователей с системой 1С.