Как получить данные контрагента по ИНН и КПП и загрузить список филиалов в 1С

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При автоматизации заполнения данных контрагентов в 1С разработчики часто сталкиваются с ситуацией, когда у одной организации имеется множество обособленных подразделений (филиалов). У всех этих подразделений будет один и тот же ИНН, но разные КПП. В этой статье мы подробно разберем, как решить проблему получения списка филиалов и их КПП, исправим популярные заблуждения участников форумов и рассмотрим практические примеры реализации интеграции через API.

Почему возникает проблема с КПП и филиалами?

Код причины постановки на учет (КПП) присваивается организации в налоговом органе по месту ее нахождения, а также по месту нахождения ее обособленных подразделений, принадлежащего ей недвижимого имущества и транспортных средств. Таким образом, у одного юридического лица может быть множество КПП. На практике различия в КПП в 95% случаев обусловлены следующими причинами:

Для корректного документооборота в 1С (особенно для формирования УПД, счетов-фактур и ТОРГ-12, где филиалы выступают грузополучателями или грузоотправителями) критически важно иметь возможность разделять контрагентов по связке ИНН и КПП. Рассмотрим, как это можно реализовать программным путем.

Разбор встроенных возможностей сервиса «1С:Контрагент»

Проанализируем, как работает стандартный веб-сервис 1С для работы с контрагентами. В старых редакциях конфигураций (например, Бухгалтерия предприятия КОРП 2.0) часто использовались устаревшие методы API. Выясним главную ошибку их использования: метод getEntrepreneurRequisitesByINN предназначен исключительно для индивидуальных предпринимателей (ИП). Для юридических лиц (ЮЛ) необходимо использовать семейство методов для корпораций.

В современных версиях API 1С (v1) адреса веб-сервисов разграничены по типам субъектов:

  1. Для работы с юридическими лицами: https://api.orgregister.1c.ru/ws/corporation/v1?wsdl
  2. Для работы с индивидуальными предпринимателями: https://api.orgregister.1c.ru/ws/entrepreneur/v1?wsdl
  3. Для получения данных об инспекциях ФНС: https://api.orgregister.1c.ru/ws/inspection/v1?wsdl

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

Решение проблемы с помощью сторонних REST API

В отличие от базового сервиса 1С, специализированные REST-сервисы (например, DaData) предоставляют полноценный функционал для работы с филиальной сетью. Опровергнем распространенное заблуждение о том, что внешние сервисы не умеют искать филиалы по ИНН/КПП. Современные API позволяют делать это двумя способами:

  1. Поиск конкретного филиала по связке ИНН + КПП. При отправке запроса с указанием конкретного КПП сервис возвращает реквизиты именно этого подразделения.
  2. Получение полного списка филиалов по ИНН. При передаче только ИНН метод подсказок возвращает массив всех найденных подразделений компании со своими КПП, адресами и статусами (головная организация обозначена как MAIN, а филиал как BRANCH).

Реализация интеграции с REST API в 1С

Разберем по шагам, как написать обработку на встроенном языке 1С для отправки POST-запроса к API и получения списка всех филиалов организации по ИНН.

Для этого мы настроим HTTP-соединение, сформируем JSON-запрос, отправим его на сервер и распарсим полученный ответ. Посмотрим на пример кода:


