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

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

Автоматизация рассылки отчетов — одна из наиболее востребованных задач в системах класса 1С:Управление производственным предприятием (УПП) 1.3. Рассмотрим ситуацию, когда необходимо каждому контрагенту отправить персональный отчет (например, по движению возвратной тары или взаиморасчетам), сохранив его в формат Excel и прикрепив к электронному письму. Мы разберем весь процесс: от написания запроса до настройки автоматического запуска по расписанию.

Общий алгоритм реализации задачи

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

  1. Выборка получателей: Необходимо определить список контрагентов, которым требуется отправить отчет. Важно учитывать наличие заполненного адреса электронной почты.
  2. Циклический обход: Для каждого найденного контрагента запускается процесс формирования данных.
  3. Генерация отчета: На основе запроса формируется ТабличныйДокумент, содержащий данные только по конкретному контрагенту.
  4. Сохранение во внешний файл: Табличный документ записывается на диск в формате .xlsx или .pdf.
  5. Создание и отправка письма: В системе создается объект электронного письма, к которому прикрепляется сформированный файл, после чего выполняется отправка через системную учетную запись.
  6. Очистка: Удаление временного файла с диска для экономии места на сервере.

Шаг 1: Настройка учетной записи и подготовка данных

Перед программной реализацией убедимся, что в 1С настроена системная учетная запись электронной почты. В УПП 1.3 это делается в справочнике Учетные записи электронной почты. Проверим работоспособность, отправив тестовое письмо. Для автоматизации крайне важно, чтобы в настройках учетки стояли флаги "Использовать для отправки" и корректно указаны параметры SMTP-сервера.

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


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	Контрагенты.Ссылка КАК Контрагент,
|	КонтактнаяИнформация.Представление КАК Email
|ИЗ
|	Справочник.Контрагенты КАК Контрагенты
|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|		ПО Контрагенты.Ссылка = КонтактнаяИнформация.Объект
|ГДЕ
|	КонтактнаяИнформация.Тип = &ТипИнформации
|	И КонтактнаяИнформация.Вид = &ВидИнформации";

Запрос.УстановитьПараметр("ТипИнформации", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
Запрос.УстановитьПараметр("ВидИнформации", Справочники.ВидыКонтактнойИнформации.EmailКонтрагента);

РезультатЗапроса = Запрос.Выполнить().Выгрузить();

Шаг 2: Программное формирование отчета для каждого контрагента

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


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

    // Сохраняем файл во временную директорию
    ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
    Тд.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
    
    // Вызываем процедуру отправки (рассмотрим далее)
    ОтправитьПисьмоКонтрагенту(Стр.Email, ИмяФайла, Стр.Контрагент);
    
    // Обязательно удаляем файл после отправки
    УдалитьФайлы(ИмяФайла);
КонецЦикла;

Шаг 3: Реализация механизма отправки почты

В конфигурации УПП 1.3 для отправки почты можно использовать встроенный объект ИнтернетПочта или создавать документ Электронное письмо. Второй вариант удобен тем, что в базе сохраняется история переписки. Проанализируем ситуацию программного создания документа:


Процедура ОтправитьПисьмоКонтрагенту(АдресПолучателя, ПутьКФайлу, КонтрагентОбъект)
    
    УчетнаяЗапись = Справочники.Учетные ЗаписиЭлектроннойПочты.НайтиПоНаименованию("Системная");
    
    Письмо = Документы.ЭлектронноеПисьмо.СоздатьДокумент();
    Письмо.Дата = ТекущаяДата();
    Письмо.УчетнаяЗапись = УчетнаяЗапись;
    Письмо.Тема = "Отчет по таре за " + Формат(ТекущаяДата(), "ДФ=MMMM.yyyy");
    Письмо.Текст = "Добрый день! Во вложении ваш отчет.";
    Письмо.СтатусПисьма = Перечисления.СтатусыИсходящихЭлектронныхПисем.Черновик;
    
    // Добавляем получателя
    СтрокаПолучателя = Письмо.Получатели.Добавить();
    СтрокаПолучателя.АдресЭлектроннойПочты = АдресПолучателя;
    СтрокаПолучателя.Представление = КонтрагентОбъект.Наименование;
    
    // Работа со вложениями
    НовоеВложение = Письмо.Вложения.Добавить();
    НовоеВложение.ИмяФайла = "Отчет_" + КонтрагентОбъект.Наименование + ".xlsx";
    НовоеВложение.Файл = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ПутьКФайлу));
    
    Письмо.Записать();
    
    // Отправка через встроенные механизмы почтового клиента
    УправлениеЭлектроннойПочтой.ОтправитьПисьмо(Письмо.Ссылка);
    
КонецПроцедуры

Оптимизация и важные нюансы

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

Настройка регламентного задания

Для того чтобы все вышеописанные манипуляции происходили автоматически, создадим регламентное задание:

  1. Откроем конфигуратор и создадим новый объект РегламентноеЗадание.
  2. Укажем метод объекта — процедуру в общем модуле, где мы разместили код обхода контрагентов.
  3. Настроим Расписание. Например, каждый понедельник в 08:00.
  4. В режиме "1С:Предприятие" через консоль заданий убедимся, что задание включено и выполняется под пользователем с достаточными правами.

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

Таким образом, объединив возможности языка запросов, механизмы работы с табличными документами и встроенную электронную почту, мы получаем мощный инструмент для автоматизации взаимодействия с клиентами без участия человека.

← На главную