Как исправить ошибку безопасности в регламентных заданиях и перейти с WinHttp на HTTPСоединение для POST-запросов?

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

При разработке и сопровождении систем на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда регламентное задание, запускающее внешнюю обработку, внезапно перестает работать или выдает предупреждение безопасности. Особенно это актуально при попытках взаимодействия с внешними веб-сервисами через устаревшие технологии, такие как COM-объект WinHttp.WinHttpRequest. В данной статье мы подробно разберем причины возникновения таких ошибок и рассмотрим современный, безопасный способ организации обмена данными с использованием объекта HTTPСоединение.

Разбор причины: Почему возникает предупреждение безопасности?

Начиная с версии платформы 8.3.9, в 1С реализован механизм Защиты от опасных действий. Это системное сообщение, которое вы видите в логах или при интерактивном запуске, сигнализирует о том, что программный модуль пытается выполнить потенциально опасную операцию. К таким операциям платформа относит:

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

Рассмотрим ситуацию, когда одно задание работает корректно, а другое — нет. Проанализируем контекст: регламентные задания в клиент-серверном варианте выполняются на стороне сервера под учетной записью пользователя USR1CV8. Если внешняя обработка подключается программно через метод ВнешниеОбработки.Подключить(), платформа по умолчанию может устанавливать для нее безопасный режим. В безопасном режиме использование COM-объектов запрещено полностью, либо требует явного подтверждения, которое невозможно в неинтерактивном режиме регламентного задания.

Варианты решения проблемы безопасности

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

1. Отключение защиты для конкретного пользователя. В свойствах пользователя информационной базы можно снять флажок Защита от опасных действий. Однако, как отмечают опытные разработчики, это "не очень решение", так как оно снижает общий уровень безопасности системы. Если регламентное задание запускается под этим пользователем, проверка может быть проигнорирована, но это не сработает, если обработка принудительно запускается в безопасном режиме кодом конфигурации.

2. Использование профилей безопасности. В консоли кластера серверов 1С можно настроить профиль безопасности, в котором явно разрешить использование конкретного COM-класса или доступ к определенным сетевым адресам. Это наиболее профессиональный метод администрирования, позволяющий сохранить контроль над системой.

3. Программное отключение безопасного режима. Если вы подключаете внешнюю обработку программно, обратите внимание на параметры метода Подключить. Рассмотрим пример:


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

Переход на HTTPСоединение: Современный стандарт 1С

Использование WinHttp в современных версиях 1С считается атавизмом. Платформа обладает мощным встроенным инструментарием для работы с HTTP/HTTPS, который не зависит от системных библиотек Windows и корректно работает в том числе на Linux-серверах 1С. Проанализируем, как правильно переписать код для выполнения POST-запроса.

Выясним причину, почему многие разработчики боятся переходить на HTTPСоединение. Часто это связано с непониманием того, как передать параметры POST без создания временных файлов. На самом деле, метод УстановитьТелоИзСтроки полностью решает эту задачу.

Пошаговая реализация POST-запроса

Рассмотрим пример отправки данных на сервер (например, API ABCP) для обновления баланса клиента. Нам необходимо отправить данные в формате application/x-www-form-urlencoded.

Шаг 1. Подготовка данных. Все параметры запроса должны быть собраны в одну строку. Важно помнить о кодировании спецсимволов. Рассмотрим правильный подход:


// Собираем параметры
ПараметрыЗапроса = "userlogin=" + Логин + "&userpsw=" + Токен + "&userId=" + ИДКлиента + "&balance=" + ЗначениеБаланса;

// Создаем соединение. Указываем только доменное имя!
Соединение = Новый HTTPСоединение("api.site.ru",,,,, 15, Новый ЗащищенноеСоединениеOpenSSL());

Шаг 2. Формирование запроса. Создаем объект HTTPЗапрос и устанавливаем необходимые заголовки. Посмотрим на пример кода:


// Путь к ресурсу указывается в конструкторе запроса
Запрос = Новый HTTPЗапрос("/cp/finance/userBalance");

// Обязательно указываем тип контента, чтобы сервер понял, как обрабатывать тело
Запрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Запрос.Заголовки.Вставить("Accept", "application/json");

// Передаем строку параметров в тело запроса
Запрос.УстановитьТелоИзСтроки(ПараметрыЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Шаг 3. Отправка и обработка ответа. Используем метод ОтправитьДляОбработки (который соответствует методу POST в протоколе HTTP) и анализируем результат:


Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        // Разберем содержимое ответа
        ТекстОтвета = Ответ.ПолучитьТелоИзСтроки();
        // Дальнейшая логика обработки JSON или XML
    Иначе
        ЗаписьЖурналаРегистрации("Ошибка связи", УровеньЖурналаРегистрации.Ошибка,,, "Код состояния: " + Ответ.КодСостояния);
    КонецЕсли;
Исключение
    // Обработка сетевых ошибок (таймаут, отсутствие связи)
    ЗаписьЖурналаРегистрации("Ошибка HTTP", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;

Тонкости использования параметров POST

Проанализируем ситуацию с кодированием строк. Если ваш Логин или Токен содержит символы типа &, + или пробелы, простая склейка строк приведет к ошибке на стороне сервера. Программа воспримет & как разделитель нового параметра. Чтобы этого избежать, используем функцию КодироватьСтроку:


ЗначениеПараметра = "Super+Password&123";
БезопасноеЗначение = КодироватьСтроку(ЗначениеПараметра, СпособКодированияСтроки.URLУмеренный);
// Теперь это безопасно добавлять в строку параметров

Преимущества использования встроенных средств 1С

Переход на HTTPСоединение дает нам несколько неоспоримых преимуществ:

Таким образом, решив проблему с безопасностью регламентного задания путем отказа от WinHttp, мы не только избавляемся от назойливых предупреждений, но и делаем код более надежным и современным. Помните, что настройка прав пользователя — это временная мера, в то время как использование штатных объектов HTTPСоединение и HTTPЗапрос является стандартом качественной разработки на платформе 1С.

← На главную