При интеграции 1С 7.7 с современными веб-сервисами (например, Viber API (поможет обработка обмена с Telegram для 1С 7.7), рассылка SMS, взаимодействие с государственными порталами) программисты часто сталкиваются с критической ошибкой: WinHttp.WinHttpRequest: Произошла ошибка безопасности. Чаще всего эта проблема проявляется на серверах под управлением Windows Server 2008 R2 или на рабочих станциях с Windows 7.
Рассмотрим причины возникновения этой ошибки и разберем по шагам, как настроить систему и код 1С для восстановления работоспособности обмена данными.
Основная причина заключается в несовместимости протоколов шифрования. Современные интернет-ресурсы в целях безопасности отказываются от поддержки старых протоколов TLS 1.0 и TLS 1.1, требуя обязательного использования TLS 1.2. Устаревшие операционные системы по умолчанию пытаются использовать TLS 1.0, что приводит к обрыву соединения со стороны сервера и возникновению ошибки безопасности в объекте WinHttp.
Прежде чем вносить изменения в код 1С, необходимо убедиться, что сама Windows умеет работать с TLS 1.2. Проанализируем необходимые системные действия:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ должны быть созданы подразделы TLS 1.2\Client с параметром Enabled (DWORD) равным 1 и DisabledByDefault равным 0.DefaultSecureProtocols.Создайте и запустите .reg файл со следующим содержимым для автоматизации настройки реестра:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000a00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000a00
Значение 00000a00 (в шестнадцатеричной системе) является суммой флагов для TLS 1.1 (0x200) и TLS 1.2 (0x800).
После настройки ОС переходим к коду. В 1С 7.7 объект WinHttp.WinHttpRequest.5.1 иногда некорректно воспринимает установку параметров через метод Option напрямую, особенно если речь идет о сложных флагах. Выясним, как обойти это ограничение.
Для гарантированной установки опций рекомендуется использовать вспомогательный объект MSScriptControl.ScriptControl, который позволяет выполнять код на языке JavaScript/VBScript внутри 1С. Это помогает избежать проблем с передачей типов данных в COM-объект.
Рассмотрим пример рабочего кода для отправки запроса:
// Создаем основной объект для HTTP-запросов
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
// Используем скрипт-контрол для установки параметров безопасности
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.AddObject("WinHttp", WinHttp);
// Устанавливаем опцию 9 (SecureProtocols).
// Значение 2048 соответствует TLS 1.2.
// Значение 0 позволяет WinHTTP использовать системные настройки по умолчанию.
Скрипт.Eval("WinHttp.Option(9) = 2048");
// Дополнительно можно игнорировать ошибки сертификатов, если это требуется
// 13056 - игнорировать все ошибки SSL
Скрипт.Eval("WinHttp.Option(4) = 13056");
// Формируем и отправляем запрос
Адрес = "https://api.viber.com/pa/send_message";
WinHttp.Open("POST", Адрес, 0);
WinHttp.setRequestHeader("Content-Type", "application/xml; charset=utf-8");
ТекстЗапроса = "Ваш XML пакет";
Попытка
WinHttp.Send(ТекстЗапроса);
Сообщить("Ответ сервера: " + WinHttp.ResponseText);
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки(), "!");
КонецПопытки;
Чтобы убедиться, что 1С действительно использует TLS 1.2, проанализируем ситуацию с помощью внешних сервисов тестирования SSL. Мы можем отправить GET-запрос на специальный URL и получить в ответе версию протокола, которую увидел сервер.
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.AddObject("WinHttp", WinHttp);
Скрипт.Eval("WinHttp.Option(9) = 0"); // Используем системный дефолт
WinHttp.Open("GET", "https://howsmyssl.com/a/check", 0);
WinHttp.Send();
// В тексте ответа ищем параметр tls_version
Сообщить(WinHttp.ResponseText);
Если в ответе вы видите "tls_version":"TLS 1.2", значит, настройка прошла успешно.
Иногда даже после настройки TLS ошибка сохраняется. В таких случаях стоит рассмотреть альтернативные варианты: для этого есть модуль автоматизации обмена с ЕГАИС.
СоздатьОбъект("WinHttp.WinHttpRequest.5.1") на СоздатьОбъект("MSXML2.ServerXMLHTTP.6.0") может решить проблему без глубокой правки реестра.WinHttp вернет ошибку безопасности.curl, которая поддерживает современные протоколы независимо от настроек Windows.Проанализировав вышеописанные методы, мы видим, что решение проблемы "Ошибки безопасности" в 1С 7.7 требует комплексного подхода: от обновления системных библиотек до специфических приемов написания кода через ScriptControl. Соблюдение этой последовательности позволит вашей базе данных надежно работать с любыми современными API. Для этой задачи подойдёт модуль обмена с ГИСМТ и ЭДО.