В процессе автоматизации бизнес-процессов часто возникает задача автоматической отправки документов контрагентам. Это может быть счет на оплату, акт сверки или заказ клиента — поможет массовое выставление и отправка документов в PDF. Чтобы реализовать этот функционал, необходимо решить две основные подзадачи: программное получение печатной формы в виде электронного документа (например, PDF) и непосредственная отправка письма с вложением. В данной статье мы разберем, как это сделать наиболее эффективно, используя возможности платформы и Библиотеки стандартных подсистем (БСП).
Для начала проанализируем, как получить визуальное представление документа. В современных конфигурациях 1С, построенных на базе БСП, печатные формы обычно формируются через менеджер печати. Если вам необходим корректный пример внешней печатной формы для актуальных версий системы, важно придерживаться стандартов БСП. Мы не будем открывать форму предварительного просмотра, а сразу получим ТабличныйДокумент в коде. Разберем пример вызова команды печати:
ИмяМенеджераПечати = "Документ.СчетНаОплатуПокупателю";
ИменаМакетов = "СчетЗаказ"; // Имя макета из метаданных
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
ПараметрыПечати = Новый Структура;
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИменаМакетов);
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьПараметрыВывода();
УправлениеПечатью.СформироватьПечатныеФормы(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
После выполнения этого кода в переменной КоллекцияПечатныхФорм будет содержаться строка с нашим табличным документом. Мы можем извлечь его по имени макета. Рассмотрим подробнее, как преобразовать полученный ТабличныйДокумент в файл, пригодный для отправки.
Чтобы отправить файл по почте, его необходимо физически сохранить на диске сервера во временное хранилище. Мы рекомендуем использовать формат PDF, так как он является универсальным и неизменяемым. Выясним, как выполнить сохранение:
СтрокаПечатнойФормы = КоллекцияПечатныхФорм.Найти("СчетЗаказ", "ИмяВКоллекции");
Если СтрокаПечатнойФормы <> Неопределено Тогда
ТабДок = СтрокаПечатнойФормы.ТабличныйДокумент;
// Формируем уникальное имя файла
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;
Важно помнить, что метод Записать с типом PDF доступен на стороне сервера. Проанализируем ситуацию: если ваша конфигурация работает в режиме веб-клиента, убедитесь, что код выполняется в серверном контексте, иначе возникнет ошибка доступа к файловой системе.
Использование средств 1С для отправки почтовых сообщений, интегрированных в БСП, значительно упрощает работу, так как библиотека берет на себя работу с учетными записями, которые уже настроены в системе. Для работы нам понадобится объект СправочникСсылка.УчетныеЗаписиЭлектроннойПочты. Разберем по шагам создание письма:
// Выбираем системную учетную запись
УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты;
// Структура для параметров письма
ПараметрыПисьма = Новый Структура;
ПараметрыПисьма.Вставить("Кому", "client@example.com");
ПараметрыПисьма.Вставить("Тема", "Счет на оплату №" + СсылкаНаДокумент.Номер);
ПараметрыПисьма.Вставить("Тело", "Добрый день! Во вложении ваш счет.");
// Подготавливаем вложения
Вложения = Новый Массив;
ОписаниеВложения = Новый Структура;
ОписаниеВложения.Вставить("ИмяФайла", "Счет.pdf");
ОписаниеВложения.Вставить("Данные", Новый ДвоичныеДанные(ИмяФайла));
Вложения.Добавить(ОписаниеВложения);
ПараметрыПисьма.Вставить("Вложения", Вложения);
Обратите внимание на объект ДвоичныеДанные. Мы читаем файл с диска и помещаем его в память для передачи в процедуру отправки. После этого можно вызывать метод отправки БСП:
РаботаСПочтой.ОтправитьПочту(УчетнаяЗапись, ПараметрыПисьма);
Если в вашей конфигурации не используется БСП или вам нужен более низкоуровневый контроль, рассмотрим вариант с использованием стандартного объекта платформы ИнтернетПочта. Также полезно изучить пример работы с почтовыми вложениями, чтобы понимать принципы обработки файлов. Посмотрим на пример кода:
Почта = Новый ИнтернетПочта;
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "login@mail.ru";
Профиль.ПарольSMTP = "password";
Профиль.ИспользоватьSSLSMTP = Истина;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Тема = "Ваш документ";
Сообщение.Отправитель.Адрес = "login@mail.ru";
Сообщение.Получатели.Добавить("client@example.com");
// Добавляем текст
Текст = Сообщение.Тексты.Добавить("Текст письма...");
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// Добавляем вложение
Сообщение.Вложения.Добавить(ИмяФайла, "Invoice.pdf");
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
При использовании этого метода крайне важно обрабатывать исключения через блок Попытка...Исключение, так как проблемы с сетевым соединением или авторизацией на SMTP-сервере случаются довольно часто. Выясним причину возможных сбоев: часто это блокировка порта 465 или 587 антивирусом или необходимость использования "Пароля приложения" для почтовых сервисов типа Mail.ru или Gmail.
Проанализируем несколько важных моментов, которые помогут избежать ошибок при реализации данного функционала:
УдалитьФайлы(ИмяФайла). Это предотвратит переполнение дискового пространства при массовой рассылке.ИнтернетПочтовыйПрофиль корректно указаны настройки прокси, иначе метод Подключиться() завершится по таймауту.Таким образом, мы разобрали комплексный подход к автоматизации рассылки документов. Использование УправлениеПечатью для генерации макетов и РаботаСПочтой из состава БСП является наиболее современным и правильным способом разработки в среде 1С:Предприятие 8.3.