Как выполнить HTTP-запрос из скриптов в 1С:Документооборот 3.0 и обойти ошибку безопасного режима?

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

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

Давайте подробно разберем ситуацию, проанализируем причину возникновения ошибки и посмотрим на доступные способы ее обхода.

Анализ проблемы: почему возникает ошибка?

Если мы напишем код выполнения HTTP-запроса прямо в скрипте схемы обработки, платформа 1С прервет выполнение с характерной ошибкой:

Ошибка при вызове конструктора (HTTPСоединение): Установлен безопасный режим. Выполнение операции запрещено

Выясним причину такого поведения. Платформа 1С:Предприятие 8 по умолчанию запускает все внешние обработки, скрипты и расширения в так называемом безопасном режиме. Это сделано для защиты системы от выполнения вредоносного кода. В безопасном режиме платформа жестко блокирует любые попытки взаимодействия программы с внешней средой. К запрещенным операциям относятся:

  1. Создание COM-объектов;
  2. Доступ к файловой системе сервера;
  3. Запуск внешних приложений операционной системы;
  4. Доступ к интернету (включая работу объектов HTTPСоединение и ИнтернетПочта).

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

Решение 1: Асинхронный вызов через расширение с отключением безопасного режима

Во-первых, выполнение длительных сетевых запросов напрямую в скрипте обработки — плохая практика, так как это происходит синхронно и замедляет проведение/запись объектов. Правильнее вынести эту логику в фоновое асинхронное выполнение.

Для этого мы создадим отдельное расширение конфигурации, где разместим общий модуль с процедурой отправки данных. В скрипте ДО 3.0 мы будем просто вызывать этот метод.

Чтобы метод успешно выполнился, нам потребуется выполнить следующие шаги в конфигураторе (в свойствах расширения):

  1. Снять галочку Безопасный режим.
  2. Снять галочку Имя профиля безопасности.
  3. Снять галочку Защита от опасных действий.

Однако, просто снять галочки недостаточно. Платформа все равно может перестраховываться на уровне контекста фонового задания. Поэтому непосредственно перед созданием объекта HTTPСоединение мы должны программно выключить ограничения с помощью метода УстановитьОтключениеБезопасногоРежима.

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


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

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

Решение 2: Использование механизмов БСП (Правильный архитектурный подход)

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

Вместо полного отключения защиты, мы запросим у системы точечное разрешение на доступ к конкретному сетевому ресурсу. Разберем по шагам, как это сделать:

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

Данный подход позволяет сохранить базу защищенной от неконтролируемых опасных действий, при этом легально "прорубая окно" для нашего конкретного HTTP-запроса.

Альтернативные варианты интеграции

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

Если мы создаем объект в другой конфигурации 1С (например, 1С:ERP или 1С:Бухгалтерия), настоятельно рекомендуем отказаться от сырых скриптов в пользу встроенных механизмов интеграции Документооборота. В типовых решениях отлично работают штатные планы обмена через универсальный формат Enterprise Data, а также механизмы Бесшовной интеграции. Они уже "из коробки" умеют асинхронно переносить данные, не конфликтуют с безопасным режимом платформы и гарантируют доставку сообщений при временной недоступности базы-приемника.

← На главную