Работа в облачном сервисе 1С:Предприятие через интернет (1С:Fresh) накладывает на разработчика расширений жесткие ограничения, связанные с безопасностью данных. Одной из самых частых причин отклонения расширения аудиторами является некорректная реализация взаимодействия со сторонними интернет-ресурсами. Разберем подробно, как правильно оформить запросы к внешним сайтам, чтобы ваше расширение успешно прошло проверку.
Проанализируем ситуацию: в облаке все расширения по умолчанию запускаются в безопасном режиме. Это означает, что любые попытки кода обратиться к файловой системе сервера, реестру или, что наиболее важно в нашем случае, к сети Интернет, будут немедленно блокироваться платформой. Для того чтобы запрос через HTTPСоединение или FTPСоединение прошел успешно, адрес ресурса должен быть явно разрешен в профиле безопасности конкретной информационной базы.
Аудиторы проверяют два ключевых аспекта:
Рассмотрим наиболее правильный с точки зрения архитектуры способ — использование программного интерфейса Библиотеки стандартных подсистем (БСП). Чтобы система «узнала» о намерениях вашего расширения еще на этапе его установки, необходимо реализовать специальную функцию в модуле расширения.
Выясним, как это работает. В модуле расширения (обычно это основной модуль или специализированный модуль управления расширением) необходимо прописать процедуру, которая будет возвращать список необходимых разрешений. Используем метод ПриОпределенииРазрешенийПредварительнойУстановки.
Посмотрим на пример реализации программного запроса доступа к конкретному URL-адресу:
Процедура ПриОпределенииРазрешенийПредварительнойУстановки(Разрешения) Экспорт
// Определяем адрес стороннего сервиса
АдресРесурса = "https://api.external-service.ru";
ПортРесурса = 443;
// Создаем разрешение на использование интернет-ресурса
НовоеРазрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
"HTTP",
АдресРесурса,
ПортРесурса,
"Взаимодействие с сервисом проверки контрагентов"
);
Разрешения.Добавить(НовоеРазрешение);
КонецПроцедуры
В данном коде мы используем объект РаботаВБезопасномРежиме. Это позволяет при загрузке расширения в Менеджер сервиса автоматически сформировать список ресурсов, которые администратор должен будет подтвердить. Если этого не сделать в коде, аудитор вернет расширение с замечанием о невозможности определить целевые ресурсы сети.
Если вы по каким-то причинам не используете программный интерфейс БСП (что не рекомендуется для Fresh), существует «ручной» путь. Рассмотрим ситуацию, когда расширение передается через посредников. В этом случае необходимо вместе с файлом .cfe передать сопроводительную документацию.
Проанализируем, что именно нужно передать ответственным за загрузку:
https://exchange.my-company.com/api/v1/).Эти данные вносятся вручную в карточку расширения в Менеджере сервиса. Однако помните: аудиторы все равно потребуют, чтобы в самом коде расширения был реализован механизм уведомления пользователя.
Иногда самым простым решением будет вынести выполнение запроса из серверного контекста в клиентский. Выясним причину, почему это помогает: в тонком клиенте или веб-клиенте запрос выполняется от лица приложения пользователя, а не от лица сервера 1С. Это снимает часть ограничений безопасного режима сервера.
Однако здесь есть свои нюансы:
Аудит 1С:Fresh не пропустит расширение, которое отправляет данные «втихую». Разберем, как реализовать диалог подтверждения. Если адрес ресурса заранее не определен (например, пользователь сам вводит его в настройках), вы обязаны использовать форму подтверждения.
Рекомендуется использовать стандартную подсистему БСП ЗапросРазрешенийНаИспользованиеВнешнихРесурсов. Это окно выглядит для пользователя привычно и повышает уровень доверия к приложению. Рассмотрим по шагам процесс реализации:
HTTPСоединение.Пример проверки разрешения перед выполнением операции:
&НаСервере
Функция ВыполнитьЗапросКСервису()
// Проверяем, дал ли пользователь согласие в настройках
Если Не НастройкиРасширения.ИспользованиеВнешнегоРесурсаРазрешено Тогда
ВызватьИсключение "Действие отменено: не получено разрешение пользователя на передачу данных.";
КонецЕсли;
// Код выполнения запроса...
Соединение = Новый HTTPСоединение("api.service.ru");
// ...
КонецФункции
Ситуация усложняется, если обмен должен происходить в фоновом режиме через РегламентныеЗадания. Поскольку в серверном коде нельзя вывести окно пользователю («здесь и сейчас»), подтверждение должно быть получено заранее.
Проанализируем правильный алгоритм для фоновых задач:
Разберем основные «грабли», на которые наступают разработчики:
УстановитьПривилегированныйРежим(Истина) для выполнения сетевого запроса гарантированно приведет к отклонению расширения. Аудиторы 1С:Fresh крайне строго следят за тем, чтобы привилегированный режим не использовался для потенциально опасных операций.Попытка ... Исключение и выводите пользователю понятное сообщение о недоступности сервиса.Подводя итог, прохождение аудита — это не просто «прописать адрес», а комплексная работа над прозрачностью вашего кода для пользователя и системы безопасности 1С:Fresh. Используйте методы БСП РаботаВБезопасномРежиме, всегда спрашивайте согласие пользователя и детально описывайте все внешние ресурсы при подаче расширения на проверку.