При разработке регламентных заданий в 1С:Предприятие часто возникает задача автоматического уведомления пользователей о результатах выполнения тех или иных процессов. Начинающие разработчики нередко пытаются использовать для этого привычный Microsoft Outlook через механизмы COM-соединения, однако на стороне сервера такой подход сталкивается с серьезными препятствиями. В этой статье мы подробно разберем, почему интеграция с Outlook через COM-объекты не подходит для серверных задач, и изучим надежные альтернативные методы отправки почты.
Прежде чем перейти к написанию кода, давайте проанализируем ситуацию с технической точки зрения. Попытка создать объект Новый COMОбъект("Outlook.Application") внутри регламентного задания в большинстве случаев приведет к ошибке. Рассмотрим основные причины:
USR1CV8), обычно не имеет настроенного почтового профиля, и пройти авторизацию программно в фоновом режиме практически невозможно.Вместо использования клиентского приложения Outlook, мы рассмотрим использование протокола SMTP через встроенный объект 1С ИнтернетПочта и использование механизмов Библиотеки стандартных подсистем (БСП).
Этот метод является универсальным и работает независимо от установленного на сервере программного обеспечения. Мы будем подключаться напрямую к почтовому серверу. Давайте разберем по шагам, как настроить профиль и отправить сообщение.
Сначала нам необходимо создать и настроить профиль подключения. Рассмотрим пример функции, которая выполняет отправку:
Процедура ОтправитьПисьмоНапрямую(Тема, Адресат, ТекстСообщения) Экспорт
// 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. Отправка
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
// Записываем ошибку в журнал регистрации, так как Сообщить() в регламенте не сработает
ЗаписатьВЖурналРегистрации("ОтправкаПочты", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Важное примечание: При работе на сервере обязательно используйте конструкцию Попытка...Исключение и записывайте ошибки в Журнал регистрации. В регламентных заданиях метод Сообщить() не выводит информацию пользователю, и без логирования вы не узнаете о причинах сбоя.
Если ваша конфигурация построена на базе современных типовых решений (УТ 11, БП 3.0, ERP), лучшим выбором будет использование встроенной подсистемы "Работа с почтовыми сообщениями". Это значительно упрощает код и позволяет управлять учетными записями прямо из пользовательского интерфейса, не «зашивая» пароли в программный код.
Проанализируем пример использования метода РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение. Для этого нам понадобится ссылка на учетную запись электронной почты, настроенную в программе.
Процедура ОтправитьЧерезБСП() Экспорт
// Выбираем системную учетную запись или находим нужную по наименованию
УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты;
// Формируем структуру параметров письма
ПараметрыПисьма = Новый Структура;
ПараметрыПисьма.Вставить("Кому", "recipient@example.com");
ПараметрыПисьма.Вставить("Тема", "Отчет по регламентному заданию");
ПараметрыПисьма.Вставить("Тело", "Добрый день! Регламентное задание успешно завершено.");
ПараметрыПисьма.Вставить("ТипТекста", "ПростойТекст"); // Можно использовать "HTML"
// Если нужно прикрепить файл, создаем массив структур
// Вложения = Новый Массив;
// Вложение = Новый Структура("Представление, Данные", "Report.pdf", ДанныеФайла);
// Вложения.Добавить(Вложение);
// ПараметрыПисьма.Вставить("Вложения", Вложения);
Попытка
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
Исключение
ЗаписатьВЖурналРегистрации("РегламентнаяОтправка", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Использование БСП имеет ряд преимуществ:
Одна из причин, по которой пользователи просят использовать именно Outlook — это желание видеть отправленные роботом письма в папке "Отправленные" своего почтового клиента. При использовании прямой отправки по SMTP (как в примерах выше) письмо уходит сразу на сервер и не сохраняется в локальном приложении. Разберем, как решить эту задачу:
Метод 1: Скрытая копия (BCC). Мы можем программно добавить адрес отправителя в список скрытых копий сообщения. В этом случае письмо придет самому отправителю во "Входящие". Пользователь может настроить правило в Outlook, чтобы такие письма автоматически перемещались в папку "Отправленные".
Метод 2: Протокол IMAP. После успешной отправки письма по SMTP, мы можем подключиться к ящику через объект ИнтернетПочта по протоколу IMAP и программно сохранить письмо в папку "Sent". Это более сложный, но "чистый" способ.
Если ваше регламентное задание формирует отчет и должно отправить его файлом, помните о правах доступа. Серверный процесс 1С (rphost) не имеет доступа к папкам типа C:\Users\Администратор\Documents. Для работы с файлами всегда используйте временные хранилища и функцию ПолучитьИмяВременногоФайла(). Это гарантирует, что файл будет создан в папке, доступной серверу 1С, и не вызовет ошибок при обращении.
Рассмотрим краткий пример формирования вложения:
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
ОтчетОбъект.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
// Далее добавляем ИмяФайла в структуру параметров для БСП или в массив вложений ИнтернетПочтовоеСообщение
// После отправки не забываем удалить временный файл
УдалитьФайлы(ИмяФайла);
Подводя итог, можно сказать, что отказ от Outlook в пользу ИнтернетПочта или механизмов БСП — это единственный правильный путь для стабильной работы регламентных заданий. Это делает систему независимой от стороннего ПО и обеспечивает высокую надежность доставки уведомлений.