Почему дополнительная обработка в безопасном режиме работает под полными правами, но выдает ошибку у обычных пользователей?

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

При переносе или адаптации дополнительных отчетов и обработок разработчики часто сталкиваются с неприятной ситуацией. Внешняя обработка, зарегистрированная в справочнике дополнительного программного обеспечения, отлично выполняет внешние запросы к API или веб-сайтам под учетной записью администратора с полными правами. Однако, как только за дело берется обычный пользователь с ограниченными правами, система моментально прерывает работу на строке инициализации HTTPСоединение и выдает ошибку: «Установлен безопасный режим. Выполнение операции отменено».

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

Выясняем причину: почему поведение администратора и обычного пользователя различается?

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

  1. Механизм защиты от опасных действий. Начиная с версии платформы 8.3.9, в системе реализована защита, которая при попытке выполнить потенциально небезопасную операцию (например, создание COM-объекта, чтение файлов на сервере или создание HTTPСоединение) приостанавливает поток выполнения и выводит интерактивный диалог пользователю с вопросом: «Разрешить выполнение этого действия?». Если код выполняется на сервере (или в фоновом задании), интерактивный диалог физически невозможно показать пользователю. Платформа расценивает отсутствие возможности получить интерактивное подтверждение как отказ и генерирует исключение «Выполнение операции отменено». У администраторов защита от опасных действий часто либо изначально отключена в конфигураторе, либо администратор уже подтвердил это действие в интерактивном режиме ранее, и платформа запомнила выбор для его сеанса. У обычных пользователей этот флаг всегда активен, а интерактивно подтвердить серверный вызов они не могут.
  2. Особенности применения профилей безопасности БСП. Когда обработка запускается в безопасном режиме, подсистема БСП динамически управляет правами и разрешениями. Для применения профиля безопасности в кластере серверов требуются административные права. Под учетной записью обычного пользователя БСП не может «на лету» модифицировать или временно расширить разрешения сеанса в кластере 1С. В результате обработка для обычного пользователя запускается в максимально урезанном, стандартном безопасном режиме, игнорируя прописанные в коде разрешения на внешние ресурсы.

Рассмотрим подробнее пошаговые сценарии обхода и решения этой проблемы.

Решение 1. Использование привилегированного режима в коде обработки

Это один из самых надежных программных способов обойти ограничения обычного пользователя. Если логика работы позволяет выполнять соединение на сервере без контроля ограничений прав текущего пользователя, мы можем временно переключить контекст выполнения в привилегированный режим.

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

Разберем по шагам реализацию этого механизма:

Шаг 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: " + ОписаниеОшибки();
        КонецПопытки;
    Иначе
        ВызватьИсключение "Не удалось войти в привилегированный режим выполнения!";
    КонецЕсли;
    
    // Обязательно возвращаем контекст в исходное состояние
    УстановитьПривелигированныйРежим(Ложь);

КонецПроцедуры

Решение 2. Интерактивная настройка и подтверждение разрешений администратором

Часто разработчики забывают, что простого написания кода с разрешениями в модуле обработки недостаточно. Платформа 1С требует, чтобы администратор системы подтвердил создание профиля безопасности для конкретной новой обработки в режиме «1С:Предприятие».

Проанализируем шаги настройки в пользовательском интерфейсе:

  1. Зайдите в информационную базу под пользователем с полными административными правами.
  2. Перейдите в раздел Администрирование (или НСИ и администрирование), далее выберите пункт Печатные формы, отчеты и обработки.
  3. Откройте список дополнительных отчетов и обработок и найдите вашу обработку в списке.
  4. Обратите внимание на предупреждающие знаки или гиперссылки рядом с наименованием обработки. БСП часто выводит предупреждение о том, что для работы обработки требуются разрешения безопасности, которые еще не активированы.
  5. Нажмите кнопку Настроить разрешения. В открывшемся окне отобразится список запрашиваемых разрешений (в нашем случае — доступ к веб-сайту).
  6. Нажмите кнопку Продолжить (или Применить). Система автоматически обратится к кластеру серверов 1С и обновит настройки профилей безопасности.

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

Решение 3. Отключение защиты от опасных действий (для локальных баз)

Если ваша база данных развернута локально (на вашем собственном сервере или файловом ресурсе), а не в облаке «1С:Fresh», вы можете полностью отключить механизм защиты от опасных действий для конкретных пользователей, под которыми падает обработка.

Сделать это можно двумя путями:

Вариант А. Настройка через Конфигуратор:

  1. Откройте информационную базу в режиме Конфигуратор.
  2. Перейдите в меню Администрирование -> Пользователи.
  3. Откройте карточку нужного пользователя, под которым возникает ошибка.
  4. Перейдите на вкладку Основные.
  5. Найдите и снимите флажок «Защита от опасных действий».
  6. Сохраните изменения в карточке пользователя.

Вариант Б. Глобальное отключение через файл conf.cfg:

Если пользователей в базе очень много, вы можете отключить защиту централизованно на стороне сервера 1С. Для этого в конфигурационном файле conf.cfg (который по умолчанию располагается в каталоге установленной платформы C:\Program Files\1cv8\conf\) необходимо прописать следующую строку:

DisableUnsafeActionProtection=.*

Эта настройка отключит вывод предупреждающих диалогов на сервере для абсолютно всех внешних обработок и пользователей информационной базы.

Решение 4. Особенности работы в облаке «1С:Fresh»

В облачном сервисе «1С:Fresh» действуют самые строгие правила безопасности, и отключить защиту от опасных действий или глобально отредактировать профиль безопасности кластера через конфигурационный файл невозможно. В модели сервиса (SaaS) действуют жесткие правила прохождения аудита кода.

При адаптации обработки под «1С:Fresh» учитывайте следующие требования:

Решение 5. Динамическое определение версии БСП в коде регистрации

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

Для предотвращения подобных ошибок рекомендуется определять актуальную версию библиотеки БСП программным путем:


Функция СведенияОВнешнейОбработке() Экспорт

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

КонецФункции

Этот простой шаг гарантирует, что структура разрешений безопасности будет сформирована в строгом соответствии с требованиями вашей текущей конфигурации 1С, что минимизирует вероятность программных ошибок при запуске кода под ограниченными правами.

← На главную