Как программно сформировать и отправить отчет из 1С в формате Excel по электронной почте?

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

В процессе автоматизации бизнес-задач часто возникает необходимость не просто сформировать отчет внутри системы 1С, но и передать его внешним контрагентам или сотрудникам, у которых нет прямого доступа к базе данных. Самым универсальным способом является отправка отчета в формате Excel (XLS или XLSX). В рамках данной статьи мы подробно разберем, как программно реализовать этот процесс, начиная от генерации данных и заканчивая очисткой временных файлов после отправки.

Шаг 1. Формирование табличного документа

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

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


// Сформируем отчет на основе СКД
ОтчетОбъект = Отчеты.МойОтчет.Создать();
СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Шаг 2. Сохранение документа во временный файл

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

Проанализируем метод ПолучитьИмяВременногоФайла(). Он генерирует уникальный путь в системной временной директории. После получения пути мы воспользуемся методом Записать() табличного документа, указав тип файла ТипФайлаТабличногоДокумента.XLSX.


// Определяем путь для временного файла
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");

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

Обратите внимание, что формат XLSX является более современным и предпочтительным по сравнению со старым XLS, так как он обеспечивает лучшее сжатие и совместимость с актуальными версиями офисных пакетов, что важно, если планируется легкий обмен данными с MS Power BI или Excel.

Шаг 3. Настройка почтового профиля

Для отправки письма нам понадобится объект ИнтернетПочтовыйПрофиль. В нем хранятся настройки сервера (адрес SMTP, порт, логин, пароль и параметры шифрования). Разберем по шагам создание профиля. В современных реалиях большинство почтовых сервисов (таких как Gmail, Mail.ru, Yandex) требуют использования протокола SSL/TLS.

Посмотрим на пример заполнения параметров для сервера с авторизацией:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "sender@mail.ru";
Профиль.Пароль = "ваш_пароль_приложения";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;

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

Шаг 4. Подготовка и отправка сообщения

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


Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель.Адрес = "sender@mail.ru";
Сообщение.Тема = "Ежедневный отчет от " + Формат(ТекущаяДата(), "ДЛФ=D");
Сообщение.ТекущаяДата = ТекущаяДата();

// Добавляем получателя
Получатель = Сообщение.Получатели.Добавить("manager@company.com");

// Добавляем текст письма
Текст = Сообщение.Тексты.Добавить();
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Текст.Текст = "Добрый день! Во вложении сформированный отчет.";

// Прикрепляем файл Excel
Сообщение.Вложения.Добавить(ИмяФайла, "DailyReport.xlsx");

// Отправка через объект ИнтернетПочта
Почта = Новый ИнтернетПочта;
Попытка
    Почта.Подключиться(Профиль);
    Почта.Послать(Сообщение);
    Сообщить("Письмо успешно отправлено!");
Исключение
    Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
Почта.Отключиться();

Шаг 5. Очистка временных ресурсов

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

Для этого воспользуемся методом УдалитьФайлы(). Рассмотрим безопасный способ удаления:


// Удаляем файл после отправки
Попытка
    УдалитьФайлы(ИмяФайла);
Исключение
    // Файл может быть занят другим процессом, просто проигнорируем это
КонецПопытки;

Особенности работы на разных платформах

При реализации данного функционала следует учитывать, где именно выполняется код. Если процедура запускается НаСервере (например, в регламентном задании), убедитесь, что у пользователя, под которым запущен сервис 1С, есть права на запись в папку временных файлов и доступ к интернету для связи с SMTP-сервером.

Если вы работаете в облачных сервисах (например, 1С:Фреш), используйте встроенные подсистемы БСП (Библиотека Стандартных Подсистем), такие как РаботаСПочтовымиСообщениями. Это позволит избежать прямого манипулирования профилями и упростит поддержку кода.

Подводя итог, мы рассмотрели полный цикл: создание ТабличногоДокумента, его конвертацию в Excel через Записать(), настройку ИнтернетПочтовогоПрофиля и финальную отправку. Данный алгоритм является универсальным и может быть адаптирован под любую конфигурацию 1С на платформе 8.3.

← На главную