Автоматизация рассылки отчетов — одна из наиболее востребованных задач в системах класса 1С:Управление производственным предприятием (УПП) 1.3. Рассмотрим ситуацию, когда необходимо каждому контрагенту отправить персональный отчет (например, по движению возвратной тары или взаиморасчетам), сохранив его в формат Excel и прикрепив к электронному письму. Мы разберем весь процесс: от написания запроса до настройки автоматического запуска по расписанию.
Прежде чем приступать к написанию кода, определим четкую последовательность действий, которую должна выполнять система в автоматическом режиме. Проанализируем шаги, необходимые для успешной рассылки:
ТабличныйДокумент, содержащий данные только по конкретному контрагенту..xlsx или .pdf.Перед программной реализацией убедимся, что в 1С настроена системная учетная запись электронной почты. В УПП 1.3 это делается в справочнике Учетные записи электронной почты. Проверим работоспособность, отправив тестовое письмо. Для автоматизации крайне важно, чтобы в настройках учетки стояли флаги "Использовать для отправки" и корректно указаны параметры SMTP-сервера.
Рассмотрим пример запроса, который выбирает контрагентов, имеющих определенный профиль и контактную информацию. Выясним причину использования левых соединений: это гарантирует, что мы получим список контрагентов, даже если по ним еще не было движений, но есть необходимость отправить "пустой" или информационный отчет.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Контрагенты.Ссылка КАК Контрагент,
| КонтактнаяИнформация.Представление КАК Email
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
| ПО Контрагенты.Ссылка = КонтактнаяИнформация.Объект
|ГДЕ
| КонтактнаяИнформация.Тип = &ТипИнформации
| И КонтактнаяИнформация.Вид = &ВидИнформации";
Запрос.УстановитьПараметр("ТипИнформации", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
Запрос.УстановитьПараметр("ВидИнформации", Справочники.ВидыКонтактнойИнформации.EmailКонтрагента);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Теперь разберем, как сформировать индивидуальный файл. Важной деталью является то, что отчет должен фильтроваться по текущему контрагенту в цикле. Посмотрим на пример реализации формирования табличного документа:
Для Каждого Стр Из РезультатЗапроса Цикл
// Инициализируем табличный документ и макет
Тд = Новый ТабличныйДокумент;
Макет = УправлениеОтчетами.ПолучитьОбщийМакет("НашОбщийМакетОтчета");
// Выполняем запрос по данным конкретного контрагента
ЗапросДанные = Новый Запрос;
ЗапросДанные.Текст = "ВЫБРАТЬ ... ГДЕ Контрагент = &Контрагент";
ЗапросДанные.УстановитьПараметр("Контрагент", Стр.Контрагент);
ЗапросДанные.УстановитьПараметр("ДатаНач", НачалоМесяца(ТекущаяДата()));
ЗапросДанные.УстановитьПараметр("ДатаКон", КонецМесяца(ТекущаяДата()));
Выборка = ЗапросДанные.Выполнить().Выбрать();
// Заполняем секции макета
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.КонтрагентНаименование = Стр.Контрагент.Наименование;
Тд.Вывести(ОбластьШапка);
Пока Выборка.Следующий() Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьСтрока.Параметры.Заполнить(Выборка);
Тд.Вывести(ОбластьСтрока);
КонецЦикла;
// Сохраняем файл во временную директорию
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
Тд.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
// Вызываем процедуру отправки (рассмотрим далее)
ОтправитьПисьмоКонтрагенту(Стр.Email, ИмяФайла, Стр.Контрагент);
// Обязательно удаляем файл после отправки
УдалитьФайлы(ИмяФайла);
КонецЦикла;
В конфигурации УПП 1.3 для отправки почты можно использовать встроенный объект ИнтернетПочта или создавать документ Электронное письмо. Второй вариант удобен тем, что в базе сохраняется история переписки. Проанализируем ситуацию программного создания документа:
Процедура ОтправитьПисьмоКонтрагенту(АдресПолучателя, ПутьКФайлу, КонтрагентОбъект)
УчетнаяЗапись = Справочники.Учетные ЗаписиЭлектроннойПочты.НайтиПоНаименованию("Системная");
Письмо = Документы.ЭлектронноеПисьмо.СоздатьДокумент();
Письмо.Дата = ТекущаяДата();
Письмо.УчетнаяЗапись = УчетнаяЗапись;
Письмо.Тема = "Отчет по таре за " + Формат(ТекущаяДата(), "ДФ=MMMM.yyyy");
Письмо.Текст = "Добрый день! Во вложении ваш отчет.";
Письмо.СтатусПисьма = Перечисления.СтатусыИсходящихЭлектронныхПисем.Черновик;
// Добавляем получателя
СтрокаПолучателя = Письмо.Получатели.Добавить();
СтрокаПолучателя.АдресЭлектроннойПочты = АдресПолучателя;
СтрокаПолучателя.Представление = КонтрагентОбъект.Наименование;
// Работа со вложениями
НовоеВложение = Письмо.Вложения.Добавить();
НовоеВложение.ИмяФайла = "Отчет_" + КонтрагентОбъект.Наименование + ".xlsx";
НовоеВложение.Файл = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ПутьКФайлу));
Письмо.Записать();
// Отправка через встроенные механизмы почтового клиента
УправлениеЭлектроннойПочтой.ОтправитьПисьмо(Письмо.Ссылка);
КонецПроцедуры
Рассмотрим несколько критических моментов, которые помогут избежать ошибок при эксплуатации системы:
Предупреждение() или Вопрос()). Если вы используете внешнюю обработку, убедитесь, что все вызовы переведены в неинтерактивный режим.ТипФайлаТабличногоДокумента.PDF при сохранении. Это считается стандартом для деловой переписки."C:\Reports\". Сервер 1С может не иметь прав на запись в корень диска. Всегда используйте функцию ПолучитьИмяВременногоФайла(), которая вернет путь к разрешенной временной папке пользователя ОС, под которым запущен агент сервера 1С.Для того чтобы все вышеописанные манипуляции происходили автоматически, создадим регламентное задание:
Использование Общих макетов (как выяснилось в ходе обсуждения проблемы) является наиболее оптимальным способом оформления. Это позволяет централизованно менять дизайн отчета для всех клиентов сразу, не переписывая программный код формирования колонок. Выделим это как лучшую практику при разработке подобных модулей рассылки.
Таким образом, объединив возможности языка запросов, механизмы работы с табличными документами и встроенную электронную почту, мы получаем мощный инструмент для автоматизации взаимодействия с клиентами без участия человека.