В процессе автоматизации бизнес-процессов часто возникает задача автоматической рассылки документов (счетов, актов, заказов) клиентам. Для этого есть автоматизация массовой рассылки печатных форм из 1С. Подобный функционал часто востребован, когда необходима программная отправка счетов и актов из 1С:Бухгалтерии 3.0 или других типовых решений. Для этого необходимо решить три подзадачи: программно сформировать печатную форму, сохранить её в файл формата PDF и отправить этот файл вложением через электронную почту. Рассмотрим подробнее, как реализовать этот алгоритм максимально эффективно и избежать типичных ошибок, связанных с правами доступа и выполнением кода на стороне сервера.
Прежде чем сохранить документ в PDF, его нужно сформировать в памяти сервера. Для этого в 1С используется объект ТабличныйДокумент. Проанализируем типичный код получения печатной формы. Обычно в типовых конфигурациях (на базе БСП) для этого используется интеграция с подсистемой печати. Чтобы разобраться в нюансах реализации на современных версиях платформы, можно изучить классический корректный пример внешней печатной формы.
Разберем по шагам процесс формирования:
// Создаем объект ТабличныйДокумент, в который будет выведен макет
ТабДок = Новый ТабличныйДокумент;
// Вызываем метод печати (пример для документа "СчетНаОплатуПокупателю")
// В типовых конфигурациях метод обычно возвращает ТабличныйДокумент
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
ПараметрыПечати = Новый Структура;
// Если используется БСП, вызов может выглядеть так:
ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы("Документ.СчетНаОплатуПокупателю", "СчетЗаказ", МассивОбъектов, ПараметрыПечати);
ТабДок = ПечатныеФормы.КоллекцияПечатныхФорм[0].ТабличныйДокумент;
Важно убедиться, что свойства ТабличныйДокумент установлены корректно перед сохранением. Чтобы быстрее находить нужные функции в библиотеках, рекомендуем использовать справочник по методам БСП с примерами использования. Посмотрим на пример настройки свойств:
ТабДок.АвтоМасштаб = Истина; // Чтобы документ помещался по ширине страницы
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ИмяПринтера = ""; // Очищаем имя принтера, чтобы избежать подвисаний
После того как объект ТабличныйДокумент заполнен данными, его необходимо записать на диск. Выясним причину, почему для этого лучше использовать временные файлы. Работа на сервере подразумевает, что у пользователя usr1cv8 может не быть прав на запись в произвольные папки. Использование функции ПолучитьИмяВременногоФайла() позволяет реализовать сохранение печатных форм на стороне сервера без использования внешних библиотек и избежать проблем с правами доступа.
Проанализируем ситуацию с сохранением файла:
// Формируем путь к временному файлу с расширением .pdf
ПутьКФайлу = ПолучитьИмяВременногоФайла("pdf");
// Используем метод Записать(), указывая тип файла PDF
Попытка
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Сообщить("Файл успешно сохранен во временное хранилище: " + ПутьКФайлу);
Исключение
Инфо = ИнформацияОбОшибке();
ВызватьИсключение "Ошибка при сохранении PDF: " + КраткоеПредставлениеОшибки(Инфо);
КонецПопытки;
Обратите внимание, что метод Записать с параметром ТипФайлаТабличногоДокумента.PDF доступен на платформе 8.3 практически во всех режимах. Если вы работаете в веб-клиенте, помните, что сохранение должно происходить на стороне сервера, а затем файл может быть передан на клиент или использован для отправки.
Для отправки письма в 1С используется объект ИнтернетПочтовыйПрофиль. Рассмотрим подробнее настройку отправки почты через SMTP для популярных почтовых сервисов. Также существует возможность реализовать отправку и получение почтовых сообщений через специальные расширения, которые не требуют внесения изменений в основную конфигурацию. Для этого подойдёт автоматизация выставления и рассылки счетов на повторяющиеся услуги.
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru"; // Для примера Mail.ru
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "your_mail@mail.ru";
Профиль.Пароль = "ваш_пароль_приложения";
Профиль.ТолькоSSLSMTP = Истина;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Важный момент: настройки ВремяОжидания по умолчанию может быть недостаточно при отправке тяжелых вложений, поэтому рекомендуется установить его явно, например, Профиль.ВремяОжидания = 60;.
Теперь соберем все компоненты воедино: текст письма, адрес получателя и наш PDF-файл. Разберем по шагам создание объекта ИнтернетПочтовоеСообщение.
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Счет на оплату от " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
Письмо.Отправитель.Адрес = "your_mail@mail.ru";
Письмо.Отправитель.ОтображаемоеИмя = "Наша Организация";
// Добавляем получателя
НовыйПолучатель = Письмо.Получатели.Добавить();
НовыйПолучатель.Адрес = "client_mail@gmail.com";
// Текст письма
Текст = Письмо.Тексты.Добавить();
Текст.Текст = "Добрый день! Во вложении ваш счет на оплату. Спасибо, что выбрали нас.";
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// Добавляем PDF как вложение
Письмо.Вложения.Добавить(ПутьКФайлу, "Invoice.pdf");
После подготовки сообщения выполняем саму отправку через объект ИнтернетПочта. Проанализируем ситуацию обработки ошибок при соединении с сервером:
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Сообщить("Письмо успешно отправлено!");
Исключение
Инфо = ИнформацияОбОшибке();
Почта.Отключиться(); // Всегда закрываем соединение
ВызватьИсключение "Ошибка при отправке почты: " + КраткоеПредставлениеОшибки(Инфо);
КонецПопытки;
Посмотрим на пример хорошего тона в программировании. После того как письмо ушло, временный файл на диске сервера больше не нужен. Чтобы обеспечить безопасную работу с временными файлами, его следует удалить сразу после использования.
Попытка
УдалитьФайлы(ПутьКФайлу);
Исключение
// Не критично, если файл занят, но в лог записать стоит
ЗаписьЖурналаРегистрации("ОтправкаПочты", УровеньЖурналаРегистрации.Предупреждение, , , "Не удалось удалить временный файл: " + ПутьКФайлу);
КонецПопытки;
При реализации данного механизма стоит учитывать несколько важных аспектов:
ТабличныйДокумент.Рассмотренный метод является универсальным и подходит для большинства конфигураций 1С. Мы проанализировали полный путь от создания визуального представления документа до его доставки конечному адресату в виде защищенного от изменений PDF-файла.