Как программно сформировать печатную форму в PDF и отправить её по электронной почте в 1С 8.3?

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

В процессе автоматизации бизнес-процессов часто возникает задача автоматической рассылки документов (счетов, актов, заказов) клиентам. Для этого есть автоматизация массовой рассылки печатных форм из 1С. Подобный функционал часто востребован, когда необходима программная отправка счетов и актов из 1С:Бухгалтерии 3.0 или других типовых решений. Для этого необходимо решить три подзадачи: программно сформировать печатную форму, сохранить её в файл формата PDF и отправить этот файл вложением через электронную почту. Рассмотрим подробнее, как реализовать этот алгоритм максимально эффективно и избежать типичных ошибок, связанных с правами доступа и выполнением кода на стороне сервера.

Шаг 1. Формирование печатной формы в объект ТабличныйДокумент

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

Разберем по шагам процесс формирования:


// Создаем объект ТабличныйДокумент, в который будет выведен макет
ТабДок = Новый ТабличныйДокумент;

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

// Если используется БСП, вызов может выглядеть так:
ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы("Документ.СчетНаОплатуПокупателю", "СчетЗаказ", МассивОбъектов, ПараметрыПечати);
ТабДок = ПечатныеФормы.КоллекцияПечатныхФорм[0].ТабличныйДокумент;

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


ТабДок.АвтоМасштаб = Истина; // Чтобы документ помещался по ширине страницы
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ИмяПринтера = ""; // Очищаем имя принтера, чтобы избежать подвисаний

Шаг 2. Сохранение табличного документа в PDF

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

Проанализируем ситуацию с сохранением файла:


// Формируем путь к временному файлу с расширением .pdf
ПутьКФайлу = ПолучитьИмяВременногоФайла("pdf");

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

Обратите внимание, что метод Записать с параметром ТипФайлаТабличногоДокумента.PDF доступен на платформе 8.3 практически во всех режимах. Если вы работаете в веб-клиенте, помните, что сохранение должно происходить на стороне сервера, а затем файл может быть передан на клиент или использован для отправки.

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

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


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

Важный момент: настройки ВремяОжидания по умолчанию может быть недостаточно при отправке тяжелых вложений, поэтому рекомендуется установить его явно, например, Профиль.ВремяОжидания = 60;.

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

Теперь соберем все компоненты воедино: текст письма, адрес получателя и наш PDF-файл. Разберем по шагам создание объекта ИнтернетПочтовоеСообщение.


Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Счет на оплату от " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
Письмо.Отправитель.Адрес = "your_mail@mail.ru";
Письмо.Отправитель.ОтображаемоеИмя = "Наша Организация";

// Добавляем получателя
НовыйПолучатель = Письмо.Получатели.Добавить();
НовыйПолучатель.Адрес = "client_mail@gmail.com";

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

// Добавляем PDF как вложение
Письмо.Вложения.Добавить(ПутьКФайлу, "Invoice.pdf");

После подготовки сообщения выполняем саму отправку через объект ИнтернетПочта. Проанализируем ситуацию обработки ошибок при соединении с сервером:


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

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

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


Попытка
    УдалитьФайлы(ПутьКФайлу);
Исключение
    // Не критично, если файл занят, но в лог записать стоит
    ЗаписьЖурналаРегистрации("ОтправкаПочты", УровеньЖурналаРегистрации.Предупреждение, , , "Не удалось удалить временный файл: " + ПутьКФайлу);
КонецПопытки;

Особенности и рекомендации

При реализации данного механизма стоит учитывать несколько важных аспектов:

  1. Фоновое выполнение: Фоновая рассылка счетов и актов позволит пользователю продолжать работу. Для этой задачи есть групповая подготовка и фоновая рассылка актов сверки. Начинающим разработчикам будет полезно узнать, как работают фоновые задания для новичков, а для более сложных случаев изучить использование длительных операций в БСП.
  2. Безопасность: Никогда не храните пароли от почты в открытом виде в коде. Используйте защищенные константы или механизмы 1С для хранения учетных записей электронной почты.
  3. Объем вложений: Если PDF получается слишком тяжелым, используйте методы управления качеством и объемом файла, такие как оптимизация изображений перед выводом в ТабличныйДокумент.
  4. Логирование: Обязательно записывайте результат отправки в Журнал Регистрации. Это поможет быстро разобраться, почему клиент не получил письмо (неверный адрес, отказ сервера или проблема с файлом).

Рассмотренный метод является универсальным и подходит для большинства конфигураций 1С. Мы проанализировали полный путь от создания визуального представления документа до его доставки конечному адресату в виде защищенного от изменений PDF-файла.

← На главную