Как настроить автоматическое получение данных контрагента по ИНН в 1С?

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

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

Если перед вами стоит задача прикрутить к вашей системе механизм автоматического поиска данных организации по ИНН, а планируемая нагрузка невелика (около 10–20 запросов в день), у вас есть несколько отличных путей решения. В этой статье мы подробно разберем все доступные варианты решения проблемы: от интеграции с внешними API до заимствования кода из современных типовых конфигураций.

Вариант 1. Интеграция со специализированным сервисом DaData через HTTP API

Одним из самых стабильных и простых способов решения задачи является использование специализированных API-сервисов подсказок. Рассмотрим этот вариант на примере популярного сервиса DaData. Он предоставляет удобный интерфейс подсказок, а его бесплатного тарифа (до 10 000 запросов в сутки) более чем достаточно для небольшой компании с объемом до 20 запросов в день.

Для реализации этого метода нам потребуется зарегистрироваться на сайте сервиса, получить уникальный API-ключ (токен авторизации) и написать HTTP-запрос на стороне 1С.

Разберем по шагам программный код, выполняющий отправку POST-запроса на сервер и последующий разбор полученных данных в формате JSON:


Функция ПолучитьРеквизитыПоИНН_DaData(Знач ИНН, Знач Токен) Экспорт
    
    Результат = Новый Структура;
    Результат.Вставить("Успешно", Ложь);
    Результат.Вставить("НаименованиеПолное", "");
    Результат.Вставить("НаименованиеКраткое", "");
    Результат.Вставить("КПП", "");
    Результат.Вставить("ОГРН", "");
    Результат.Вставить("ЮридическийАдрес", "");
    Результат.Вставить("Руководитель", "");
    Результат.Вставить("ОписаниеОшибки", "");
    
    Сервер = "suggestions.dadata.ru";
    АдресРесурса = "suggestions/api/4_1/rs/findById/party";
    
    Попытка
        // Инициализируем защищенное соединение SSL, так как сервис работает по HTTPS
        ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
        Соединение = Новый HTTPСоединение(Сервер, , , , , , ЗащищенноеСоединение);
        
        // Создаем HTTP-запрос и устанавливаем необходимые заголовки
        Запрос = Новый HTTPЗапрос(АдресРесурса);
        Запрос.Заголовки.Вставить("Content-Type", "application/json");
        Запрос.Заголовки.Вставить("Accept", "application/json");
        Запрос.Заголовки.Вставить("Authorization", "Token " + Токен);
        Запрос.Заголовки.Вставить("X-Partner", "1C"); // Идентификатор партнерской интеграции
        
        // Формируем тело запроса. Сервис ожидает JSON вида {"query": "ИНН"}
        ПараметрыЗапроса = Новый Структура;
        ПараметрыЗапроса.Вставить("query", ИНН);
        
        ЗаписьJSON = Новый ЗаписьJSON;
        ЗаписьJSON.УстановитьСтроку();
        ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
        СтрокаТелаЗапроса = ЗаписьJSON.Закрыть();
        
        Запрос.УстановитьТелоИзСтроки(СтрокаТелаЗапроса, КодировкаТекста.UTF8);
        
        // Отправляем данные на сервер подсказок
        Ответ = Соединение.ОтправитьДляОбработки(Запрос);
        
        Если Ответ.КодСостояния = 200 Тогда
            СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
            
            // Читаем полученный JSON-ответ
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(СтрокаОтвета);
            ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
            ЧтениеJSON.Закрыть();
            
            Если ДанныеОтвета.Свойство("suggestions") И ДанныеОтвета.suggestions.Количество() > 0 Тогда
                // Получаем первый найденный объект (наиболее точное совпадение)
                СведенияОрганизации = ДанныеОтвета.suggestions[0];
                Результат.НаименованиеКраткое = СведенияОрганизации.value;
                
                Если СведенияОрганизации.Свойство("data") Тогда
                    ПодробныеДанные = СведенияОрганизации.data;
                    
                    // Извлекаем КПП
                    Если ПодробныеДанные.Свойство("kpp") Тогда
                        Результат.КПП = ПодробныеДанные.kpp;
                    КонецЕсли;
                    
                    // Извлекаем ОГРН
                    Если ПодробныеДанные.Свойство("ogrn") Тогда
                        Результат.ОГРН = ПодробныеДанные.ogrn;
                    КонецЕсли;
                    
                    // Извлекаем полное наименование
                    Если ПодробныеДанные.Свойство("name") И ПодробныеДанные.name.Свойство("full_with_opf") Тогда
                        Результат.НаименованиеПолное = ПодробныеДанные.name.full_with_opf;
                    КонецЕсли;
                    
                    // Извлекаем юридический адрес
                    Если ПодробныеДанные.Свойство("address") И ПодробныеДанные.address.Свойство("value") Тогда
                        Результат.ЮридическийАдрес = ПодробныеДанные.address.value;
                    КонецЕсли;
                    
                    // Извлекаем ФИО руководителя
                    Если ПодробныеДанные.Свойство("management") И ПодробныеДанные.management <> Неопределено Тогда
                        Если ПодробныеДанные.management.Свойство("name") Тогда
                            Результат.Руководитель = ПодробныеДанные.management.name;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
                
                Результат.Успешно = Истина;
            Иначе
                Результат.ОписаниеОшибки = "Организация с указанным ИНН не найдена в базе данных.";
            КонецЕсли;
        Иначе
            Результат.ОписаниеОшибки = "Ошибка обращения к веб-сервису. Код ответа сервера: " + Ответ.КодСостояния;
        КонецЕсли;
        
    Исключение
        Результат.ОписаниеОшибки = "Системная ошибка выполнения HTTP-запроса: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;
    
    Возврат Результат;
