При автоматизации заполнения данных контрагентов в 1С разработчики часто сталкиваются с ситуацией, когда у одной организации имеется множество обособленных подразделений (филиалов). У всех этих подразделений будет один и тот же ИНН, но разные КПП. В этой статье мы подробно разберем, как решить проблему получения списка филиалов и их КПП, исправим популярные заблуждения участников форумов и рассмотрим практические примеры реализации интеграции через API.
Код причины постановки на учет (КПП) присваивается организации в налоговом органе по месту ее нахождения, а также по месту нахождения ее обособленных подразделений, принадлежащего ей недвижимого имущества и транспортных средств. Таким образом, у одного юридического лица может быть множество КПП. На практике различия в КПП в 95% случаев обусловлены следующими причинами:
Для корректного документооборота в 1С (особенно для формирования УПД, счетов-фактур и ТОРГ-12, где филиалы выступают грузополучателями или грузоотправителями) критически важно иметь возможность разделять контрагентов по связке ИНН и КПП. Рассмотрим, как это можно реализовать программным путем.
Проанализируем, как работает стандартный веб-сервис 1С для работы с контрагентами. В старых редакциях конфигураций (например, Бухгалтерия предприятия КОРП 2.0) часто использовались устаревшие методы API. Выясним главную ошибку их использования: метод getEntrepreneurRequisitesByINN предназначен исключительно для индивидуальных предпринимателей (ИП). Для юридических лиц (ЮЛ) необходимо использовать семейство методов для корпораций.
В современных версиях API 1С (v1) адреса веб-сервисов разграничены по типам субъектов:
https://api.orgregister.1c.ru/ws/corporation/v1?wsdlhttps://api.orgregister.1c.ru/ws/entrepreneur/v1?wsdlhttps://api.orgregister.1c.ru/ws/inspection/v1?wsdlДля поиска юридического лица следует использовать метод getCorporationRequisitesByINN. Однако стандартный сервис «1С:Контрагент» имеет существенное ограничение: он ориентирован на ЕГРЮЛ, где основным идентификатором является ИНН головной организации. Получить весь список филиалов со всеми КПП напрямую через стандартный веб-сервис 1С одной командой не получится.
В отличие от базового сервиса 1С, специализированные REST-сервисы (например, DaData) предоставляют полноценный функционал для работы с филиальной сетью. Опровергнем распространенное заблуждение о том, что внешние сервисы не умеют искать филиалы по ИНН/КПП. Современные API позволяют делать это двумя способами:
MAIN, а филиал как BRANCH).Разберем по шагам, как написать обработку на встроенном языке 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С (ERP, КА, БП 3.0) у карточки контрагента есть реквизит «Вид контрагента», где можно выбрать значение «Обособленное подразделение». При этом указывается ссылка на головного контрагента.При оформлении документов реализации или поступления в поле «Покупатель/Поставщик» указывается головной контрагент (так как именно он ведет финансовую деятельность), а в поле «Грузополучатель/Грузоотправитель» выбирается элемент обособленного подразделения. Это позволяет автоматически выводить в печатных формах УПД правильные КПП и адреса доставки, соблюдая требования налогового законодательства.
Использование JSON REST API для получения связанных филиалов по сравнению со стандартным SOAP-протоколом 1С имеет ряд неоспоримых преимуществ:
ЧтениеJSON и ПрочитатьJSON, что исключает необходимость сложного разбора XML-схем SOAP-конвертов.Таким образом, комбинирование возможностей платформы 1С со сторонними интеграционными сервисами позволяет полностью автоматизировать рутинный ввод данных обособленных подразделений, минимизировать количество ошибок ручного ввода у операторов и обеспечить корректное заполнение регламентированной отчетности по НДС.