Как в 1С получить реквизиты контрагента (адрес, ОГРН, название) по ИНН с помощью веб-сервисов?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Автоматическое заполнение реквизитов контрагента по ИНН — стандартная задача для любой современной конфигурации 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" — налогоплательщик не состоит на учете). Получить из этого источника подробные реквизиты технически невозможно.

Решение проблемы: интеграция с сервисом DaData.ru по API

Для получения полных и актуальных данных о компании по ИНН лучше использовать специализированные внешние API. Одним из наиболее стабильных и простых в интеграции решений является сервис DaData.ru. На бесплатном тарифе он позволяет выполнять до 10 000 запросов в сутки, чего с запасом хватает для большинства учетных систем.

Рассмотрим по шагам, как реализовать отправку запроса и получение реквизитов контрагента в 1С с использованием механизмов HTTPСоединение и ЧтениеJSON.

Для интеграции нам понадобятся:

  1. Регистрация на сайте сервиса для получения уникального API-ключа (токена).
  2. Адрес сервиса (хост): suggestions.dadata.ru.
  3. Путь к методу API для поиска организаций по ИНН: /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С обычно используется КИ (Контактная информация)
    // В простейшем случае записываем строковое представление
    Объект.АдресЮридическийСтрокой = АдресЮридический;
    
    Сообщить("Данные успешно получены и заполнены!");
Иначе
    Предупреждение("Не удалось получить данные: " + Рез.Ошибка);
КонецЕсли;

Разбор ошибок: почему возникает "Access is denied" при обращении к другим API?

В процессе обсуждения на форуме приводились примеры кода запросов к сторонним сервисам (например, интеграционные порталы ЖКХ), которые при попытке получения данных возвращали ошибку {"error" : "Access is denied"}. Проанализируем, почему это происходит.

Большинство современных API защищают свои ресурсы от бесконтрольного парсинга роботами. Ошибка «Доступ запрещен» чаще всего возникает по следующим причинам:

Альтернатива: Прямой парсинг egrul.nalog.ru (с обходом капчи)

Некоторые программисты пытаются использовать веб-сервис egrul.nalog.ru напрямую. Этот способ абсолютно бесплатен и не имеет лимитов, однако его реализация крайне трудоемка из-за встроенной защиты от автоматического сбора данных. Попытка просто отправить HTTP-запрос по ИНН на этот сайт вернет ошибку или пустую страницу, так как сервис требует обязательного ввода капчи.

Для обхода этой защиты разработчики используют следующую схему:

  1. 1С отправляет первый запрос на сайт ФНС для инициализации сессии и получения токена капчи.
  2. Платформа загружает картинку капчи во временный файл и выводит ее на форму пользователю (либо отправляет картинку во внешние платные сервисы автоматического распознавания, такие как RuCaptcha или Anti-Captcha).
  3. Пользователь (или сервис распознавания) вводит текст с картинки.
  4. 1С отправляет повторный HTTP-запрос, передавая введенный текст капчи и полученный ранее токен сессии.
  5. Только после успешной валидации капчи сервер ФНС отдает JSON или PDF-файл с реквизитами контрагента, который затем разбирается силами встроенного языка 1С.

Этот метод рабочий, но крайне нестабильный, поскольку малейшее изменение дизайна сайта ФНС или алгоритмов генерации сессий ломает весь алгоритм разбора, что требует постоянной поддержки кода со стороны программиста. Для промышленного использования в стабильно работающих базах этот подход не рекомендуется.

Встроенный сервис «1С:Контрагент» как альтернатива самописному коду

Если вы работаете в типовой конфигурации 1С (Бухгалтерия предприятия, ERP, Управление нашей фирмой, Комплексная автоматизация) и у вас оформлен договор ИТС уровня ПРОФ, вам нет необходимости писать собственный код интеграции. В платформу уже встроен механизм «1С:Контрагент».

Этот сервис работает «из коробки»: при вводе ИНН в карточке нового контрагента система сама обращается к серверам обновлений фирмы 1С, получает актуальные официальные сведения из ЕГРЮЛ/ЕГРИП и автоматически заполняет все поля, включая адреса, телефоны, ФИО руководителя и коды статистики. Если у вашей компании есть действующая подписка ИТС, настоятельно рекомендуем использовать этот стандартный функционал.

← На главную