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

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

Разработка расширений конфигурации и дополнительных отчетов или обработок для работы в облачном сервисе 1С:Предприятие через интернет (1С:Фреш) накладывает жесткие ограничения на безопасность. Все кастомные программные модули выполняются на стороне сервера в так называемом безопасном режиме. В этом режиме по умолчанию полностью заблокированы любые сетевые запросы во внешнюю сеть, включая отправку электронной почты по протоколам SMTP/IMAP или обращение к внешним веб-сервисам по HTTP/HTTPS.

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

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

Почему стандартный код отправки почты вызывает ошибку?

Давайте проанализируем ситуацию. Если мы попытаемся выполнить стандартный код инициализации почтового профиля и отправки письма непосредственно на сервере без предварительной подготовки профиля безопасности:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;

Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);

Платформа 1С незамедлительно заблокирует данную операцию и вызовет исключение, сообщающее о нарушении прав безопасности. Платформа делает это потому, что сетевой порт 465 для адреса "smtp.yandex.ru" не зарегистрирован в разрешенных правилах для текущей области данных.

Выясним, как правильно декларировать такие запросы и как заставить регламентное задание работать в фоновом режиме с внешними адресами.

Сценарий 1. Адрес почтового сервера известен заранее (статический сценарий)

Рассмотрим случай, когда ваше расширение всегда отправляет системные или сервисные уведомления через один и тот же фиксированный SMTP-сервер. В этой ситуации мы можем запросить разрешение превентивно — прямо в коде расширения при его установке в базу.

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

  1. В расширении создаем или используем общий модуль (например, РаботаВБезопасномРежимеПереопределяемый).
  2. В процедуре ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам программно формируем запрос на доступ к конкретному хосту и порту.

Посмотрим на пример реализации кода в общем модуле:


Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(Разрешения) Экспорт
    
    // Задаем параметры целевого сервера
    Протокол = "SMTP";
    Адрес = "smtp.yandex.ru";
    Порт = 465;
    Описание = "Отправка сервисных писем и уведомлений из расширения";
    
    // Формируем объект разрешения с помощью программного интерфейса БСП
    НовоеРазрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
        Протокол, 
        Адрес, 
        Порт, 
        Описание
    );
    
    // Добавляем созданное разрешение в общий массив разрешений базы данных
    Разрешения.Добавить(НовоеРазрешение);
    
КонецПроцедуры

Когда администратор сервиса или менеджер будет загружать ваше расширение в Личный кабинет 1С:Фреш (в разделе «Адаптация»), система автоматически проанализирует этот код и предложит создать соответствующий профиль безопасности в кластере серверов. После прохождения аудита расширение получит постоянный санкционированный доступ к указанному хосту.

Сценарий 2. Адрес настраивается пользователем динамически (динамический сценарий)

Чаще всего встречается иная ситуация: каждый клиент сервиса использует свой собственный почтовый ящик и свой собственный SMTP/IMAP сервер. Заранее прописать адрес в коде невозможно, так как разработчик его не знает.

Поскольку фоновые регламентные задания выполняются на сервере без участия человека, они принципиально не могут вывести на экран интерактивный диалог с вопросом «Разрешить доступ к новому адресу?». Следовательно, всю процедуру настройки и одобрения мы должны переложить на клиентскую часть приложения — туда, где пользователь настраивает параметры интеграции.

Рассмотрим подробнее схему реализации этого механизма:

Шаг 1. Создание формы настроек на клиенте.

Создадим форму (например, форму настроек нашей обработки или расширения), на которой разместим поля ввода для адреса сервера, порта, логина и пароля.

Шаг 2. Получение программного описания запроса на сервере.

Напишем серверную функцию, которая считывает введенные пользователем данные и подготавливает структуру запроса на доступ к внешнему ресурсу через API БСП.


&НаСервере
Функция ПолучитьЗапросыНаРазрешениеНаСервере()
    
    Запросы = Новый Массив;
    
    // Считываем динамические параметры, введенные пользователем на форме
    Протокол = "SMTP";
    Адрес = Объект.АдресСервераSMTP; // Например, "smtp.mail.ru"
    Порт = Объект.ПортSMTP;          // Например, 465
    Описание = "Доступ к личному почтовому серверу компании";
    
    // Генерируем запрос разрешения
    Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
        Протокол, 
        Адрес, 
        Порт, 
        Описание
    );
    
    Запросы.Добавить(Разрешение);
    
    Возврат Запросы;
    
КонецФункции

Шаг 3. Интерактивный вызов на клиенте.

При нажатии кнопки «Сохранить настройки» мы должны вызвать специальную процедуру БСП, которая перехватит управление, вызовет системное окно платформы и заставит пользователя нажать кнопку согласия.


&НаКлиенте
Процедура ЗаписатьНастройкиИРазрешитьДоступ(Команда)
    
    // Получаем массив сформированных запросов безопасности с сервера
    Запросы = ПолучитьЗапросыНаРазрешениеНаСервере();
    
    // Задаем обработчик завершения, который выполнится после того, как пользователь сделает выбор
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПримененияРазрешений", ЭтотОбъект);
    
    // Вызываем интерактивное окно БСП для подтверждения прав администратором базы
    РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(
        Запросы, 
        ЭтотОбъект, 
        ОписаниеОповещения
    );
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеПримененияРазрешений(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат = КодВозвратаДиалога.ОК Тогда
        // Пользователь нажал "Разрешить". Теперь настройки можно безопасно сохранить в БД.
        ЗаписатьНастройкиНаСервере();
        ПоказатьПредупреждение(, "Доступ успешно разрешен. Настройки сохранены!");
    Иначе
        // Отказ в предоставлении прав
        ПоказатьПредупреждение(, "Внимание! Без предоставления сетевых прав отправка почты будет недоступна.");
    КонецЕсли;
    
КонецПроцедуры

Выясним важную деталь: куда записывается само техническое разрешение? Разработчику не нужно заботиться о физическом сохранении сетевого разрешения в системных файлах или реестрах. Как только метод РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов() успешно завершается с результатом КодВозвратаДиалога.ОК, платформа 1С автоматически регистрирует этот адрес в действующем профиле безопасности данной информационной базы в кластере серверов 1С.

Вам остается лишь сохранить параметры авторизации (адрес сервера, порт, логин) в стандартный справочник или константу вашего расширения, чтобы использовать их в дальнейшем.

Как это работает в регламентном задании?

После того как уполномоченный пользователь один раз интерактивно подтвердил права доступа к настроенному SMTP-серверу на клиенте, фоновое (регламентное) задание на сервере сможет беспрепятственно выполнять код отправки писем. При выполнении метода подключения к интернет-почте платформа сверится с зарегистрированным профилем безопасности, увидит одобренный адрес и порт и успешно пропустит сетевой пакет во внешнюю сеть.

Если в будущем пользователь решит сменить провайдера почты (например, перейти с Yandex на Mail.ru), ему будет достаточно зайти в форму настроек, ввести новые данные и повторно пройти процедуру интерактивного одобрения доступа.

← На главную