При автоматизации рассылок из 1С, например, при отправке расчетных листков сотрудникам или счетов клиентам, разработчики часто сталкиваются с проблемой именования вложений. Если файл формируется динамически во временном каталоге с помощью функции ПолучитьИмяВременногоФайла(), он получает системное имя вида v8_788_a.tmp. Отправка файла с таким названием конечному пользователю выглядит непрофессионально и неудобно для получателя. Рассмотрим, как программно задать понятное имя для вложения, не переименовывая сам файл в файловой системе.
Разберем ситуацию, с которой столкнулся автор темы. Изначально код выглядел следующим образом:
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Вложения.Добавить(ИмяФайла, "Расч.листок");
Почта.Послать(Сообщение);
Здесь переменная ИмяФайла содержит полный путь к файлу на диске (например, C:\Temp\v8_BC12.tmp). Несмотря на то, что во втором параметре метода Добавить() указано желаемое имя "Расч.листок", почтовый клиент все равно видит исходное имя системного файла. Это происходит потому, что при передаче пути строкой 1С зачастую отдает приоритет физическому имени файла на диске.
Для того чтобы гарантированно изменить имя файла в письме, проанализируем наиболее эффективный способ — передачу содержимого файла в виде потока байтов. Вместо того чтобы указывать путь к файлу, мы загружаем его в оперативную память как объект ДвоичныеДанные. В этом случае метод Добавить() коллекции Вложения воспринимает второй параметр именно как имя будущего файла в почтовом сообщении.
Рассмотрим пошагово исправленный алгоритм:
ДвоичныеДанные, считывая содержимое этого файла.Пример кода:
// Предположим, ПутьКВременномуФайлу уже содержит путь к v8_788_a.tmp
ДанныеДляВложения = Новый ДвоичныеДанные(ПутьКВременномуФайлу);
Сообщение = Новый ИнтернетПочтовоеСообщение;
// Указываем имя, которое увидит получатель
ИмяДляПолучателя = "Расчетный_листок_май.xls";
Сообщение.Вложения.Добавить(ДанныеДляВложения, ИмяДляПолучателя);
// Далее стандартная отправка через ИнтернетПочта
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Проанализируем типичную ошибку, на которую указали участники обсуждения. Если при задании имени вложения (например, "Расч.листок") вы забудете добавить расширение (.xls, .pdf, .xlsx), получатель может столкнуться с трудностями. Большинство почтовых клиентов и операционных систем определяют, какой программой открыть файл, именно по его расширению.
Важный совет: Всегда проверяйте, чтобы расширение в строковом имени вложения совпадало с реальным форматом данных внутри файла. Если вы сохранили таблицу 1С как ТипФайлаТабличногоДокумента.XLS, то и имя вложения должно заканчиваться на .xls.
Существует еще более гибкий способ управления вложениями. Вместо прямого использования метода Добавить() у коллекции вложений, мы можем сначала создать отдельный объект ИнтернетПочтовоеВложение. Это позволяет более тонко настраивать параметры передаваемого файла.
Разберем этот метод подробнее:
Сообщение = Новый ИнтернетПочтовоеСообщение;
Вложение = Сообщение.Вложения.Добавить(Новый ДвоичныеДанные(ПутьКФайлу));
Вложение.Имя = "Отчет_за_период.xlsx";
Вложение.ТипСодержимого = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Использование свойства ТипСодержимого (MIME-тип) гарантирует, что даже если почтовый клиент некорректно обработает имя, он все равно поймет, что перед ним таблица Excel. Это повышает надежность доставки писем в корпоративных сетях со строгими фильтрами безопасности.
При использовании кириллических имен (например, "РасчетныйЛисток.pdf") в некоторых старых почтовых клиентах имя может отобразиться некорректно. Выясним причину: это связано со стандартами кодирования заголовков писем. Чтобы минимизировать риски, рекомендуется:
ИнтернетПочтовоеСообщение установлена подходящая кодировка (обычно UTF-8).Рассмотрим ситуацию, когда файлов для отправки очень много или они имеют большой объем. Использование метода Новый ДвоичныеДанные() загружает содержимое файла в оперативную память процесса 1С. Если вы одновременно рассылаете тысячи расчетных листков по 5 Мб каждый, это может привести к резкому росту потребления памяти сервером 1С.
В таких случаях проанализируем альтернативный подход:
КопироватьФайл(), чтобы создать копию временного файла в другой временной папке, но уже с нужным "красивым" именем.УдалитьФайлы().Этот метод экономит оперативную память, так как 1С будет считывать файл порциями непосредственно при передаче в поток сокета, а не загружать его целиком в память заранее.
Если ваш сервер 1С работает под управлением Linux, помните о регистре символов. Расширение .XLS и .xls для Linux — это разные вещи. При формировании имени вложения старайтесь всегда придерживаться нижнего регистра для расширений и избегайте спецсимволов, которые могут быть запрещены в Windows (слэши, двоеточия, звездочки), так как получатель, скорее всего, будет открывать файл именно в Windows-среде.
Таким образом, мы выяснили, что наиболее простым и надежным способом изменить имя вложения является использование ДвоичныхДанных с обязательным указанием корректного расширения файла в параметрах метода Добавить().