В корпоративных информационных системах нередко возникает ситуация, когда почтовый сервер (например, Microsoft Exchange) настроен на прием исходящих сообщений по протоколу SMTP только с одного доверенного IP-адреса. При этом пользователи работают в распределенной среде или через клиент-серверную базу 1С, создавая документы электронных писем, которые должны автоматически отправляться во внешний мир.
Разберем, как устроена работа регламентных заданий в платформе 1С, выясним причину сетевых ограничений и рассмотрим несколько надежных вариантов решения этой задачи.
Проанализируем поведение регламентных заданий в клиент-серверном варианте работы. В отличие от файлового режима, где для выполнения фоновых задач требуется отдельный сеанс пользователя, в клиент-серверной базе регламентные задания всегда выполняются на стороне кластера серверов 1С в рабочем процессе rphost. Это влечет за собой несколько важных моментов:
rphost, выполняющий конкретное фоновое задание. Если доступ разрешен для рабочей станции администратора, а сервер 1С находится на другом узле, регламентное задание завершится сетевой ошибкой таймаута или отказом в соединении.usr1cv8). Если на почтовом сервере используется NTLM или авторизация Windows, у службы должны быть соответствующие права.Прежде чем дорабатывать конфигурацию 1С, рассмотрим варианты на уровне системного администрирования. В большинстве случаев ограничение связано с параметрами Receive Connector в Microsoft Exchange, где настроен релей без аутентификации строго по диапазону доверенных IP-адресов.
Наиболее правильный подход — обратиться к системным администраторам почтового сервера и внести IP-адрес сервера 1С в список разрешенных узлов (параметр RemoteIPRanges коннектора получения), либо выделить сервисному пользователю 1С отдельную учетную запись с паролем для аутентификации по SMTP.
Если доступ к настройкам Exchange невозможен, на доверенном компьютере можно настроить локальный SMTP-relay (или перенаправление портов). В этом случае сервер 1С будет отправлять почту на разрешенный компьютер, а тот — пересылать сообщения в Exchange от своего доверенного имени.
Если сервер 1С имеет прямой доступ к почтовому серверу, задача сводится к созданию регламентного задания. Рассмотрим типовые ошибки, которые часто допускают разработчики при написании подобного функционала, и напишем правильный код.
Посмотрим на пример кода с грубыми ошибками:
// Неоптимальный подход с ошибками:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЭлектронноеПисьмо.Номер
|ИЗ
| Документ.ЭлектронноеПисьмо КАК ЭлектронноеПисьмо
|ГДЕ
| ЭлектронноеПисьмо.СтатусПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыПисем.Исходящее)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
док = Документы.ЭлектронноеПисьмо.НайтиПоНомеру(Выборка.Номер);
док.ПолучитьОбъект().ОтправитьПисьмо();
КонецЦикла;
Проанализируем слабые места этого фрагмента:
Кастом_ЭлектроннаяПочтаСервер) с признаками выполнения Сервер и Вызов сервера. Это позволит избежать потери изменений при обновлении типовой конфигурации.Ссылка.Попытка ... Исключение.Разберем правильный вариант реализации процедуры для регламентного задания:
Процедура ОтправитьИсходящуюПочту() Экспорт
Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Письмо.Ссылка КАК Ссылка
|ИЗ
| Документ.ЭлектронноеПисьмо КАК Письмо
|ГДЕ
| Письмо.СтатусПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыПисем.Исходящее)
| И НЕ Письмо.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Попытка
ОбъектПисьма = Выборка.Ссылка.ПолучитьОбъект();
Если ОбъектПисьма <> Неопределено Тогда
// Вызываем метод отправки документа
ОбъектПисьма.ОтправитьПисьмо();
КонецЕсли;
Исключение
// Записываем ошибку в журнал регистрации для дальнейшего анализа
ЗаписьЖурналаРегистрации(
"Отправка почты",
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Документы.ЭлектронноеПисьмо,
Выборка.Ссылка,
ОписаниеОшибки()
);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
После создания процедуры в общем модуле добавим в ветку конфигурации РегламентныеЗадания новое задание, укажем в качестве метода вызова нашу процедуру и настроим необходимое расписание (например, каждые 5 минут).
Если изменить правила сетевого экрана или настройки Exchange невозможно, а сервер 1С не имеет доступа к почтовику, остается путь запуска сеанса с той машины, которой отправка разрешена:
1cv8.exe со специальными командными ключами: ENTERPRISE /S "Сервер1С\ИмяБазы" /N "ПочтовыйБот" /P "Пароль" /Execute "C:\Scripts\SendMail.epf".ПриОткрытии инициируется процедура отправки, по завершении которой вызывается метод ЗавершитьРаботуСистемы(Ложь).Такой подход позволяет обойти ограничения сетевой топологии без сложных манипуляций с портами и маршрутизацией.