При разработке различных регламентных заданий и отчетов в системе 1С:Предприятие часто возникает задача автоматической рассылки данных. Типичный сценарий: есть сформированный табличный документ (результат сравнения данных, отчет или печатная форма), который необходимо отправить пользователю по электронной почте в формате XLSX. В этой статье мы подробно разберем, как реализовать этот механизм правильно, избегая типичных ошибок, таких как использование статических путей на сервере или попытка вставить объект табличного документа напрямую в тело письма.
Рассмотрим ситуацию: у нас есть объект ТабличныйДокумент (в коде автора он называется ПолеТабДок). Попытка просто вставить его в структуру параметров письма в поле "Тело" не приведет к успеху, так как почтовые серверы и библиотеки 1С ожидают там либо простой текст, либо HTML-код. Для того чтобы файл пришел именно как вложение, нам нужно преобразовать ТабличныйДокумент в поток двоичных данных и правильно заполнить структуру вложений для Библиотеки Стандартных Подсистем (БСП).
Проанализируем два основных способа решения этой задачи:
Этот метод заключается в сохранении табличного документа во временную папку операционной системы, чтении его в двоичные данные и последующем удалении. Важно не использовать фиксированные пути вроде "\\server\Admin\...", так как у службы 1С может не быть прав на запись в эту сетевую папку, а имена файлов могут конфликтовать при одновременной работе нескольких пользователей.
Разберем по шагам, как это реализовать:
// 1. Получаем уникальное имя временного файла
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
// 2. Записываем табличный документ в файл
ПолеТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
// 3. Подготавливаем структуру вложения
МассивВложений = Новый Массив;
СтруктураВложения = Новый Структура;
СтруктураВложения.Вставить("Данные", Новый ДвоичныеДанные(ИмяФайла));
СтруктураВложения.Вставить("ИмяФайла", "ОтчетПоСравнению.xlsx");
МассивВложений.Добавить(СтруктураВложения);
// 4. Формируем параметры письма для БСП
ПараметрыПисьма = Новый Структура;
ПараметрыПисьма.Вставить("Кому", АдресаЭП);
ПараметрыПисьма.Вставить("Тема", "Регл.задание: Отчет");
ПараметрыПисьма.Вставить("Тело", "Добрый день! Во вложении файл с результатами сравнения.");
ПараметрыПисьма.Вставить("Вложения", МассивВложений);
// 5. Отправка (используем стандартный механизм БСП)
ПодготовленноеПисьмо = РаботаСПочтовымиСообщениями.ПодготовитьПисьмо(СистемнаяУчетнаяЗапись, ПараметрыПисьма);
РаботаСПочтовымиСообщениями.ОтправитьПисьмо(СистемнаяУчетнаяЗапись, ПодготовленноеПисьмо);
// 6. Обязательно удаляем временный файл
УдалитьФайлы(ИмяФайла);
В данном примере мы используем объект ДвоичныеДанные, который считывает файл с диска в оперативную память. Это позволяет нам сразу после формирования структуры вложения безопасно удалить файл с диска, не дожидаясь фактической отправки письма сервером.
Если ваша версия платформы позволяет использовать ПотокВПамяти, мы рекомендуем этот способ. Он исключает лишние операции ввода-вывода (I/O) и считается более надежным для высоконагруженных систем.
Проанализируем код реализации этого метода:
// Создаем поток в памяти
Поток = Новый ПотокВПамяти();
// Записываем табличный документ непосредственно в поток в формате XLSX
ПолеТабДок.Записать(Поток, ТипФайлаТабличногоДокумента.XLSX);
// Получаем двоичные данные из потока
ДвоичныеДанныеФайла = Поток.ЗакрытьИПолучитьДвоичныеДанные();
// Формируем вложение
МассивВложений = Новый Массив;
Вложение = Новый Структура("Представление, Данные", "Отчет.xlsx", ДвоичныеДанныеФайла);
МассивВложений.Добавить(Вложение);
// Далее передаем МассивВложений в ПараметрыПисьма.Вставить("Вложения", МассивВложений);
Важный момент: Обратите внимание на имена ключей в структуре вложения. В зависимости от версии БСП, используемой в вашей конфигурации, ключи могут называться "ИмяФайла" или "Представление". Рекомендуется проверить определение функции РаботаСПочтовымиСообщениями.ПодготовитьПисьмо в вашей базе.
Иногда пользователю удобнее увидеть таблицу сразу при открытии письма, не скачивая вложение. В этом случае нам нужно конвертировать ТабличныйДокумент в формат HTML. Выясним, как это сделать правильно.
Рассмотрим функцию-помощник:
Функция ПолучитьHTMLТекстИзТабДока(ТабДок)
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("html");
// Сохраняем в HTML4 для лучшей совместимости с почтовыми клиентами
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.HTML);
ТекстовыйДок = Новый ТекстовыйДокумент;
ТекстовыйДок.Прочитать(ИмяВременногоФайла, КодировкаТекста.UTF8);
Результат = ТекстовыйДок.ПолучитьТекст();
УдалитьФайлы(ИмяВременногоФайла);
Возврат Результат;
КонецФункции
После получения текста HTML, в параметрах письма необходимо указать соответствующий тип текста:
ПараметрыПисьма.Вставить("ТипТекста", Перечисления.ТипыТекстовЭлектронныхПисем.HTML);
ПараметрыПисьма.Вставить("Тело", ПолучитьHTMLТекстИзТабДока(ПолеТабДок));
Поскольку автор в исходном сообщении упоминает "Регл.задание", следует учитывать несколько критически важных моментов:
РаботаСПочтовымиСообщениями.ОтправитьПисьмо в конструкцию Попытка...Исключение, чтобы ошибка отправки почты (например, из-за временной недоступности SMTP-сервера) не приводила к аварийному завершению всего регламентного задания.ТипФайлаТабличногоДокумента.PDF. Он гарантирует, что оформление отчета (цвета, шрифты, границы) будет выглядеть одинаково на всех устройствах, включая смартфоны.Таким образом, мы рассмотрели все основные подходы к отправке табличных частей во вложениях. Выбор конкретного метода зависит от версии вашей платформы и требований к визуальному представлению данных у конечного пользователя.