Почему конструктор HTTPСоединение создает защищенное соединение вместо обычного и как это исправить?

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

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

Причина проблемы: эволюция сигнатуры конструктора HTTPСоединение

Проанализируем строку кода, вызвавшую затруднения:

Новый HTTPСоединение(Сервер, , Логин, Пароль, , Истина);

Если внимательно подсчитать количество переданных параметров и разделителей-запятых, мы увидим, что значение Истина передается шестым по счету параметром. Поведение платформы при этом зависит от установленного режима совместимости конфигурации.

Рассмотрим, как менялся конструктор объекта HTTPСоединение в истории платформы 1С:

  1. В платформе 1С:Предприятие 8.2 (и в режиме совместимости с 8.2):
    Конструктор имел следующий состав параметров:
    Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <ЗащищенноеСоединение>)
    Здесь шестым параметром являлся флаг безопасности типа Булево. Передавая в шестую позицию значение Истина, разработчик явно указывал платформе использовать шифрование SSL/TLS.
  2. В платформе 1С:Предприятие 8.3 (без режима совместимости с 8.2):
    Состав параметров был существенно расширен:
    Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>, <ИспользоватьАутентификациюОС>)
    На шестой позиции появился параметр <Таймаут> (число секунд), а параметр управления безопасностью сместился на седьмую позицию и стал принимать не просто булево значение, а объект криптографического контекста (например, ЗащищенноеСоединениеOpenSSL).

Посмотрим на результат выполнения исходного кода в разных условиях. В режиме совместимости с 8.2 шестой параметр воспринимается как признак шифрования, и создается соединение HTTPS. В режиме платформы 8.3 значение Истина попадает в параметр <Таймаут>, платформа неявно приводит булево значение к числу 1 (таймаут 1 секунда), а седьмой параметр <ЗащищенноеСоединение> остается равным Неопределено. В результате в разных базах соединение инициализируется абсолютно по-разному.

Особенности свойств Защищенное и ЗащищенноеСоединение

Разберем частый вопрос: можно ли создать объект, у которого свойство Защищенное равно Истина, а свойство ЗащищенноеСоединение равно Неопределено?

Выясним причину такого состояния. Данная комбинация значений встречалась исключительно в старых релизах и режимах совместимости, когда платформа сама поднимала базовый защищенный канал без явного создания отдельного объекта настроек сертификатов. В актуальных версиях платформы 8.3:

  1. Свойства Защищенное и ЗащищенноеСоединение доступны только для чтения. Назначить их вручную после создания экземпляра нельзя.
  2. Если соединение защищенное, платформа требует явной передачи объекта криптографии (ЗащищенноеСоединениеOpenSSL или ЗащищенноеСоединениеКриптоПро), и свойство ЗащищенноеСоединение всегда содержит ссылку на этот объект, а не Неопределено.

Способ 1. Создание обычного незащищенного соединения (HTTP) в 1С 8.3

Чтобы создать обычное HTTP-соединение без шифрования в актуальной версии платформы, необходимо корректно расположить параметры. Передадим сервер, порт (обычно 80 для HTTP) и числовой таймаут, оставив седьмой параметр пустым:


Сервер = "api.service.local";
Порт = 80;
Логин = "admin";
Пароль = "secret";
Таймаут = 30; // таймаут в секундах

// Седьмой параметр (ЗащищенноеСоединение) опускаем или передаем Неопределено
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , Таймаут);

Если порт не указан явным образом (передано пустое значение), платформа по умолчанию применит стандартный порт 80 для незащищенного соединения.

Способ 2. Корректное создание защищенного соединения (HTTPS) в 1С 8.3

Если же требуется именно защищенный канал связи, в седьмой параметр конструктора необходимо передать инициализированный объект криптографического контекста. Порт по умолчанию для HTTPS равен 443:


Сервер = "api.service.com";
Порт = 443;
Логин = "admin";
Пароль = "secret";
Таймаут = 30;

// Инициализируем контекст OpenSSL
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Передаем объект защиты строго 7-м параметром
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , Таймаут, Защита);

Способ 3. Универсальный подход на базе Библиотеки стандартных подсистем (БСП)

Если конфигурация разработана с использованием БСП, рекомендуется избегать ручного пересчета запятых и применять готовые функции подсистемы общего назначения. Функция ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение() позволяет создать объект защищенного соединения с учетом системных сертификатов операционной системы:


// Создание объекта с использованием механизмов БСП
Защита = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение();
Соединение = Новый HTTPСоединение("api.service.com", 443, , , , 30, Защита);

При динамическом формировании подключения к URL-адресу разберем схему адреса: если префикс строки содержит https://, передаем объект ЗащищенноеСоединениеOpenSSL в 7-й параметр; если префикс http:// — оставляем 7-й параметр пустым.

← На главную