Автоматическое заполнение реквизитов контрагента по ИНН — стандартная задача для любой современной конфигурации 1С. Это минимизирует количество ошибок при ручном вводе и существенно ускоряет работу пользователей. Однако при реализации этой задачи разработчики часто сталкиваются с трудностями: официальные сервисы ФНС имеют свои ограничения, сторонние API требуют авторизации, а разбор ответов в формате JSON или XML вызывает вопросы.
В этой статье мы подробно разберем, почему популярный веб-сервис ФНС не подходит для получения адресов и ОГРН, как настроить бесплатную интеграцию со сторонним сервисом DaData.ru, как правильно формировать HTTP-запросы в 1С и обрабатывать полученные ответы.
Часто разработчики пытаются использовать официальный SOAP-сервис проверки контрагентов от ФНС (расположенный по адресу http://npchk.nalog.ru/FNSNDSCAWS_2?wsdl) для получения детальной информации о компании. Типичный код такого запроса выглядит следующим образом:
Определение = Новый WSОпределения("http://npchk.nalog.ru/FNSNDSCAWS_2?wsdl");
Прокси = Новый WSПрокси(Определение, "http://ws.unisoft", "FNSNDSCAWS2", "FNSNDSCAWS2_Port");
Запрос = Прокси.ФабрикаXDTO.Создать(Прокси.ФабрикаXDTO.Тип("http://ws.unisoft/FNSNDSCAWS2/Request", "NdsRequest2"));
Контрагент = Прокси.ФабрикаXDTO.Создать(Прокси.ФабрикаXDTO.Тип("http://ws.unisoft/FNSNDSCAWS2/Request", "NdsRequest2_NP"));
Контрагент.INN = ИНН;
Контрагент.KPP = КПП;
Контрагент.DT = Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy");
Запрос.NP.Добавить(Контрагент);
Результат = Прокси.NdsRequest2(Запрос);
Важно понимать: данный веб-сервис разрабатывался ФНС исключительно для проверки факта существования налогоплательщика и валидации пар ИНН/КПП перед сдачей деклараций по НДС. В схеме XSD этого веб-сервиса просто нет полей для передачи наименования, ОГРН, юридического или фактического адреса. Сервис возвращает лишь цифровой код состояния (например, "0" — налогоплательщик зарегистрирован в ЕГРН и активен, или "1" — налогоплательщик не состоит на учете). Получить из этого источника подробные реквизиты технически невозможно.
Для получения полных и актуальных данных о компании по ИНН лучше использовать специализированные внешние API. Одним из наиболее стабильных и простых в интеграции решений является сервис DaData.ru. На бесплатном тарифе он позволяет выполнять до 10 000 запросов в сутки, чего с запасом хватает для большинства учетных систем.
Рассмотрим по шагам, как реализовать отправку запроса и получение реквизитов контрагента в 1С с использованием механизмов HTTPСоединение и ЧтениеJSON.
Для интеграции нам понадобятся:
suggestions.dadata.ru./suggestions/api/4_1/rs/findById/party.Ниже представлен готовый к использованию программный код для интеграции в вашу конфигурацию:
&НаСервере
Функция ПолучитьРеквизитыКонтрагентаПоИНН(ИНН, APIКлючDaData) Экспорт
РезультатФункции = Новый Структура("Успех, Данные, Ошибка", Ложь, Неопределено, "");
// 1. Настройка параметров подключения
Сервер = "suggestions.dadata.ru";
ПутьКСервису = "suggestions/api/4_1/rs/findById/party";
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
HTTPСоединение = Новый HTTPСоединение(Сервер, 443, , , , 15, SSL);
Исключение
РезультатФункции.Ошибка = "Не удалось установить защищенное соединение с сервером DaData.";
Возврат РезультатФункции;
КонецПопытки;
// 2. Формирование тела запроса в формате JSON
ТелоЗапроса = Новый Структура;
ТелоЗапроса.Вставить("query", ИНН);
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, , , , , , , , Ложь);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
ТелоЗапросаСтрокой = ЗаписьJSON.Закрыть();
// 3. Создание и заполнение HTTP-запроса
HTTPЗапрос = Новый HTTPЗапрос(ПутьКСервису);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.Заголовки.Вставить("Accept", "application/json");
HTTPЗапрос.Заголовки.Вставить("Authorization", "Token " + APIКлючDaData);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаСтрокой, КодировкаТекста.UTF8);
// 4. Отправка запроса на сервер
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Исключение
РезультатФункции.Ошибка = "Ошибка при отправке запроса: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
Возврат РезультатФункции;
КонецПопытки;
// 5. Обработка ответа сервера
Если HTTPОтвет.КодСостояния <> 200 Тогда
РезультатФункции.Ошибка = "Сервер вернул ошибку с кодом состояния: " + HTTPОтвет.КодСостояния;
Возврат РезультатФункции;
КонецЕсли;
ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
Если ПустаяСтрока(ТекстОтвета) Тогда
РезультатФункции.Ошибка = "Получен пустой ответ от сервера.";
Возврат РезультатФункции;
КонецЕсли;
// 6. Парсинг ответа JSON в структуру 1С
Попытка
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
ОтветСтруктура = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Исключение
РезультатФункции.Ошибка = "Ошибка парсинга JSON: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
Возврат РезультатФункции;
КонецПопытки;
// 7. Проверка наличия найденных контрагентов в структуре
Если ОтветСтруктура.Свойство("suggestions") И ОтветСтруктура.suggestions.Количество() > 0 Тогда
РезультатФункции.Успех = Истина;
РезультатФункции.Данные = ОтветСтруктура.suggestions[0]; // Берем первого найденного
Иначе
РезультатФункции.Ошибка = "Контрагент с указанным ИНН не найден в базе данных.";
КонецЕсли;
Возврат РезультатФункции;
КонецФункции
После успешного выполнения нашей функции, переменная РезультатФункции.Данные будет содержать сложную иерархическую структуру данных, возвращенную API. Давайте разберем по шагам, как вытащить оттуда основные реквизиты организации для заполнения карточки контрагента в 1С:
// Предположим, что ИНН и Ключ мы получили из реквизитов формы
Рез = ПолучитьРеквизитыКонтрагентаПоИНН(Объект.ИНН, "ТВОЙ_API_КЛЮЧ_DADATA");
Если Рез.Успех Тогда
ДанныеКонтрагента = Рез.Данные.data;
// 1. Получение наименований
КраткоеНаименование = ДанныеКонтрагента.name.short_with_opf;
ПолноеНаименование = ДанныеКонтрагента.name.full_with_opf;
// 2. Получение кодов
КПП = ДанныеКонтрагента.kpp;
ОГРН = ДанныеКонтрагента.ogrn;
ОКПО = ДанныеКонтрагента.okpo;
// 3. Получение юридического адреса
АдресЮридический = ДанныеКонтрагента.address.value;
// 4. Информация о руководителе (только для юрлиц)
ИмяРуководителя = "";
ДолжностьРуководителя = "";
Если ДанныеКонтрагента.Свойство("management") И ДанныеКонтрагента.management <> Неопределено Тогда
ИмяРуководителя = ДанныеКонтрагента.management.name;
ДолжностьРуководителя = ДанныеКонтрагента.management.post;
КонецЕсли;
// Заполняем реквизиты на форме или в объекте
Объект.Наименование = КраткоеНаименование;
Объект.НаименованиеПолное = ПолноеНаименование;
Объект.КПП = КПП;
Объект.ОГРН = ОГРН;
// Для записи адреса в 1С обычно используется КИ (Контактная информация)
// В простейшем случае записываем строковое представление
Объект.АдресЮридическийСтрокой = АдресЮридический;
Сообщить("Данные успешно получены и заполнены!");
Иначе
Предупреждение("Не удалось получить данные: " + Рез.Ошибка);
КонецЕсли;
В процессе обсуждения на форуме приводились примеры кода запросов к сторонним сервисам (например, интеграционные порталы ЖКХ), которые при попытке получения данных возвращали ошибку {"error" : "Access is denied"}. Проанализируем, почему это происходит.
Большинство современных API защищают свои ресурсы от бесконтрольного парсинга роботами. Ошибка «Доступ запрещен» чаще всего возникает по следующим причинам:
HTTPЗапрос.Заголовки.Вставить("Authorization", "Token " + Token)). Если ключ не передан, сервер отклоняет запрос.User-Agent (эмуляция браузера), либо если запросы идут с недоверенных IP-адресов.Некоторые программисты пытаются использовать веб-сервис egrul.nalog.ru напрямую. Этот способ абсолютно бесплатен и не имеет лимитов, однако его реализация крайне трудоемка из-за встроенной защиты от автоматического сбора данных. Попытка просто отправить HTTP-запрос по ИНН на этот сайт вернет ошибку или пустую страницу, так как сервис требует обязательного ввода капчи.
Для обхода этой защиты разработчики используют следующую схему:
Этот метод рабочий, но крайне нестабильный, поскольку малейшее изменение дизайна сайта ФНС или алгоритмов генерации сессий ломает весь алгоритм разбора, что требует постоянной поддержки кода со стороны программиста. Для промышленного использования в стабильно работающих базах этот подход не рекомендуется.
Если вы работаете в типовой конфигурации 1С (Бухгалтерия предприятия, ERP, Управление нашей фирмой, Комплексная автоматизация) и у вас оформлен договор ИТС уровня ПРОФ, вам нет необходимости писать собственный код интеграции. В платформу уже встроен механизм «1С:Контрагент».
Этот сервис работает «из коробки»: при вводе ИНН в карточке нового контрагента система сама обращается к серверам обновлений фирмы 1С, получает актуальные официальные сведения из ЕГРЮЛ/ЕГРИП и автоматически заполняет все поля, включая адреса, телефоны, ФИО руководителя и коды статистики. Если у вашей компании есть действующая подписка ИТС, настоятельно рекомендуем использовать этот стандартный функционал.