Функция ПолучитьСписокФилиаловПоИНН(Знач ИНН, Знач ТокенАвторизации) Экспорт
    
    Результат = Новый Массив;
    
    // Настраиваем HTTP-соединение
    Сервер = "suggestions.dadata.ru";
    Ресурс = "/suggestions/api/4_1/rs/suggest/party";
    
    HTTPСоединение = Новый HTTPСоединение(Сервер, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
    
    // Формируем заголовки запроса
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "application/json");
    Заголовки.Вставить("Accept", "application/json");
    Заголовки.Вставить("Authorization", "Token " + ТокенАвторизации);
    
    // Формируем тело запроса в формате JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    
    СтруктураЗапроса = Новый Структура;
    СтруктураЗапроса.Вставить("query", ИНН);
    
    ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
    СтрокаЗапроса = ЗаписьJSON.Закрыть();
    
    HTTPЗапрос = Новый HTTPЗапрос(Ресурс, Заголовки);
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8);
    
    Попытка
        HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        КодСтатуса = HTTPОтвет.КодСостояния;
        
        Если КодСтатуса = 200 Тогда
            СтрокаОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
            Результат = РазобратьJSONФилиалов(СтрокаОтвета);
        Иначе
            ВызватьИсключение "Ошибка обращения к сервису. Код ответа: " + КодСтатуса;
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("ИнтеграцияФилиалы", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        ВызватьИсключение "Не удалось получить данные по ИНН: " + ОписаниеОшибки();
    КонецПопытки;
    
    Возврат Результат;
КонецФункции

Теперь разберем процедуру парсинга полученной JSON-структуры. Нам необходимо извлечь из ответа наименование организации, тип подразделения (головной офис или филиал), КПП и фактический адрес. Напишем вспомогательную функцию:


Функция РазобратьJSONФилиалов(Знач СтрокаJSON)
    
    СписокФилиалов = Новый Массив;
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
    
    Данные = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Если Данные.Свойство("suggestions") Тогда
        Для Каждого Элемент Из Данные.suggestions Цикл
            
            ИнформацияОФилиале = Новый Структура;
            
            // Получаем основные реквизиты
            ИнформацияОФилиале.Вставить("Наименование", Элемент.value);
            
            ДанныеОрганизации = Элемент.data;
            Если ДанныеОрганизации <> Неопределено Тогда
                ИнформацияОФилиале.Вставить("ИНН", ДанныеОрганизации.inn);
                ИнформацияОФилиале.Вставить("КПП", ДанныеОрганизации.kpp);
                
                // Определяем тип подразделения
                ТипПодразделения = ДанныеОрганизации.branch_type; // MAIN или BRANCH
                ИнформацияОФилиале.Вставить("ТипПодразделения", ТипПодразделения);
                
                // Получаем адрес
                Если ДанныеОрганизации.Свойство("address") И ДанныеОрганизации.address <> Неопределено Тогда
                    ИнформацияОФилиале.Вставить("Адрес", ДанныеОрганизации.address.value);
                Иначе
                    ИнформацияОФилиале.Вставить("Адрес", "");
                КонецЕсли;
            КонецЕсли;
            
            СписокФилиалов.Добавить(ИнформацияОФилиале);
        КонецЦикла;
    КонецЕсли;
    
    Возврат СписокФилиалов;
КонецФункции

Организация учета филиалов в базе данных 1С

Выясним, как правильно хранить полученные сведения в информационной базе 1С. Создание множества дублирующих записей в справочнике Контрагенты с одинаковыми ИНН может привести к путанице в учете и задвоению взаиморасчетов. Рассмотрим оптимальную архитектуру ведения учета обособленных подразделений:

  1. Головной контрагент. В справочнике Контрагенты создается основная карточка компании. В ней указывается ИНН, КПП головной организации, юридический адрес и банковские реквизиты. Все договора и финансовые взаиморасчеты (оплаты, закрытия периодов) ведутся именно по этой карточке.
  2. Обособленные подразделения. Для каждого филиала создается отдельный элемент справочника Контрагенты. В современных конфигурациях 1С (ERP, КА, БП 3.0) у карточки контрагента есть реквизит «Вид контрагента», где можно выбрать значение «Обособленное подразделение». При этом указывается ссылка на головного контрагента.
  3. ИНН и КПП филиала. ИНН наследуется от головного контрагента и блокируется для редактирования, а КПП указывается индивидуальный для этого филиала. Адрес доставки (грузополучателя) заполняется по фактическому адресу филиала.

При оформлении документов реализации или поступления в поле «Покупатель/Поставщик» указывается головной контрагент (так как именно он ведет финансовую деятельность), а в поле «Грузополучатель/Грузоотправитель» выбирается элемент обособленного подразделения. Это позволяет автоматически выводить в печатных формах УПД правильные КПП и адреса доставки, соблюдая требования налогового законодательства.

Преимущества использования REST-подхода

Использование JSON REST API для получения связанных филиалов по сравнению со стандартным SOAP-протоколом 1С имеет ряд неоспоримых преимуществ:

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

← На главную