При обновлении платформы 1С:Предприятие на новые релизы (в частности, начиная с ветки 8.3.11) разработчики и системные администраторы нередко сталкиваются с ситуацией, когда ранее стабильно работавшие сервисы интеграции — DirectBank (прямой обмен с банком), сервис 1С-ЭДО или собственные HTTP-сервисы и рассылки — внезапно перестают функционировать. В журнале регистрации или в окне сообщений появляется ошибка вида: При получении списка новых документов из банка произошла ошибка. Код ошибки: 400. Сервер обнаружил в запросе клиента синтаксическую ошибку или Ошибка работы с Интернет: Ошибка доступа к ресурсу. Путь не найден: (400).
Разберем детально технические причины такого поведения платформы, проанализируем сетевые запросы и рассмотрим практические способы устранения неполадки.
Код состояния HTTP 400 Bad Request означает, что сервер не смог понять запрос из-за неверного синтаксиса. В контексте работы платформы 1С:Предприятие выделим ключевые причины сбоя:
GetContactListUpdates?date=2016-05-23 13:20:22, наличие пробелов и двоеточий без percent-encoding приводит к тому, что веб-сервер банка или провайдера признает HTTP-пакет синтаксически некорректным.Content-Type или отсутствие обязательных полей), сервер отклоняет сессию.Проанализируем типовой участок кода, вызывающий сбой при работе с HTTPСоединение. Если адрес ресурса собирается динамически из строковых параметров (например, даты или текста сообщения), все значения параметров должны быть закодированы в формат URL.
Рассмотрим правильный пример формирования заголовков и объекта HTTPЗапрос:
// Формируем заголовки запроса
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
// Кодируем параметры запроса перед отправкой
ПараметрДата = "2016-05-23 13:20:22";
ЗакодированнаяДата = КодироватьСтроку(ПараметрДата, СпособКодированияСтроки.КодировкаURL);
АдресРесурса = "GetContactListUpdates?date=" + ЗакодированнаяДата;
// Инициализация соединения и отправка запроса
HTTPСоединение = Новый HTTPСоединение(Сервер, Порт);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
Ответ = HTTPСоединение.Получить(HTTPЗапрос);
Функция КодироватьСтроку() со значением СпособКодированияСтроки.КодировкаURL заменяет пробелы на %20 (или +), а двоеточия на %3A, что полностью исключает синтаксические ошибки на стороне банковского шлюза.
Если рабочая конфигурация находится на поддержке без возможности редактирования («на замке»), снимем необходимость правки основной конфигурации с помощью механизма расширений.
&Вместо или &ИзменениеИКонтроль.Выясним, какие действия предпринять, если ручная модификация программного кода нежелательна:
Для точной локализации проблемы, когда текст ошибки скрыт за общим кодом 400, воспользуемся локальными средствами перехвата трафика:
Если восстановить работу прямого канала DirectBank оперативно не удается, переведем обмен с банком на классическую схему:
1c_to_kl.txt и загрузим его через личный кабинет веб-клиента банка вручную.