Как в регламентном задании сформировать отчет на СКД и отправить его по почте в формате HTML?

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

Автоматическая рассылка отчетов по расписанию — одна из типовых задач при разработке и сопровождении систем на платформе 1С:Предприятие. Часто возникает необходимость не просто прикрепить файл к письму, а сформировать отчет на схеме компоновки данных (СКД), преобразовать его в HTML и отправить получателям. Разберем по шагам все возможные пути реализации данной задачи: от применения стандартных механизмов подсистем до написания собственного программного кода.

Вариант 1. Использование типовой подсистемы «Рассылка отчетов» (БСП)

Если разрабатываемая конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП) — например, «1С:Управление торговлей», «1С:ERP», «1С:Комплексная автоматизация» или «1С:Бухгалтерия», — писать отдельное регламентное задание и программный код генерации не требуется.

Проанализируем возможности типовой подсистемы:

  1. Перейдем в раздел администрирования и откроем справочник Рассылки отчетов.
  2. Создадим новый элемент рассылки, выберем нужный отчет и сохраненный вариант настроек СКД.
  3. На вкладке форматов укажем формат HTML или HTML5. Подсистема позволяет как вкладывать файл в письмо, так и отправлять результат прямо в теле письма.
  4. Настроим расписание выполнения и список получателей (пользователей или произвольные адреса электронной почты).

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

Вариант 2. Программное формирование отчета СКД в ТабличныйДокумент и экспорт в HTML

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

Посмотрим на пример процедуры формирования табличного документа:


Функция СформироватьОтчетВТабличныйДокумент(ИмяОтчета, ИмяВарианта)
    
    // Получаем схему компоновки данных
    Схема = Отчеты[ИмяОтчета].ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // Получаем настройки нужного варианта
    Настройки = Схема.ВариантыНастроек[ИмяВарианта].Настройки;
    
    // Формируем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляТабличногоДокумента"));
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // Выводим результат в табличный документ
    ТабДок = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДок);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    Возврат ТабДок;
    
КонецФункции

Полученный объект ТабличныйДокумент можно сохранить на диск в формате HTML с помощью метода Записать(). Для этого используется перечисление ТипФайлаТабличногоДокумента.HTML5 или ТипФайлаТабличногоДокумента.HTML.

Рассмотрим пример сохранения табличного документа во временный файл:


ИмяФайлаHTML = ПолучитьИмяВременногоФайла("html");
ТабДок.Записать(ИмяФайлаHTML, ТипФайлаТабличногоДокумента.HTML5);

Вариант 3. Обход результата СКД для генерации произвольного HTML-макета

В случаях, когда стандартная верстка табличного документа не подходит под корпоративный стиль письма, можно обойти результат компоновки данных построчно с помощью метода Следующий() и сформировать собственный HTML-код с нужными стилями и тегами.

Разберем пример обхода процессора компоновки:


Функция СформироватьПроизвольныйHTML(Схема, Настройки)
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    ТекстHTML = "<html><body><table border='1'>";
    
    Пока Истина Цикл
        ЭлементРезультата = ПроцессорКомпоновки.Следующий();
        Если ЭлементРезультата = Неопределено Тогда
            Прервать;
        КонецЕсли;
        
        // Обрабатываем значения полей элемента компоновки
        ТекстHTML = ТекстHTML + "<tr>";
        Для Каждого ЗначениеПараметра Из ЭлементРезультата.ЗначенияПараметров Цикл
            ТекстHTML = ТекстHTML + "<td>" + Строка(ЗначениеПараметра.Значение) + "</td>";
        КонецЦикла;
        ТекстHTML = ТекстHTML + "</tr>";
    КонецЦикла;
    
    ТекстHTML = ТекстHTML + "</table></body></html>";
    
    Возврат ТекстHTML;
    
КонецФункции

Отправка сформированного HTML по электронной почте

Для отправки почтового сообщения в платформе 1С используются объекты ИнтернетПочтовыйПрофиль, ИнтернетПочтовоеСообщение и ИнтернетПочта. Текст в формате HTML можно поместить непосредственно в тело письма либо прикрепить как вложение.

Посмотрим на пример процедуры отправки:


Процедура ОтправитьОтчетПоПочте(АдресПолучателя, ТемаПисьма, ТекстHTML, ПутьКФайлуВложения = "")
    
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP = "smtp.example.com";
    Профиль.ПортSMTP = 465;
    Профиль.Пользователь = "robot@example.com";
    Профиль.Пароль = "SecretPassword";
    Профиль.ИспользованиеSSLSMTP = Истина;
    
    Письмо = Новый ИнтернетПочтовоеСообщение;
    Письмо.ИмяОтправителя = "Робот 1С";
    Письмо.Отправитель = "robot@example.com";
    Письмо.Получатели.Добавить(АдресПолучателя);
    Письмо.Тема = ТемаПисьма;
    
    // Устанавливаем тело письма в формате HTML
    Письмо.УстановитьТекст(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);
    
    // Если требуется прикрепить файл
    Если Не ПустаяСтрока(ПутьКФайлуВложения) Тогда
        Письмо.Вложения.Добавить(ПутьКФайлуВложения);
    КонецЕсли;
    
    Почта = Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Письмо);
        Почта.Отключиться();
    Исключение
        Почта.Отключиться();
        ВызватьИсключение;
    КонецПопытки;
    
КонецПроцедуры

Особенности выполнения в регламентном задании

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

  1. Исключительно серверный контекст: Регламентное задание выполняется в фоновом сеансе. В вызываемом коде нельзя использовать интерактивные методы (Предупреждение, Вопрос, открытие форм и обращение к объектам интерфейса).
  2. Права доступа: Фоновое задание выполняется под учетной записью пользователя, назначенного заданию, либо от имени системного пользователя. Если действуют ограничения RLS или у пользователя отсутствуют права на чтение данных, отчет сформируется пустым. При необходимости используйте метод УстановитьПривилегированныйРежим(Истина) в начале процедуры.
  3. Очистка временных файлов: Если для сохранения HTML использовался метод ПолучитьИмяВременногоФайла(), блок удаления файла УдалитьФайлы(ИмяФайлаHTML) следует обязательно помещать в конструкцию Попытка ... Исключение ... КонецПопытки, чтобы не засорять дисковое пространство сервера при сбоях.
← На главную