Многие пользователи конфигурации 1С:Управление нашей фирмой (УНФ), а также некоторых версий БП (Бухгалтерия предприятия) и УПП столкнулись с досадной проблемой: при попытке заполнить данные контрагента по ИНН программа выдает ошибку, утверждая, что ИНН юридического лица должен содержать 10 знаков (даже если он введен корректно). Ситуация осложняется тем, что вчера всё могло работать исправно, а сегодня сервис «1С:Контрагент» перестал принимать запросы. Проанализируем ситуацию, выясним истинную причину сбоя и разберем по шагам способы решения этой задачи.
Первым делом проанализируем техническую сторону вопроса. Проблема не в самом ИНН, который вводит пользователь, а в метаданных, которые программа отправляет на серверы 1С вместе с запросом. При обращении к API сервиса «1С:Контрагент» система формирует HTTP-запрос, в заголовках которого передается параметр configurationName. Это имя конфигурации, закодированное в формате Base64.
Согласно стандартам кодирования в 1С, функция Base64Строка() при обработке длинных строк может вставлять невидимые символы переноса строки (CRLF) каждые 72 символа. Ранее серверы 1С игнорировали эти лишние символы в заголовках. Однако после усиления контроля безопасности и обновления протоколов на стороне веб-сервиса наличие переносов строк в заголовке configurationName стало приводить к тому, что запрос признается некорректным. Ошибка про «10 знаков ИНН» в данном случае является лишь стандартным ответом-заглушкой сервиса, который не смог распарсить заголовок.
Рассмотрим самый безопасный способ исправления, который не требует снятия типовой конфигурации с поддержки. Мы создадим расширение, которое будет «перехватывать» момент отправки запроса и очищать заголовки от проблемных данных. Нам необходимо внести изменения в работу функции ЗагрузитьСодержимоеИзИнтернет.
Выполним следующие действия в конфигураторе:
&Вместо для функции, отвечающей за взаимодействие с интернет-сервисами.Посмотрим на пример кода, который решает проблему как для юридических лиц, так и для индивидуальных предпринимателей (ИП):
&Вместо("ЗагрузитьСодержимоеИзИнтернет")
Функция Расш_ЗагрузитьСодержимоеИзИнтернет(Знач URL, Знач Логин, Знач Пароль, ПараметрыЗапроса)
// Проверяем, является ли запрос обращением к сервису поиска контрагентов
ЭтоЗапросКонтрагента = СтрНайти(URL, "find-counter-agents-by-inn") > 0;
ЭтоЗапросИП = СтрНайти(URL, "find-person-by-inn") > 0;
Если ЭтоЗапросКонтрагента Или ЭтоЗапросИП Тогда
// Удаляем заголовок, содержащий некорректные символы переноса строки
ПараметрыЗапроса.Заголовки.Удалить("configurationName");
// Либо можно обнулить его: ПараметрыЗапроса.Заголовки.Вставить("configurationName", "");
КонецЕсли;
// Продолжаем стандартный вызов с исправленными заголовками
Результат = ПродолжитьВызов(URL, Логин, Пароль, ПараметрыЗапроса);
Возврат Результат;
КонецФункции
Обратите внимание: мы добавили проверку find-person-by-inn. Это критически важно, так как для индивидуальных предпринимателей используется другой адрес API, и без этой проверки поиск по 12-значным ИНН все равно будет работать с ошибками.
Если ваша конфигурация находится на поддержке и подключена к интернет-поддержке пользователей, 1С выпускает автоматические исправления — патчи. Выясним, какие патчи отвечают за данную проблему. Для разных версий УНФ и БП идентификаторы могут отличаться:
Для установки патча перейдите в раздел Администрирование — Обслуживание — Обновление программы — Установленные исправления (патчи). Если в списке нет нужного исправления, попробуйте нажать «Поиск обновлений». Однако помните, что для очень старых релизов (например, УНФ 1.6.18) патчи могут быть недоступны, так как релиз снят с поддержки. в этом случае используйте Способ 1. Кроме того, для устаревших и нетиповых конфигураций подойдёт решение для заполнения контрагентов по данным ФНС.
Проанализируем ситуацию, когда расширение использовать невозможно (например, из-за режима совместимости платформы). В этом случае придется внести изменения в код общего модуля ИнтернетПоддержкаПользователей. Нам нужно найти место, где формируется переменная Результат через функцию Base64Строка.
Проблема кроется в коде, который записывает имя конфигурации во временный файл и преобразует его в двоичные данные. Исправим это, принудительно удалив символы возврата каретки и переноса строки:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла);
ЗаписьТекста.Записать(ИнтернетПоддержкаПользователей.ИмяКонфигурации);
ЗаписьТекста.Закрыть;
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВременногоФайла);
Результат = Base64Строка(ДвоичныеДанныеФайла);
// Очистка от нежелательных символов, мешающих API
Результат = СтрЗаменить(Результат, Символы.ПС, "");
Результат = СтрЗаменить(Результат, Символы.ВК, "");
После такой обработки заголовок configurationName станет «чистым», и сервер 1С примет запрос без ошибок.
Разберем подробнее ситуацию с индивидуальными предпринимателями. В обсуждениях часто упоминается, что после исправления заголовка юридические лица (10 знаков ИНН) начинают заполняться, а ИП (12 знаков ИНН) — нет. Это происходит потому, что программисты забывают про метод find-person-by-inn. Убедитесь, что ваше решение (будь то расширение или патч) затрагивает оба типа запросов. В коде 1С за это обычно отвечают разные блоки или условия, поэтому всегда проверяйте работу функционала на обоих типах контрагентов.
При установке расширения вы можете столкнуться с ошибкой: «Режим совместимости расширения конфигурации больше режима совместимости основной конфигурации». В этом случае не нужно обновлять всю конфигурацию. Достаточно в свойствах самого расширения (в дереве объектов конфигуратора) найти свойство Режим совместимости и установить его равным режиму совместимости вашей основной конфигурации (например, 8.3.14 или 8.3.10).
Таким образом, мы рассмотрели причины возникновения ошибки и изучили три способа её устранения. Наиболее оптимальным является использование расширения, так как оно позволяет быстро вернуть работоспособность сервиса без изменения типового кода программы. В качестве готовой альтернативы можно использовать обработку для автоматического заполнения реквизитов контрагента по ИНН.