КонецФункции

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

Вариант 2. Перенос типового программного кода из новых конфигураций 1С

Если на вашем предприятии приобретена подписка на информационно-технологическое сопровождение (1С:ИТС), вы можете использовать официальный функционал автозаполнения, разработанный фирмой 1С. Поскольку в вашей старой УТ 11.1 этой интеграции нет или она больше не поддерживается серверами авторизации ИТС, мы можем перенести рабочий механизм из любой современной типовой конфигурации, например, из актуальной версии 1С:Бухгалтерия предприятия 3.0 или 1С:Управление торговлей 11.2 (и выше).

Для успешного заимствования кода проанализируем структуру общих модулей в новой конфигурации-доноре:

  1. Откроем конфигуратор актуальной базы БП 3.0.
  2. Найдем общий модуль РаботаСКонтрагентами.
  3. Внутри этого модуля нас в первую очередь интересует экспортная функция РеквизитыЮридическогоЛицаПоИНН(Знач ИНН). Данная функция выполняет штатный запрос к серверам ИТС.
  4. Перенесем данную функцию вместе со всеми зависимыми процедурами и функциями во вновь созданный или существующий общий модуль в нашей УТ 11.1 (например, в модуль РаботаСКонтрагентамиПереопределяемый или создадим отдельный нетиповой модуль).

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

Вариант 3. Использование простых и полностью бесплатных GET-сервисов

Если для интеграции с DaData требуется обязательная регистрация и хранение токенов в системе, то существуют еще более легкие альтернативы. Для системного администратора или разработчика, которому требуется максимально простая реализация, отлично подойдут публичные API, работающие по классическому протоколу GET. Одним из таких сервисов является egrul.itsoft.ru.

В отличие от POST-запросов со сложной структурой JSON-тела, здесь отправка запроса сводится к добавлению ИНН прямо в строку веб-адреса. Посмотрим на практический пример реализации такого запроса:


Функция ПолучитьДанныеЧерезItsoft(Знач ИНН) Экспорт
    
    Результат = Новый Структура("Успешно, Название, КПП, Адрес, Руководитель, Ошибка", Ложь, "", "", "", "", "");
    
    Сервер = "egrul.itsoft.ru";
    Ресурс = "/short_data/?" + ИНН;
    
    Попытка
        // Для этого публичного сервиса обычно не требуется защищенное соединение SSL
        Соединение = Новый HTTPСоединение(Сервер);
        Запрос = Новый HTTPЗапрос(Ресурс);
        
        Ответ = Соединение.Получить(Запрос);
        
        Если Ответ.КодСостояния = 200 Тогда
            СтрокаJSON = Ответ.ПолучитьТелоКакСтроку();
            
            Чтение = Новый ЧтениеJSON;
            Чтение.УстановитьСтроку(СтрокаJSON);
            Данные = ПрочитатьJSON(Чтение);
            Чтение.Закрыть();
            
            // Если сервис вернул корректный JSON с заполненным именем организации
            Если Данные.Свойство("name") Тогда
                Результат.Название = Данные.name;
                
                Если Данные.Свойство("kpp") Тогда
                    Результат.КПП = Данные.kpp;
                КонецЕсли;
                
                Если Данные.Свойство("address") Тогда
                    Результат.Адрес = Данные.address;
                КонецЕсли;
                
                Если Данные.Свойство("director") Тогда
                    Результат.Руководитель = Данные.director;
                КонецЕсли;
                
                Результат.Успешно = Истина;
            Иначе
                Результат.Ошибка = "Не удалось найти сведения по ИНН в базе сервиса.";
            КонецЕсли;
        Иначе
            Результат.Ошибка = "Не удалось связаться с сервером. Код ошибки: " + Ответ.КодСостояния;
        КонецЕсли;
    Исключение
        Результат.Ошибка = "Сетевой сбой при отправке GET-запроса: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;
    
    Возврат Результат;
КонецФункции

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

Важные технические нюансы реализации заполнения

После того как вы выбрали один из способов получения данных и научились забирать корректный JSON с веб-сервиса, необходимо правильно применить его на уровне логики конфигурации УТ 11.1.

Проанализируем архитектурную особенность ведения учета контрагентов в конфигурациях на базе ERP-платформ (включая УТ 11). В отличие от старых конфигураций (таких как УТ 10.3), здесь справочник клиентов разделен на две сущности:

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

← На главную