В процессе автоматизации бизнес-задач часто возникает необходимость не просто сформировать отчет внутри системы 1С, но и передать его внешним контрагентам или сотрудникам, у которых нет прямого доступа к базе данных. Самым универсальным способом является отправка отчета в формате Excel (XLS или XLSX). В рамках данной статьи мы подробно разберем, как программно реализовать этот процесс, начиная от генерации данных и заканчивая очисткой временных файлов после отправки.
Первым делом мы должны получить объект типа ТабличныйДокумент. Если вы используете систему компоновки данных (СКД), процесс получения документа стандартен. Разберем ситуацию, когда у нас уже есть сформированный макет или результат компоновки. Мы проанализируем, как подготовить данные к сохранению.
Для начала инициализируем отчет и выведем его в табличный документ. Важно убедиться, что все области макета заполнены корректно перед тем, как переходить к конвертации в сторонний формат. Рассмотрим пример кода, который выполняет формирование программно:
// Сформируем отчет на основе СКД
ОтчетОбъект = Отчеты.МойОтчет.Создать();
СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Платформа 1С не позволяет отправить объект ТабличныйДокумент напрямую в почтовое вложение. Сначала мы должны сохранить его в файловую систему. Чтобы не загромождать диск сервера или клиентской машины, выясним, как правильно использовать временные папки.
Проанализируем метод ПолучитьИмяВременногоФайла(). Он генерирует уникальный путь в системной временной директории. После получения пути мы воспользуемся методом Записать() табличного документа, указав тип файла ТипФайлаТабличногоДокумента.XLSX.
// Определяем путь для временного файла
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
// Сохраняем табличный документ в формате Excel
Попытка
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
Исключение
Сообщить("Не удалось сохранить файл: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Обратите внимание, что формат XLSX является более современным и предпочтительным по сравнению со старым XLS, так как он обеспечивает лучшее сжатие и совместимость с актуальными версиями офисных пакетов, что важно, если планируется легкий обмен данными с MS Power BI или Excel.
Для отправки письма нам понадобится объект ИнтернетПочтовыйПрофиль. В нем хранятся настройки сервера (адрес SMTP, порт, логин, пароль и параметры шифрования). Разберем по шагам создание профиля. В современных реалиях большинство почтовых сервисов (таких как Gmail, Mail.ru, Yandex) требуют использования протокола SSL/TLS.
Посмотрим на пример заполнения параметров для сервера с авторизацией:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "sender@mail.ru";
Профиль.Пароль = "ваш_пароль_приложения";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;
Важный момент: если вы используете двухфакторную аутентификацию, в поле Пароль необходимо вставлять специально сгенерированный "пароль для приложений", а не основной пароль от учетной записи.
Теперь создадим само сообщение, используя объект ИнтернетПочтовоеСообщение. Выясним, как правильно прикрепить наш сформированный файл Excel. Для этого используется коллекция Вложения.
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель.Адрес = "sender@mail.ru";
Сообщение.Тема = "Ежедневный отчет от " + Формат(ТекущаяДата(), "ДЛФ=D");
Сообщение.ТекущаяДата = ТекущаяДата();
// Добавляем получателя
Получатель = Сообщение.Получатели.Добавить("manager@company.com");
// Добавляем текст письма
Текст = Сообщение.Тексты.Добавить();
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Текст.Текст = "Добрый день! Во вложении сформированный отчет.";
// Прикрепляем файл Excel
Сообщение.Вложения.Добавить(ИмяФайла, "DailyReport.xlsx");
// Отправка через объект ИнтернетПочта
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
Почта.Отключиться();
Проанализируем ситуацию: после того как метод Послать() завершил свою работу, файл в папке временных файлов нам больше не нужен. Хорошим тоном в программировании на 1С считается удаление за собой временных данных, чтобы не переполнять дисковое пространство сервера.
Для этого воспользуемся методом УдалитьФайлы(). Рассмотрим безопасный способ удаления:
// Удаляем файл после отправки
Попытка
УдалитьФайлы(ИмяФайла);
Исключение
// Файл может быть занят другим процессом, просто проигнорируем это
КонецПопытки;
При реализации данного функционала следует учитывать, где именно выполняется код. Если процедура запускается НаСервере (например, в регламентном задании), убедитесь, что у пользователя, под которым запущен сервис 1С, есть права на запись в папку временных файлов и доступ к интернету для связи с SMTP-сервером.
Если вы работаете в облачных сервисах (например, 1С:Фреш), используйте встроенные подсистемы БСП (Библиотека Стандартных Подсистем), такие как РаботаСПочтовымиСообщениями. Это позволит избежать прямого манипулирования профилями и упростит поддержку кода.
Подводя итог, мы рассмотрели полный цикл: создание ТабличногоДокумента, его конвертацию в Excel через Записать(), настройку ИнтернетПочтовогоПрофиля и финальную отправку. Данный алгоритм является универсальным и может быть адаптирован под любую конфигурацию 1С на платформе 8.3.