Как реализовать отправку почты в регламентном задании 1С без использования Outlook?

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

При разработке регламентных заданий в 1С:Предприятие часто возникает задача автоматического уведомления пользователей о результатах выполнения тех или иных процессов. Начинающие разработчики нередко пытаются использовать для этого привычный Microsoft Outlook через механизмы COM-соединения, однако на стороне сервера такой подход сталкивается с серьезными препятствиями. В этой статье мы подробно разберем, почему интеграция с Outlook через COM-объекты не подходит для серверных задач, и изучим надежные альтернативные методы отправки почты.

Почему нельзя использовать Outlook в регламентных заданиях?

Прежде чем перейти к написанию кода, давайте проанализируем ситуацию с технической точки зрения. Попытка создать объект Новый COMОбъект("Outlook.Application") внутри регламентного задания в большинстве случаев приведет к ошибке. Рассмотрим основные причины:

  1. Изоляция сессии 0 (Session 0 Isolation): Служба сервера 1С работает в неинтерактивной сессии Windows, где нет графического интерфейса. Outlook же спроектирован как интерактивное приложение. Ему требуется активный рабочий стол и профиль пользователя для запуска, чего в фоновом режиме сервера просто не существует.
  2. Лицензионные и технические ограничения Microsoft: Официальная документация Microsoft прямо заявляет, что пакет Office не предназначен для автоматизации на стороне сервера. Это ведет к утечкам памяти, зависаниям процесса и нестабильной работе всей системы.
  3. Авторизация: Outlook требует настройки MAPI-профиля под конкретным пользователем Windows. Учетная запись, под которой работает служба сервера 1С (например, USR1CV8), обычно не имеет настроенного почтового профиля, и пройти авторизацию программно в фоновом режиме практически невозможно.

Вместо использования клиентского приложения Outlook, мы рассмотрим использование протокола SMTP через встроенный объект 1С ИнтернетПочта и использование механизмов Библиотеки стандартных подсистем (БСП).

Вариант 1. Использование объекта ИнтернетПочта (SMTP)

Этот метод является универсальным и работает независимо от установленного на сервере программного обеспечения. Мы будем подключаться напрямую к почтовому серверу. Давайте разберем по шагам, как настроить профиль и отправить сообщение.

Сначала нам необходимо создать и настроить профиль подключения. Рассмотрим пример функции, которая выполняет отправку:


Процедура ОтправитьПисьмоНапрямую(Тема, Адресат, ТекстСообщения) Экспорт
    
    // 1. Настройка профиля подключения
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP = "smtp.mail.ru"; // Укажите ваш сервер
    Профиль.ПортSMTP = 465;                   // Обычно 465 (SSL) или 587 (TLS)
    Профиль.ИспользоватьSSLSMTP = Истина;
    Профиль.ПользовательSMTP = "your_login@mail.ru";
    Профиль.ПарольSMTP = "your_password";
    Профиль.ТолькоЛогинSMTP = Истина;

    // 2. Формирование сообщения
    Почта = Новый ИнтернетПочта;
    Сообщение = Новый ИнтернетПочтовоеСообщение;
    Сообщение.Получатели.Добавить(Адресат);
    Сообщение.Отправитель.Адрес = "your_login@mail.ru";
    Сообщение.Отправитель.ОтображаемоеИмя = "Робот 1С";
    Сообщение.Тема = Тема;
    
    // Добавление текста письма
    Сообщение.Тексты.Добавить(ТекстСообщения, ТипТекстаПочтовогоСообщения.ПростойТекст);

    // 3. Отправка
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Сообщение);
        Почта.Отключиться();
    Исключение
        // Записываем ошибку в журнал регистрации, так как Сообщить() в регламенте не сработает
        ЗаписатьВЖурналРегистрации("ОтправкаПочты", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;

КонецПроцедуры

Важное примечание: При работе на сервере обязательно используйте конструкцию Попытка...Исключение и записывайте ошибки в Журнал регистрации. В регламентных заданиях метод Сообщить() не выводит информацию пользователю, и без логирования вы не узнаете о причинах сбоя.

Вариант 2. Использование Библиотеки стандартных подсистем (БСП)

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

Проанализируем пример использования метода РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение. Для этого нам понадобится ссылка на учетную запись электронной почты, настроенную в программе.


Процедура ОтправитьЧерезБСП() Экспорт
    
    // Выбираем системную учетную запись или находим нужную по наименованию
    УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты;
    
    // Формируем структуру параметров письма
    ПараметрыПисьма = Новый Структура;
    ПараметрыПисьма.Вставить("Кому", "recipient@example.com");
    ПараметрыПисьма.Вставить("Тема", "Отчет по регламентному заданию");
    ПараметрыПисьма.Вставить("Тело", "Добрый день! Регламентное задание успешно завершено.");
    ПараметрыПисьма.Вставить("ТипТекста", "ПростойТекст"); // Можно использовать "HTML"
    
    // Если нужно прикрепить файл, создаем массив структур
    // Вложения = Новый Массив;
    // Вложение = Новый Структура("Представление, Данные", "Report.pdf", ДанныеФайла);
    // Вложения.Добавить(Вложение);
    // ПараметрыПисьма.Вставить("Вложения", Вложения);

    Попытка
        РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
    Исключение
        ЗаписатьВЖурналРегистрации("РегламентнаяОтправка", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;

КонецПроцедуры

Использование БСП имеет ряд преимуществ:

Как увидеть отправленные письма в Outlook?

Одна из причин, по которой пользователи просят использовать именно Outlook — это желание видеть отправленные роботом письма в папке "Отправленные" своего почтового клиента. При использовании прямой отправки по SMTP (как в примерах выше) письмо уходит сразу на сервер и не сохраняется в локальном приложении. Разберем, как решить эту задачу:

Метод 1: Скрытая копия (BCC). Мы можем программно добавить адрес отправителя в список скрытых копий сообщения. В этом случае письмо придет самому отправителю во "Входящие". Пользователь может настроить правило в Outlook, чтобы такие письма автоматически перемещались в папку "Отправленные".

Метод 2: Протокол IMAP. После успешной отправки письма по SMTP, мы можем подключиться к ящику через объект ИнтернетПочта по протоколу IMAP и программно сохранить письмо в папку "Sent". Это более сложный, но "чистый" способ.

Нюансы работы с файлами на сервере

Если ваше регламентное задание формирует отчет и должно отправить его файлом, помните о правах доступа. Серверный процесс 1С (rphost) не имеет доступа к папкам типа C:\Users\Администратор\Documents. Для работы с файлами всегда используйте временные хранилища и функцию ПолучитьИмяВременногоФайла(). Это гарантирует, что файл будет создан в папке, доступной серверу 1С, и не вызовет ошибок при обращении.

Рассмотрим краткий пример формирования вложения:


ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ОтчетОбъект.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

// Далее добавляем ИмяФайла в структуру параметров для БСП или в массив вложений ИнтернетПочтовоеСообщение
// После отправки не забываем удалить временный файл
УдалитьФайлы(ИмяФайла);

Подводя итог, можно сказать, что отказ от Outlook в пользу ИнтернетПочта или механизмов БСП — это единственный правильный путь для стабильной работы регламентных заданий. Это делает систему независимой от стороннего ПО и обеспечивает высокую надежность доставки уведомлений.

← На главную