При разработке механизмов интеграции 1С с внешними сайтами, интернет-магазинами или государственными информационными системами программисты часто сталкиваются с ситуацией "черного ящика". Мы пишем код, формируем объект HTTPЗапрос, заполняем заголовки, передаем тело запроса и вызываем метод отправки. Однако в ответ приходит неочевидная ошибка, а документация к стороннему API оставляет желать лучшего. В таких условиях критически важно увидеть, в каком именно виде запрос уходит из 1С.
В этой статье мы подробно разберем, как перехватить, прочитать и проанализировать исходящие HTTP/HTTPS-запросы из 1С. Мы изучим работу со специализированными инструментами-снифферами, рассмотрим возможности тестирования через внешние утилиты, а также научимся логировать пакеты программными методами внутри самой платформы.
Сниффер Fiddler — это один из самых простых и эффективных инструментов для отладки веб-запросов. Он работает как локальный прокси-сервер, через который проходит весь трафик операционной системы (или конкретного приложения), позволяя детально изучить структуру заголовков и тело любого запроса.
Давайте разберем по шагам, как настроить Fiddler для работы с 1С:
8888.Важная деталь: настройка SSL-сертификатов для HTTPS
Поскольку Fiddler перехватывает защищенный трафик методом "Man-in-the-Middle" (подменяя сертификат сайта своим собственным), платформа 1С при попытке отправить HTTPS-запрос вернет ошибку: «Ошибка работы с Интернет: удаленный узел не прошел проверку». Чтобы решить эту проблему, нам нужно заставить 1С доверять сертификату Fiddler:
.cer) на рабочем столе и откройте его с помощью любого текстового редактора (например, Блокнота). Скопируйте весь текстовый блок.C:\Program Files\1cv8\8.3.XX.XXXX\bin\).cacert.pem. Это хранилище доверенных корневых сертификатов 1С.После этих действий 1С начнет беспрепятственно доверять прокси-серверу Fiddler, и вы сможете в реальном времени анализировать любой зашифрованный трафик.
Если вы отлаживаете код на рабочем сервере, крайне нежелательно перенаправлять весь серверный трафик через Fiddler. Это может нарушить другие регламентные задания и обмены. Гораздо безопаснее направить в сниффер только один конкретный отлаживаемый запрос.
Для этого мы можем настроить прокси-сервер программно непосредственно перед созданием HTTPСоединение:
// Создаем объект прокси и указываем адрес локального сниффера Fiddler
ПроксиСервер = Новый ИнтернетПрокси;
ПроксиСервер.Установить("http", "127.0.0.1", 8888);
ПроксиСервер.Установить("https", "127.0.0.1", 8888);
// Передаем прокси-сервер в конструктор HTTP-соединения
Соединение = Новый HTTPСоединение("api.mysite.ru", , , , ПроксиСервер);
// Теперь этот конкретный запрос пойдет через Fiddler
Запрос = Новый HTTPЗапрос("/v1/orders");
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки("{""id"": 123}", КодировкаТекста.UTF8);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
При таком подходе все остальные пользователи и фоновые процессы на сервере продолжат работать напрямую с интернетом, а вы сможете спокойно ловить нужный пакет в панели Fiddler.
Если вы не хотите менять программный код, но вам нужно направить все запросы конкретной службы 1С через локальный прокси, можно воспользоваться конфигурационным файлом inetcfg.xml. Это особенно полезно при отладке регламентных заданий на серверной стороне.
Для этого в каталоге конфигурационных файлов 1С (для сервера это обычно C:\Program Files\1cv8\conf\) создайте текстовый файл с именем inetcfg.xml следующего содержания:
<config xmlns="http://v8.1c.ru/edi/edi_stnd/inetcfg">
<proxy
port="8888"
server="127.0.0.1"
bypassOnLocal="true"
/>
</config>
После сохранения этого файла все сетевые вызовы платформы будут проходить через указанный адрес прокси-сервера. Не забудьте удалить или переименовать этот файл после окончания отладки!
Что делать, если политика безопасности компании запрещает установку стороннего ПО вроде Fiddler, а отладить отправку данных нужно срочно? В этом случае отличным выходом станет использование бесплатных облачных сервисов-приемников запросов, таких как Webhook.site или RequestBin.
Давайте рассмотрим логику их использования:
https://webhook.site/a1b2c3d4-e5f6...).Этот способ невероятно прост, не требует прав администратора на компьютере и позволяет моментально увидеть "сырые" данные, которые отправляет ваша база 1С.
Опытные разработчики рекомендуют использовать подход "от простого к сложному". Прежде чем писать громоздкий код формирования запроса на встроенном языке 1С, целесообразно сначала добиться успешного ответа от целевого сайта во внешней специализированной утилите, например Postman или расширении для браузера ARC (Advanced REST Client).
Разберем этот процесс по шагам:
Authorization и тип контента Content-Type: application/json).Когда вы добьетесь стабильного и правильного ответа от веб-сервиса в Postman, вы сможете перенести структуру запроса в код 1С. В случае возникновения ошибок на стороне 1С вы всегда сможете сравнить два запроса (рабочий из Postman и нерабочий из 1С) в сниффере Fiddler по принципу "найди отличия".
Если вам необходимо вести постоянный мониторинг отправляемых данных или интеграция работает на закрытом сервере без возможности использования внешних утилит, лучшим решением будет написание собственного механизма логирования прямо внутри кода 1С.
Давайте реализуем универсальную процедуру, которая будет записывать структуру запроса в текстовый файл перед отправкой:
Процедура ЗаписатьЗапросВЛог(Знач HTTPЗапрос, Знач ПутьКФайлуЛога) Экспорт
ТекстЛога = "=== НОВЫЙ ЗАПРОС ===" + Символы.ПС;
ТекстЛога = ТекстЛога + "Время: " + ТекущаяДата() + Символы.ПС;
ТекстЛога = ТекстЛога + "Адрес ресурса: " + HTTPЗапрос.АдресРесурса + Символы.ПС;
// Выгружаем заголовки запроса
ТекстЛога = ТекстЛога + "--- ЗАГОЛОВКИ ---" + Символы.ПС;
Для Каждого Заголовок Из HTTPЗапрос.Заголовки Цикл
ТекстЛога = ТекстЛога + Заголовок.Ключ + ": " + Заголовок.Значение + Символы.ПС;
КонецЦикла;
// Получаем тело запроса
ТекстЛога = ТекстЛога + "--- ТЕЛО ЗАПРОСА ---" + Символы.ПС;
СтрокаТела = HTTPЗапрос.ПолучитьТелоКакСтроку();
Если ЗначениеЗаполнено(СтрокаТела) Тогда
ТекстЛога = ТекстЛога + СтрокаТела + Символы.ПС;
Иначе
ТекстЛога = ТекстЛога + "[Тело запроса пустое или передано в виде двоичных данных/файла]" + Символы.ПС;
КонецЕсли;
ТекстЛога = ТекстЛога + "=====================" + Символы.ПС + Символы.ПС;
// Записываем лог в текстовый файл на диске
ЗаписьТекста = Новый ЗаписьТекста;
ЗаписьТекста.Открыть(ПутьКФайлуЛога, КодировкаТекста.UTF8, , Истина); // Открываем в режиме добавления текста
ЗаписьТекста.ЗаписатьСтроку(ТекстЛога);
ЗаписьТекста.Закрыть();
КонецПроцедуры
Эту процедуру достаточно вызвать непосредственно перед выполнением метода ОтправитьДляОбработки или любого другого метода вызова веб-сервиса. Вы всегда сможете заглянуть в текстовый файл лога и увидеть точную структуру сформированного пакета.
Мы рассмотрели целый ряд инструментов для дебага веб-интеграций. Выбор конкретного метода зависит от условий вашей задачи:
cacert.pem).