При интеграции 1С со сторонними веб-сервисами разработчики нередко сталкиваются с ситуацией, когда одна и та же строчка кода инициализации HTTPСоединение ведет себя совершенно по-разному в двух разных информационных базах. Например, в одной базе создается обычное незащищенное соединение по протоколу HTTP, а в другой — упорно инициализируется защищенное соединение по HTTPS. Разберем детально, с чем связано такое поведение платформы, как влияет режим совместимости конфигурации на параметры конструктора и как правильно инициализировать соединение в современных версиях 1С:Предприятия.
Проанализируем строку кода, вызвавшую затруднения:
Новый HTTPСоединение(Сервер, , Логин, Пароль, , Истина);
Если внимательно подсчитать количество переданных параметров и разделителей-запятых, мы увидим, что значение Истина передается шестым по счету параметром. Поведение платформы при этом зависит от установленного режима совместимости конфигурации.
Рассмотрим, как менялся конструктор объекта HTTPСоединение в истории платформы 1С:
Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <ЗащищенноеСоединение>)Булево. Передавая в шестую позицию значение Истина, разработчик явно указывал платформе использовать шифрование SSL/TLS.Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>, <ИспользоватьАутентификациюОС>)<Таймаут> (число секунд), а параметр управления безопасностью сместился на седьмую позицию и стал принимать не просто булево значение, а объект криптографического контекста (например, ЗащищенноеСоединениеOpenSSL).Посмотрим на результат выполнения исходного кода в разных условиях. В режиме совместимости с 8.2 шестой параметр воспринимается как признак шифрования, и создается соединение HTTPS. В режиме платформы 8.3 значение Истина попадает в параметр <Таймаут>, платформа неявно приводит булево значение к числу 1 (таймаут 1 секунда), а седьмой параметр <ЗащищенноеСоединение> остается равным Неопределено. В результате в разных базах соединение инициализируется абсолютно по-разному.
Разберем частый вопрос: можно ли создать объект, у которого свойство Защищенное равно Истина, а свойство ЗащищенноеСоединение равно Неопределено?
Выясним причину такого состояния. Данная комбинация значений встречалась исключительно в старых релизах и режимах совместимости, когда платформа сама поднимала базовый защищенный канал без явного создания отдельного объекта настроек сертификатов. В актуальных версиях платформы 8.3:
Защищенное и ЗащищенноеСоединение доступны только для чтения. Назначить их вручную после создания экземпляра нельзя.ЗащищенноеСоединениеOpenSSL или ЗащищенноеСоединениеКриптоПро), и свойство ЗащищенноеСоединение всегда содержит ссылку на этот объект, а не Неопределено.Чтобы создать обычное HTTP-соединение без шифрования в актуальной версии платформы, необходимо корректно расположить параметры. Передадим сервер, порт (обычно 80 для HTTP) и числовой таймаут, оставив седьмой параметр пустым:
Сервер = "api.service.local";
Порт = 80;
Логин = "admin";
Пароль = "secret";
Таймаут = 30; // таймаут в секундах
// Седьмой параметр (ЗащищенноеСоединение) опускаем или передаем Неопределено
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , Таймаут);
Если порт не указан явным образом (передано пустое значение), платформа по умолчанию применит стандартный порт 80 для незащищенного соединения.
Если же требуется именно защищенный канал связи, в седьмой параметр конструктора необходимо передать инициализированный объект криптографического контекста. Порт по умолчанию для HTTPS равен 443:
Сервер = "api.service.com";
Порт = 443;
Логин = "admin";
Пароль = "secret";
Таймаут = 30;
// Инициализируем контекст OpenSSL
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// Передаем объект защиты строго 7-м параметром
Соединение = Новый HTTPСоединение(Сервер, Порт, Логин, Пароль, , Таймаут, Защита);
Если конфигурация разработана с использованием БСП, рекомендуется избегать ручного пересчета запятых и применять готовые функции подсистемы общего назначения. Функция ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение() позволяет создать объект защищенного соединения с учетом системных сертификатов операционной системы:
// Создание объекта с использованием механизмов БСП
Защита = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение();
Соединение = Новый HTTPСоединение("api.service.com", 443, , , , 30, Защита);
При динамическом формировании подключения к URL-адресу разберем схему адреса: если префикс строки содержит https://, передаем объект ЗащищенноеСоединениеOpenSSL в 7-й параметр; если префикс http:// — оставляем 7-й параметр пустым.