Многие пользователи и администраторы систем на базе 1С:ERP 2.5, 1С:Комплексная автоматизация и 1С:Управление торговлей сталкиваются с внезапным прекращением работы сервиса 1С:Контрагент. Типовой механизм, который годами работал исправно, начинает выдавать ошибку при попытке получить данные по ИНН. Рассмотрим подробнее, почему это происходит и как вернуть работоспособность сервиса.
Симптомы проблемы обычно выглядят следующим образом: при вводе ИНН в карточке нового контрагента система долго «думает», после чего выдает сообщение о невозможности получения данных. Если заглянуть в Журнал регистрации или проанализировать сетевой трафик, мы увидим следующую техническую информацию:
Ошибка клиента (400) при выполнении запроса к ресурсу
URL: https://api.orgregister.1c.ru/rest/counter-agent/v1/find-counter-agents-by-inn?inn=...
Тело ответа: 400 - Bad Request. Server could not understand the request due to invalid syntax.
Проанализируем ситуацию: код ошибки 400 означает «Неверный запрос». Это говорит о том, что сервер «1С:Контрагент» получил запрос, но отказался его обрабатывать, так как формат сообщения нарушает протокол HTTP. Самое интересное, что на демонстрационных базах или в копиях той же конфигурации механизм может продолжать работать исправно. Это наводит на мысль, что проблема кроется не в самом коде запроса, а в данных, которые передаются вместе с ним.
Разберем внутреннюю механику работы Библиотеки интернет-поддержки (БИП), которая отвечает за связь с сервисами «1С». При каждом обращении к API серверу передаются технические заголовки (headers), содержащие информацию о конфигурации пользователя. Один из таких заголовков — X-1C-ConfigurationName.
Проблема заключается в том, что в этот заголовок попадают данные из свойств корневого объекта конфигурации (в дереве метаданных Конфигуратора). Если в полях «Краткая информация» или «Подробная информация» администратор или разработчик случайно нажал клавишу Enter, в строке появляются невидимые символы переноса строки (LF) или возврата каретки (CR).
Согласно стандартам HTTP/1.1, символы управления (такие как перенос строки) внутри значений заголовков строго запрещены. Раньше серверы «1С» могли игнорировать этот мусор, но после ужесточения политик безопасности или обновления веб-серверов на стороне фирмы «1С», такие «кривые» запросы стали блокироваться с ошибкой 400 Bad Request.
Фирма «1С» признала наличие этой проблемы в типовых решениях и выпустила соответствующие исправления. Для большинства современных конфигураций (ERP, КА, УТ) актуален патч с номером EF_00_00513061. Если требуется установить исправления сразу в несколько баз, этот процесс автоматизируют с помощью программы для пакетного обновления 1С.
Рассмотрим по шагам, как его применить:
EF_00_00513061 с описанием «В заголовке configurationName передаются переносы строки и возврат каретки».После установки патча система начнет принудительно очищать строку заголовка от всех недопустимых символов перед отправкой запроса.
Если по каким-то причинам вы не можете установить патч прямо сейчас, проанализируем состояние метаданных в Конфигураторе. Это объяснит, почему на демке все работало (там поля заполнены чисто), а в рабочей базе — нет.
Посмотрим на пример того, как можно исправить проблему программно, если вы находитесь в процессе доработки конфигурации или используете сильно измененную версию. Нам необходимо найти место формирования HTTP-запроса в БиблиотекеИнтернетПоддержки. Обычно это функции, подготавливающие структуру Заголовки.
Рассмотрим пример кода, который решает проблему очистки:
// В месте формирования заголовка X-1C-ConfigurationName
ИмяКонфигурации = Метаданные.КраткаяИнформация;
// Очищаем от переносов строк (Символы.ПС) и возвратов каретки (Символы.ВК)
ИмяКонфигурации = СтрЗаменить(ИмяКонфигурации, Символы.ПС, "");
ИмяКонфигурации = СтрЗаменить(ИмяКонфигурации, Символы.ВК, "");
// Теперь заголовок будет корректным
HTTPЗапрос.Заголовки.Вставить("X-1C-ConfigurationName", ИмяКонфигурации);
Применяя функцию СтрЗаменить, мы гарантируем, что даже если в метаданных останется мусор, он не попадет в сетевой пакет и не вызовет отказ сервера.
Хотя в 90% случаев ошибка 400 в данной ситуации вызвана именно заголовками, иногда стоит проверить и другие системные настройки. Выясним, не влияет ли на ситуацию протокол шифрования:
Подведем итог: если автоматическое заполнение по ИНН перестало работать с ошибкой 400 — первым делом проверяем наличие патчей в разделе интернет-поддержки. Это самый быстрый и надежный способ вернуть сервис в строй без вмешательства в программный код.