Автоматическая рассылка отчетов по расписанию — одна из типовых задач при разработке и сопровождении систем на платформе 1С:Предприятие. Часто возникает необходимость не просто прикрепить файл к письму, а сформировать отчет на схеме компоновки данных (СКД), преобразовать его в HTML и отправить получателям. Разберем по шагам все возможные пути реализации данной задачи: от применения стандартных механизмов подсистем до написания собственного программного кода.
Если разрабатываемая конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП) — например, «1С:Управление торговлей», «1С:ERP», «1С:Комплексная автоматизация» или «1С:Бухгалтерия», — писать отдельное регламентное задание и программный код генерации не требуется.
Проанализируем возможности типовой подсистемы:
Если же конфигурация не содержит БСП или требуется реализовать специфическую логику обработки данных перед отправкой, рассмотрим программную реализацию цепочки СКД.
Разберем классический программный конвейер компоновки данных. Чтобы сформировать отчет в фоновом режиме на сервере без участия интерфейса, необходимо последовательно инициализировать схему, настройки, макет компоновщика и процессор вывода.
Посмотрим на пример процедуры формирования табличного документа:
Функция СформироватьОтчетВТабличныйДокумент(ИмяОтчета, ИмяВарианта)
// Получаем схему компоновки данных
Схема = Отчеты[ИмяОтчета].ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Получаем настройки нужного варианта
Настройки = Схема.ВариантыНастроек[ИмяВарианта].Настройки;
// Формируем макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляТабличногоДокумента"));
// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Выводим результат в табличный документ
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТабДок;
КонецФункции
Полученный объект ТабличныйДокумент можно сохранить на диск в формате HTML с помощью метода Записать(). Для этого используется перечисление ТипФайлаТабличногоДокумента.HTML5 или ТипФайлаТабличногоДокумента.HTML.
Рассмотрим пример сохранения табличного документа во временный файл:
ИмяФайлаHTML = ПолучитьИмяВременногоФайла("html");
ТабДок.Записать(ИмяФайлаHTML, ТипФайлаТабличногоДокумента.HTML5);
В случаях, когда стандартная верстка табличного документа не подходит под корпоративный стиль письма, можно обойти результат компоновки данных построчно с помощью метода Следующий() и сформировать собственный HTML-код с нужными стилями и тегами.
Разберем пример обхода процессора компоновки:
Функция СформироватьПроизвольныйHTML(Схема, Настройки)
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТекстHTML = "<html><body><table border='1'>";
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
КонецЕсли;
// Обрабатываем значения полей элемента компоновки
ТекстHTML = ТекстHTML + "<tr>";
Для Каждого ЗначениеПараметра Из ЭлементРезультата.ЗначенияПараметров Цикл
ТекстHTML = ТекстHTML + "<td>" + Строка(ЗначениеПараметра.Значение) + "</td>";
КонецЦикла;
ТекстHTML = ТекстHTML + "</tr>";
КонецЦикла;
ТекстHTML = ТекстHTML + "</table></body></html>";
Возврат ТекстHTML;
КонецФункции
Для отправки почтового сообщения в платформе 1С используются объекты ИнтернетПочтовыйПрофиль, ИнтернетПочтовоеСообщение и ИнтернетПочта. Текст в формате HTML можно поместить непосредственно в тело письма либо прикрепить как вложение.
Посмотрим на пример процедуры отправки:
Процедура ОтправитьОтчетПоПочте(АдресПолучателя, ТемаПисьма, ТекстHTML, ПутьКФайлуВложения = "")
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.example.com";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "robot@example.com";
Профиль.Пароль = "SecretPassword";
Профиль.ИспользованиеSSLSMTP = Истина;
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.ИмяОтправителя = "Робот 1С";
Письмо.Отправитель = "robot@example.com";
Письмо.Получатели.Добавить(АдресПолучателя);
Письмо.Тема = ТемаПисьма;
// Устанавливаем тело письма в формате HTML
Письмо.УстановитьТекст(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);
// Если требуется прикрепить файл
Если Не ПустаяСтрока(ПутьКФайлуВложения) Тогда
Письмо.Вложения.Добавить(ПутьКФайлуВложения);
КонецЕсли;
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Исключение
Почта.Отключиться();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
При вызове описанной цепочки методов из регламентного задания необходимо учитывать следующие важные правила:
Предупреждение, Вопрос, открытие форм и обращение к объектам интерфейса).УстановитьПривилегированныйРежим(Истина) в начале процедуры.ПолучитьИмяВременногоФайла(), блок удаления файла УдалитьФайлы(ИмяФайлаHTML) следует обязательно помещать в конструкцию Попытка ... Исключение ... КонецПопытки, чтобы не засорять дисковое пространство сервера при сбоях.