Отправка писем непосредственно из системы 1С:Предприятие — стандартная задача для автоматизации любого бизнеса. Однако разработчики и администраторы часто сталкиваются со специфическим поведением почтовых систем. Две самые распространенные проблемы при работе с почтой из 1С: отправленные письма не появляются в папке «Отправленные» (Sent) вашего почтового ящика, а прикрепленные файлы Excel (в формате .xls или .xlsx) приходят получателям в поврежденном, «битом» виде или открываются в MS Outlook как непонятный набор символов (или файлов с расширением .bin).
В этой статье мы детально проанализируем причины возникновения обеих проблем и разберем по шагам надежные способы их решения на платформе 1С с примерами готового кода.
Для начала выясним причину, почему при отправке писем стандартным кодом 1С они не сохраняются в папке исходящих писем на сервере. При использовании объекта ИнтернетПочта отправка чаще всего идет по протоколу SMTP. Протокол SMTP (Simple Mail Transfer Protocol) исторически предназначен исключительно для транспортировки сообщений от отправителя к получателю. Он физически не умеет управлять папками на сервере и перемещать туда копии писем.
Существует три основных подхода к решению этой проблемы. Рассмотрим каждый из них подробнее.
Современный протокол IMAP, в отличие от SMTP, умеет работать со структурой папок на почтовом сервере. Мы можем подключиться к ящику по протоколу IMAP, найти системную папку «Отправленные» и принудительно записать туда отправленное сообщение. Начиная с версии платформы 8.3, механизм ИнтернетПочта полноценно поддерживает такую операцию.
Давайте разберем рабочий пример кода, который подключается к ящику, находит нужную папку (учитывая, что на разных серверах она может называться по-разному — Sent, SentBox, Отправленные, inbox.sent) и помещает туда письмо.
// Создаем профиль подключения к почте
Профиль = Новый ИнтернетПотовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.АдресСервераIMAP = "imap.yandex.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.Пользователь = "my_email@yandex.ru";
Профиль.Пароль = "my_app_password"; // Рекомендуется использовать специальный пароль приложения
// Создаем и заполняем письмо
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Отправитель = "my_email@yandex.ru";
Письмо.Тема = "Тестовая отправка отчета";
Письмо.Получатели.Добавить("client@mail.ru");
Текст = Письмо.Тексты.Добавить();
Текст.Текст = "Добрый день! Во вложении ваш отчет.";
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// Подключаемся к почте
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.SMTP);
// Отправляем письмо получателю по SMTP
Почта.Послать(Письмо);
Почта.Отключиться();
// Теперь подключаемся по IMAP для сохранения письма в папку "Отправленные"
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
// Получаем все папки нашего ящика
МассивЯщиков = Почта.ПолучитьПочтовыеЯщики();
ИмяПапкиОтправленные = "";
// Список возможных имен папки отправленных писем на сервере
ВозможныеИмена = Новый Массив;
ВозможныеИмена.Добавить("Отправленные");
ВозможныеИмена.Добавить("Sent");
ВозможныеИмена.Добавить("Sent Items");
ВозможныеИмена.Добавить("Sent Messages");
ВозможныеИмена.Добавить("inbox.sent");
Для Каждого ИмяПапки Из ВозможныеИмена Цикл
Если МассивЯщиков.Найти(ИмяПапки) <> Неопределено Тогда
ИмяПапкиОтправленные = ИмяПапки;
Прервать;
КонецЕсли;
КонецЦикла;
// Если папка успешно определена, загружаем туда письмо
Если ЗначениеЗаполнено(ИмяПапкиОтправленные) Тогда
Почта.ТекущийПочтовыйЯщик = ИмяПапкиОтправленные;
// Метод Положить сохраняет переданное сообщение в текущую папку на сервере IMAP
Почта.Положить(Письмо);
КонецЕсли;
Почта.Отключиться();
Важное примечание: Использование метода Положить() является наиболее стабильным решением, так как оно не выполняет повторную отправку письма получателю, а лишь синхронизирует локально сформированное в 1С сообщение с сервером IMAP.
Если у вас нет возможности или желания настраивать подключение по протоколу IMAP, существует проверенный временем «лайфхак». Мы можем автоматически добавлять адрес нашего собственного ящика-отправителя в поле скрытой копии (BCC) отправляемого сообщения.
В этом случае письмо гарантированно придет на ваш ящик, и вы сможете с помощью стандартных правил фильтрации в веб-интерфейсе вашей почты (например, на Яндексе или Mail.ru) автоматически переносить такие входящие письма от самого себя в папку «Отправленные». С точки зрения кода 1С это выглядит крайне просто:
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Отправитель = "my_email@yandex.ru";
Письмо.Получатели.Добавить("client@mail.ru");
// Добавляем себя в скрытую копию
СкрытаяКопия = Письмо.ПолучателиСкрытойКопии.Добавить("my_email@yandex.ru");
Этот способ не требует поддержки протокола IMAP со стороны 1С и исключает лишние задержки при обмене данными, однако требует разовой настройки правил сортировки в самом почтовом ящике.
Если на компьютере пользователя, из-под которого запускается отправка писем в 1С, установлен пакет Microsoft Office, мы можем использовать OLE-автоматизацию. При отправке через COM-соединение с Outlook, письмо физически создается в самом приложении-клиенте. Outlook самостоятельно берет на себя задачу отправки и синхронизации с сервером, помещая письмо в папку «Отправленные» в штатном режиме.
Попытка
Outlook = Новый COMОбъект("Outlook.Application");
Письмо = Outlook.CreateItem(0); // 0 - тип для MailItem
Письмо.Subject = "Тема письма из 1С";
Письмо.To = "client@mail.ru";
Письмо.Body = "Текст письма";
// Добавление вложения
Письмо.Attachments.Add("C:\temp\report.xlsx");
// Отправка письма
Письмо.Send();
Исключение
Сообщить("Не удалось запустить MS Outlook для отправки почты: " + ОписаниеОшибки());
КонецПопытки;
Главный минус данного способа — он жестко привязан к операционной системе Windows и установленному на конкретном рабочем месте приложению MS Outlook. Этот способ не подходит для работы на серверах под управлением Linux или в веб-клиенте.
---
Перейдем ко второй проблеме: получатели открывают письмо в MS Outlook, но вместо красивого файла .xlsx или .xls видят вложенный файл с непонятным расширением .bin или поврежденный документ, который Excel отказывается открывать из-за ошибок формата.
Проанализируем причины этой проблемы. Почтовые клиенты (и Outlook в особенности) крайне чувствительны к MIME-структуре письма. Если 1С отправляет вложение, не указывая правильный тип содержимого (Content-Type) или кодирует русское имя файла некорректно, Outlook не может правильно сопоставить файл с программой-обработчиком и «ломает» его структуру.
Давайте рассмотрим три ключевых шага для исправления этой ситуации.
По умолчанию, при добавлении вложения методом Вложения.Добавить(), платформа 1С может присвоить файлу общий тип application/octet-stream (двоичный поток). Почтовый сервер или Outlook, получая такой заголовок, часто не могут сообразить, что внутри находится табличный документ Excel. Нам необходимо вручную указать правильный MIME-тип для вложения.
Посмотрим на пример правильного заполнения вложений в 1С:
ПутьКФайлу = "C:\temp\report.xlsx";
// Создаем объект вложения
Вложение = Новый ИнтернетПочтовоеВложение(ПутьКФайлу);
// Определяем расширение файла для точной установки Content-Type
Расширение = НРег(Сред(ПутьКФайлу, СтрДлина(ПутьКФайлу) - 3));
Если Расширение = "xlsx" Тогда
// MIME-тип для современных файлов Excel (2007 и выше)
Вложение.ТипСодержимого = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
ИначеЕсли Расширение = ".xls" ИЛИ Расширение = "u.xls" Тогда
// MIME-тип для старого формата Excel 97-2003
Вложение.ТипСодержимого = "application/vnd.ms-excel";
Иначе
Вложение.ТипСодержимого = "application/octet-stream";
КонецЕсли;
// Указываем кодировку имени файла
Вложение.КодировкаИмени = "utf-8";
// Добавляем вложение в сообщение
Письмо.Вложения.Добавить(Вложение);
Передача русских букв в заголовках писем — давняя проблема почтовых стандартов. Outlook часто искажает имена файлов, содержащие русские буквы и пробелы (например, «Отчет по продажам за январь.xlsx»), превращая их в нечитаемую строку. Из-за этого теряется расширение файла, и он перестает открываться.
Рекомендация: Сохраняйте временные файлы отчетов перед отправкой, используя только латинские символы, цифры и символы подчеркивания. Например: report_sales_01_2026.xlsx. Если получателю критически важно видеть русское название, используйте кодирование заголовков или переименовывайте файл непосредственно в объекте вложения, предварительно установив свойство Имя латиницей.
Часто в коде 1С можно встретить следующую последовательность действий: табличный документ выгружается на диск методом ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLSX), и в следующей же строке кода этот файл добавляется во вложение и отправляется.
При работе на быстрых серверах или при высоком объеме писем может возникнуть ситуация «гонки данных»: операционная система еще не успела физически завершить запись файла на диск и снять с него блокировку, а платформа 1С уже пытается прочитать его для отправки. В результате отправляется пустой или недозаписанный файл. Получатель видит ошибку формата при попытке открыть его в Outlook.
Для гарантированного решения этой проблемы в современной платформе 1С 8.3 рекомендуется формировать двоичные данные файла прямо в памяти компьютера без записи на жесткий диск:
// Формируем табличный документ отчета
ТабДок = Новый ТабличныйДокумент;
// ... тут заполняем отчет данными ...
// Записываем табличный документ во временный поток в памяти
ПотокВПамяти = Новый ПотокВПамяти;
ТабДок.Записать(ПотокВПамяти, ТипФайлаТабличногоДокумента.XLSX);
// Получаем чистые двоичные данные
ДвоичныеДанныеФайла = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
// Добавляем вложение напрямую из двоичных данных, минуя жесткий диск
Вложение = Письмо.Вложения.Добавить(ДвоичныеДанныеФайла, "report.xlsx");
Вложение.ТипСодержимого = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Использование ПотокВПамяти полностью защищает файлы от блокировок операционной системы, ускоряет работу программы и гарантирует, что Outlook получит абсолютно целое вложение без повреждений структуры документа.
Применяя данные методы интеграции протокола IMAP и корректную установку параметров MIME для вложений в коде 1С, вы сможете навсегда забыть о «пропавших» письмах и жалобах ваших пользователей на нечитаемые отчеты в MS Outlook.