Как правильно получить файл из временного хранилища в 1С и добавить его во вложение письма?

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

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

Базовый алгоритм работы с временным хранилищем

Разберем логику работы стандартного механизма 1С. Для того чтобы передать данные между клиентом и сервером (или между разными серверными вызовами), мы помещаем файл во временное хранилище. В исходной задаче разработчик генерирует PDF-файл и сохраняет его.

Посмотрим на пример кода помещения файла в хранилище:


ИмяФайлаПДФ = Файл + ".pdf";
MSWord.SaveAs(ИмяФайлаПДФ, 17); // сохраняем документ в формате PDF
Данные = Новый ДвоичныеДанные(ИмяФайлаПДФ);
АдресВХ = ПоместитьВоВременноеХранилище(Данные);

Чтобы получить эти данные обратно и добавить их к письму, мы используем функцию ПолучитьИзВременногоХранилища. Базово этот код выглядит так:


ДанныеИзХранилища = ПолучитьИзВременногоХранилища(АдресВХ);
ПочтовоеСообщение.Вложения.Добавить(ДанныеИзХранилища);

Однако на практике такой простой подход может работать некорректно. Разберем подробнее нюансы и подводные камни.

Причина проблемы: потеря расширения файла

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


МойПДФ = ПолучитьИзВременногоХранилища(ПутьПДФ);
Если МойПДФ <> Неопределено Тогда
    ИмяФайла = Новый УникальныйИдентификатор;
    МойПДФ.Записать(КаталогВременныхФайлов + ИмяФайла);
    ПочтовоеСообщение.Вложения.Добавить(КаталогВременныхФайлов + ИмяФайла);
КонецЕсли;

Выясним причину такого поведения. Разработчик сохраняет полученные из хранилища двоичные данные во временный каталог на диске сервера. При этом в качестве имени файла используется просто сгенерированный УникальныйИдентификатор (например, 466bd7bc-9b16-43b9-b883-e02ebf917578). Критическая ошибка заключается в том, что к имени файла не было добавлено расширение.

Из-за отсутствия окончания .pdf почтовые программы получателя и операционная система не могут понять, какой программой следует открывать данное вложение. Исправим эту ошибку. Правильный вариант записи файла на диск обязательно должен включать расширение:


ИмяФайла = Строка(Новый УникальныйИдентификатор) + ".pdf";
ПолныйПуть = КаталогВременныхФайлов + ИмяФайла;
МойПДФ.Записать(ПолныйПуть);
ПочтовоеСообщение.Вложения.Добавить(ПолныйПуть);

Как задать красивое имя вложению в письме?

Рассмотрим еще один важный момент. При использовании метода ПочтовоеСообщение.Вложения.Добавить() важно заботиться о том, как файл будет отображаться у адресата. Если мы передадим просто физический путь к файлу со случайным именем-идентификатором, получатель увидит нечитаемый набор символов вместо осмысленного названия (например, 466bd7bc...pdf).

Метод добавления вложения позволяет передать вторым параметром пользовательское представление. Воспользуемся этим:

ПочтовоеСообщение.Вложения.Добавить(ПолныйПуть, "Коммерческое_предложение.pdf");

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


ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресВХ);
ПочтовоеСообщение.Вложения.Добавить(ДвоичныеДанныеФайла, "Договор_с_клиентом.pdf");

Время жизни временного хранилища: почему файл исчезает?

Проанализируем еще одну типовую проблему. Часто отправка письма происходит не в тот же самый момент, когда файл помещается в хранилище, а позже (например, после нажатия пользователем кнопки «Отправить» на форме). При этом попытка получить файл возвращает Неопределено.

Это происходит из-за особенностей работы платформы 1С. Если метод ПоместитьВоВременноеХранилище вызывается на сервере без указания второго параметра, данные привязываются исключительно к текущему серверному вызову. Как только выполнение кода возвращается на клиент, временное хранилище очищается.

Чтобы файл не удалялся до тех пор, пока пользователь не закроет форму документа или обработки, необходимо явно связать данные с идентификатором этой формы:


// Для обычного приложения (как в нашей задаче):
АдресВХ = ПоместитьВоВременноеХранилище(Данные, ЭтотОбъект.УникальныйИдентификатор);

// Для управляемого приложения:
АдресВХ = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);

Благодаря этому параметру система сохранит наш PDF-документ во временном хранилище до момента фактической отправки электронного письма.

Использование стандартных механизмов БСП

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

В БСП предусмотрены специальные функции для работы с почтой и файлами. Например, функция УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища() (или аналогичные процедуры из подсистемы РаботаСФайлами). Эти инструменты:

  1. Автоматически обрабатывают адреса во временном хранилище.
  2. Корректно выделяют и назначают расширения.
  3. Безопасно заменяют недопустимые символы в именах файлов.
  4. Формируют готовую структуру, которую легко передать в методы отправки почты.

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

← На главную