При настройке интеграции 1С с внешними системами через HTTP-соединение программисты часто сталкиваются с ситуацией, когда сервер возвращает ошибку (например, 500 Internal Server Error или 400 Bad Request). Чтобы разобраться в причинах, необходимо увидеть "сырой" текст запроса — именно те данные, которые уходят "в провод". В 1С нет встроенной кнопки "Показать текст запроса", поэтому разберем по шагам все методы отладки: от исправления кода до использования внешних инструментов.
Первым делом проанализируем, правильно ли создается объект HTTPСоединение. Часто ошибка кроется в неверном разделении адреса сервера и пути к ресурсу. Рассмотрим типичную ошибку из практики:
// Ошибочный вариант
Сервер = "integration.e-queo.online/v3";
Соед = Новый HTTPСоединение(Сервер, , log, pas, , , Новый ЗащищенноеСоединениеOpenSSL);
Ресурс = "/users/sync";
В данном примере в переменную Сервер ошибочно включена часть пути /v3. Платформа 1С ожидает в конструкторе HTTPСоединение только имя хоста (FQDN) или IP-адрес. Выясним, как сделать правильно:
// Правильный вариант
Сервер = "integration.e-queo.online"; // Только домен
Ресурс = "/v3/users/sync"; // Весь путь, начиная с версии API
Соед = Новый HTTPСоединение(Сервер, , log, pas, , , Новый ЗащищенноеСоединениеOpenSSL);
Запр = Новый HTTPЗапрос(Ресурс);
Если указать путь в имени сервера, соединение может не установиться вовсе или вести себя непредсказуемо, так как DNS-резолвер не сможет определить адрес хоста.
Выясним причину, по которой сервер может возвращать 500-ю ошибку. Часто это связано с невалидным или логически неверным JSON. Посмотрим на пример данных, которые вызывали проблему:
"partial_sync": "true",
"chief_sync": "true"
В данном случае значения true передаются как строки (в кавычках). Для многих API это критично, так как они ожидают системный булев тип. Правильный JSON должен выглядеть так:
"partial_sync": true,
"chief_sync": true
Чтобы не допускать таких ошибок при ручном формировании строки, крайне рекомендуем использовать встроенные средства платформы. Разберем, как правильно сериализовать данные в JSON:
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("partial_sync", Истина); // Платформа сама сконвертирует в true без кавычек
ДанныеДляОтправки.Вставить("notify_users", Истина);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаJS = ЗаписьJSON.Закрыть();
Запр.УстановитьТелоИзСтроки(СтрокаJS, "utf-8", ИспользованиеByteOrderMark.НеИспользовать);
Если программный код кажется верным, но сервер всё равно выдает ошибку, нам нужно посмотреть на сформированные заголовки и тело запроса "глазами сервера". Для этого используются программы-прокси, такие как Fiddler или Charles Proxy.
Для того чтобы 1С направила трафик через Fiddler, необходимо настроить ИнтернетПрокси в коде. По умолчанию Fiddler слушает порт 8888 на локальном адресе 127.0.0.1. Проанализируем, как подключить прокси программно:
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "127.0.0.1", 8888);
Прокси.Установить("https", "127.0.0.1", 8888);
// Передаем объект прокси в конструктор соединения
Соед = Новый HTTPСоединение(Сервер, , , , Прокси, , Новый ЗащищенноеСоединениеOpenSSL);
Важный момент при работе с HTTPS: Поскольку 1С использует защищенное соединение, Fiddler будет подменять сертификат сервера своим собственным для расшифровки трафика. Чтобы 1С не разорвала соединение из-за ошибки безопасности, необходимо либо установить сертификат Fiddler в хранилище доверенных сертификатов ОС, либо временно отключить проверку сертификатов в 1С (только для целей отладки!).
Если установка стороннего ПО на сервер 1С невозможна (например, в облаке), воспользуемся методом "эхо-серверов". Рассмотрим этот процесс:
https://webhook.site/unique-id).Это самый быстрый способ проверить, не теряется ли какой-то заголовок (например, Bearer токен) при формировании запроса платформой.
Для продвинутой отладки на стороне сервера 1С:Предприятие можно настроить Технологический журнал. Это позволит сохранять все HTTP-запросы в текстовые файлы прямо на сервере. Для этого необходимо создать или отредактировать файл logcfg.xml в каталоге конфигов 1С.
Добавим событие HTTP в настройки ТЖ:
<event query="true">
<eq property="Name" value="HTTP"/>
</event>
После этого платформа начнет записывать детали всех исходящих вызовов. Это особенно полезно, когда ошибка плавающая и проявляется только в фоновых заданиях на сервере.
Не стоит забывать, что даже при ошибке 500 сервер часто присылает полезную информацию в теле ответа. Вместо того чтобы просто увидеть код ошибки, обязательно прочитаем содержимое тела ответа. Рассмотрим пример кода для анализа ошибок:
Ответ = Соед.ОтправитьДляОбработки(Запр);
Если Ответ.КодСостояния <> 200 Тогда
ТекстОшибки = Ответ.ПолучитьТелоКакСтроку();
Сообщить("Ошибка сервера (" + Ответ.КодСостояния + "): " + ТекстОшибки);
// Часто там содержится JSON вида {"errors":[{"message":"Поле login обязательно"}]}
КонецЕсли;
Проанализировав таким образом ответ, мы можем сразу увидеть, какой именно параметр в JSON не прошел валидацию на стороне принимающего API.
Подведем итог нашему исследованию. Для эффективной отладки HTTP-соединений в 1С придерживайтесь следующих правил:
ЗаписьJSON для формирования тела запроса — это гарантирует правильные типы данных (Boolean, Number).ПолучитьТелоКакСтроку().Content-Type и Authorization.Используя эти инструменты, мы сможем быстро найти и устранить любую причину некорректной работы интеграции.