Разработка расширений конфигурации и дополнительных отчетов или обработок для работы в облачном сервисе 1С:Предприятие через интернет (1С:Фреш) накладывает жесткие ограничения на безопасность. Все кастомные программные модули выполняются на стороне сервера в так называемом безопасном режиме. В этом режиме по умолчанию полностью заблокированы любые сетевые запросы во внешнюю сеть, включая отправку электронной почты по протоколам SMTP/IMAP или обращение к внешним веб-сервисам по HTTP/HTTPS.
Для того чтобы обойти это ограничение и позволить серверному коду (в том числе выполняющемуся в фоне регламентному заданию) отправлять данные наружу, необходимо использовать механизмы Библиотеки стандартных подсистем (БСП) для запроса и регистрации разрешений в профиле безопасности информационной базы.
В этой статье мы подробно разберем, как устроен этот механизм, и рассмотрим два основных сценария реализации: когда адрес внешнего ресурса известен заранее (статический сценарий) и когда адрес вводит сам пользователь в интерфейсе (динамический сценарий).
Давайте проанализируем ситуацию. Если мы попытаемся выполнить стандартный код инициализации почтового профиля и отправки письма непосредственно на сервере без предварительной подготовки профиля безопасности:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Платформа 1С незамедлительно заблокирует данную операцию и вызовет исключение, сообщающее о нарушении прав безопасности. Платформа делает это потому, что сетевой порт 465 для адреса "smtp.yandex.ru" не зарегистрирован в разрешенных правилах для текущей области данных.
Выясним, как правильно декларировать такие запросы и как заставить регламентное задание работать в фоновом режиме с внешними адресами.
Рассмотрим случай, когда ваше расширение всегда отправляет системные или сервисные уведомления через один и тот же фиксированный SMTP-сервер. В этой ситуации мы можем запросить разрешение превентивно — прямо в коде расширения при его установке в базу.
Для этого нам потребуется переопределить стандартный обработчик БСП. Разберем по шагам, как это сделать:
РаботаВБезопасномРежимеПереопределяемый).ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам программно формируем запрос на доступ к конкретному хосту и порту.Посмотрим на пример реализации кода в общем модуле:
Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(Разрешения) Экспорт
// Задаем параметры целевого сервера
Протокол = "SMTP";
Адрес = "smtp.yandex.ru";
Порт = 465;
Описание = "Отправка сервисных писем и уведомлений из расширения";
// Формируем объект разрешения с помощью программного интерфейса БСП
НовоеРазрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
Протокол,
Адрес,
Порт,
Описание
);
// Добавляем созданное разрешение в общий массив разрешений базы данных
Разрешения.Добавить(НовоеРазрешение);
КонецПроцедуры
Когда администратор сервиса или менеджер будет загружать ваше расширение в Личный кабинет 1С:Фреш (в разделе «Адаптация»), система автоматически проанализирует этот код и предложит создать соответствующий профиль безопасности в кластере серверов. После прохождения аудита расширение получит постоянный санкционированный доступ к указанному хосту.
Чаще всего встречается иная ситуация: каждый клиент сервиса использует свой собственный почтовый ящик и свой собственный SMTP/IMAP сервер. Заранее прописать адрес в коде невозможно, так как разработчик его не знает.
Поскольку фоновые регламентные задания выполняются на сервере без участия человека, они принципиально не могут вывести на экран интерактивный диалог с вопросом «Разрешить доступ к новому адресу?». Следовательно, всю процедуру настройки и одобрения мы должны переложить на клиентскую часть приложения — туда, где пользователь настраивает параметры интеграции.
Рассмотрим подробнее схему реализации этого механизма:
Шаг 1. Создание формы настроек на клиенте.
Создадим форму (например, форму настроек нашей обработки или расширения), на которой разместим поля ввода для адреса сервера, порта, логина и пароля.
Шаг 2. Получение программного описания запроса на сервере.
Напишем серверную функцию, которая считывает введенные пользователем данные и подготавливает структуру запроса на доступ к внешнему ресурсу через API БСП.
&НаСервере
Функция ПолучитьЗапросыНаРазрешениеНаСервере()
Запросы = Новый Массив;
// Считываем динамические параметры, введенные пользователем на форме
Протокол = "SMTP";
Адрес = Объект.АдресСервераSMTP; // Например, "smtp.mail.ru"
Порт = Объект.ПортSMTP; // Например, 465
Описание = "Доступ к личному почтовому серверу компании";
// Генерируем запрос разрешения
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
Протокол,
Адрес,
Порт,
Описание
);
Запросы.Добавить(Разрешение);
Возврат Запросы;
КонецФункции
Шаг 3. Интерактивный вызов на клиенте.
При нажатии кнопки «Сохранить настройки» мы должны вызвать специальную процедуру БСП, которая перехватит управление, вызовет системное окно платформы и заставит пользователя нажать кнопку согласия.
&НаКлиенте
Процедура ЗаписатьНастройкиИРазрешитьДоступ(Команда)
// Получаем массив сформированных запросов безопасности с сервера
Запросы = ПолучитьЗапросыНаРазрешениеНаСервере();
// Задаем обработчик завершения, который выполнится после того, как пользователь сделает выбор
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПримененияРазрешений", ЭтотОбъект);
// Вызываем интерактивное окно БСП для подтверждения прав администратором базы
РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(
Запросы,
ЭтотОбъект,
ОписаниеОповещения
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПримененияРазрешений(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.ОК Тогда
// Пользователь нажал "Разрешить". Теперь настройки можно безопасно сохранить в БД.
ЗаписатьНастройкиНаСервере();
ПоказатьПредупреждение(, "Доступ успешно разрешен. Настройки сохранены!");
Иначе
// Отказ в предоставлении прав
ПоказатьПредупреждение(, "Внимание! Без предоставления сетевых прав отправка почты будет недоступна.");
КонецЕсли;
КонецПроцедуры
Выясним важную деталь: куда записывается само техническое разрешение? Разработчику не нужно заботиться о физическом сохранении сетевого разрешения в системных файлах или реестрах. Как только метод РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов() успешно завершается с результатом КодВозвратаДиалога.ОК, платформа 1С автоматически регистрирует этот адрес в действующем профиле безопасности данной информационной базы в кластере серверов 1С.
Вам остается лишь сохранить параметры авторизации (адрес сервера, порт, логин) в стандартный справочник или константу вашего расширения, чтобы использовать их в дальнейшем.
После того как уполномоченный пользователь один раз интерактивно подтвердил права доступа к настроенному SMTP-серверу на клиенте, фоновое (регламентное) задание на сервере сможет беспрепятственно выполнять код отправки писем. При выполнении метода подключения к интернет-почте платформа сверится с зарегистрированным профилем безопасности, увидит одобренный адрес и порт и успешно пропустит сетевой пакет во внешнюю сеть.
Если в будущем пользователь решит сменить провайдера почты (например, перейти с Yandex на Mail.ru), ему будет достаточно зайти в форму настроек, ввести новые данные и повторно пройти процедуру интерактивного одобрения доступа.