При переносе или адаптации дополнительных отчетов и обработок разработчики часто сталкиваются с неприятной ситуацией. Внешняя обработка, зарегистрированная в справочнике дополнительного программного обеспечения, отлично выполняет внешние запросы к API или веб-сайтам под учетной записью администратора с полными правами. Однако, как только за дело берется обычный пользователь с ограниченными правами, система моментально прерывает работу на строке инициализации HTTPСоединение и выдает ошибку: «Установлен безопасный режим. Выполнение операции отменено».
Давайте подробно проанализируем, почему возникает это поведение платформы «1С:Предприятие», разберем скрытые механизмы защиты БСП (Библиотеки стандартных подсистем) и рассмотрим пошаговые решения этой проблемы как для локальных баз, так и для облачного сервиса «1С:Fresh».
Для понимания сути проблемы нужно заглянуть под капот платформы 1С. Разница в поведении пользователей обусловлена двумя ключевыми факторами:
HTTPСоединение) приостанавливает поток выполнения и выводит интерактивный диалог пользователю с вопросом: «Разрешить выполнение этого действия?». Если код выполняется на сервере (или в фоновом задании), интерактивный диалог физически невозможно показать пользователю. Платформа расценивает отсутствие возможности получить интерактивное подтверждение как отказ и генерирует исключение «Выполнение операции отменено». У администраторов защита от опасных действий часто либо изначально отключена в конфигураторе, либо администратор уже подтвердил это действие в интерактивном режиме ранее, и платформа запомнила выбор для его сеанса. У обычных пользователей этот флаг всегда активен, а интерактивно подтвердить серверный вызов они не могут.Рассмотрим подробнее пошаговые сценарии обхода и решения этой проблемы.
Это один из самых надежных программных способов обойти ограничения обычного пользователя. Если логика работы позволяет выполнять соединение на сервере без контроля ограничений прав текущего пользователя, мы можем временно переключить контекст выполнения в привилегированный режим.
Однако помните: в безопасном режиме платформа по умолчанию игнорирует вызов метода УстановитьПривелигированныйРежим(). Чтобы платформа разрешила этот переход, мы должны явно задекларировать это разрешение при регистрации обработки в БСП.
Разберем по шагам реализацию этого механизма:
Шаг 1. В модуле объекта внешней обработки в функции СведенияОВнешнейОбработке() добавляем специальный запрос на использование привилегированного режима:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
// Заполнение стандартных реквизитов регистрации
ПараметрыРегистрации.Информация = "Дополнительная обработка интеграции с внешним API";
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0.0.1";
ПараметрыРегистрации.БезопасныйРежим = Истина;
// Создаем массив разрешений
Разрешения = Новый Массив;
// Добавляем разрешение на переход в привилегированный режим
Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима());
// Добавляем разрешение на конкретный интернет-ресурс (обязательно для безопасного режима)
Протокол = "HTTPS";
АдресЗапроса = "api.yourservice.ru";
Порт = 443;
Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, АдресЗапроса, Порт));
ПараметрыРегистрации.Вставить("Разрешения", Разрешения);
Возврат ПараметрыРегистрации;
КонецФункции
Шаг 2. В коде обработки, непосредственно перед созданием соединения, включаем привилегированный режим, выполняем целевое действие и обязательно выключаем его обратно:
Процедура ВыполнитьЗапросКСерверу() Экспорт
// Переходим в привилегированный режим
УстановитьПривелигированныйРежим(Истина);
Если ПривилегированныйРежим() Тогда
Попытка
// Платформа разрешит создание соединения, так как мы находимся в привилегированном контексте
Соединение = Новый HTTPСоединение("api.yourservice.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v1/get_data");
Ответ = Соединение.Получить(Запрос);
КодСостояния = Ответ.КодСостояния;
// Дальнейшая обработка полученного ответа...
Исключение
ЗаписатьВЖурналРегистрации("ВнешняяОбработка.ОшибкаСоединения",
УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
ВызватьИсключение "Не удалось связаться с внешним сервисом API: " + ОписаниеОшибки();
КонецПопытки;
Иначе
ВызватьИсключение "Не удалось войти в привилегированный режим выполнения!";
КонецЕсли;
// Обязательно возвращаем контекст в исходное состояние
УстановитьПривелигированныйРежим(Ложь);
КонецПроцедуры
Часто разработчики забывают, что простого написания кода с разрешениями в модуле обработки недостаточно. Платформа 1С требует, чтобы администратор системы подтвердил создание профиля безопасности для конкретной новой обработки в режиме «1С:Предприятие».
Проанализируем шаги настройки в пользовательском интерфейсе:
После этой процедуры профиль безопасности жестко привяжется к идентификатору обработки в справочнике БСП, и обычные пользователи смогут без препятствий использовать прописанные каналы связи.
Если ваша база данных развернута локально (на вашем собственном сервере или файловом ресурсе), а не в облаке «1С:Fresh», вы можете полностью отключить механизм защиты от опасных действий для конкретных пользователей, под которыми падает обработка.
Сделать это можно двумя путями:
Вариант А. Настройка через Конфигуратор:
Вариант Б. Глобальное отключение через файл conf.cfg:
Если пользователей в базе очень много, вы можете отключить защиту централизованно на стороне сервера 1С. Для этого в конфигурационном файле conf.cfg (который по умолчанию располагается в каталоге установленной платформы C:\Program Files\1cv8\conf\) необходимо прописать следующую строку:
DisableUnsafeActionProtection=.*
Эта настройка отключит вывод предупреждающих диалогов на сервере для абсолютно всех внешних обработок и пользователей информационной базы.
В облачном сервисе «1С:Fresh» действуют самые строгие правила безопасности, и отключить защиту от опасных действий или глобально отредактировать профиль безопасности кластера через конфигурационный файл невозможно. В модели сервиса (SaaS) действуют жесткие правила прохождения аудита кода.
При адаптации обработки под «1С:Fresh» учитывайте следующие требования:
Иногда разработчики переносят шаблон функции СведенияОВнешнейОбработке() из старых проектов, жестко прописывая устаревшую версию БСП (например, "1.2.1.4"). Если версия БСП в коде обработки кардинально отличается от фактической версии БСП, используемой в вашей конфигурации, то механизмы регистрации разрешений отработают некорректно или запишутся со сбоями.
Для предотвращения подобных ошибок рекомендуется определять актуальную версию библиотеки БСП программным путем:
Функция СведенияОВнешнейОбработке() Экспорт
// Определяем текущую версию БСП в работающей конфигурации
ВерсияБСП = СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
// Передаем актуальную версию для формирования правильной структуры параметров
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП);
// Заполняем остальные параметры...
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
Возврат ПараметрыРегистрации;
КонецФункции
Этот простой шаг гарантирует, что структура разрешений безопасности будет сформирована в строгом соответствии с требованиями вашей текущей конфигурации 1С, что минимизирует вероятность программных ошибок при запуске кода под ограниченными правами.