При автоматизации работы в 1С:Бухгалтерия предприятия 3.0 часто возникает задача массового обновления или заполнения данных контрагентов. В интерфейсе программы для этого предусмотрена кнопка «Заполнить по ИНН», однако попытка вызвать ее программно через команду формы ЗаполнитьРеквизитыПоИНН(Команда) напрямую из внешнего кода (например, из обработки) не увенчается успехом. Это связано с тем, что команды формы предназначены для интерактивного взаимодействия и требуют контекста открытого окна.
В этой статье мы разберем, как правильно реализовать программный обход справочника Контрагенты и заполнить их реквизиты, используя возможности серверных общих модулей, предоставляемых типовой конфигурацией.
Типовая команда ЗаполнитьРеквизитыПоИНН в модуле формы выполняет множество действий: обращается к сервису, обрабатывает ответы, задает вопросы пользователю. Для программного кода нам нужен «чистый» инструмент получения данных. Рассмотрим наиболее эффективный путь решения через использование функций общего модуля РаботаСКонтрагентами.
Для корректной работы нам необходимо учитывать два типа контрагентов: юридические лица и индивидуальные предприниматели (ИП). Для каждого из них в системе предусмотрены свои методы получения данных через сервис 1С:Контрагент.
Для работы с юридическими лицами (ИНН из 10 знаков) мы будем использовать функцию РеквизитыЮридическогоЛицаПоИНН. Проанализируем структуру кода, который позволит нам перебрать контрагентов и обновить их данные.
Рассмотрим пример кода для массовой обработки:
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Или ПустаяСтрока(Выборка.ИНН) Тогда
Продолжить;
КонецЕсли;
// Работаем только с Юрлицами (ИНН 10 знаков)
Если СтрДлина(СокрЛП(Выборка.ИНН)) = 10 Тогда
// Получаем структуру данных из сервиса
ДанныеКонтрагента = РаботаСКонтрагентами.РеквизитыЮридическогоЛицаПоИНН(Выборка.ИНН);
// Проверяем, не вернул ли сервис ошибку (например, ИНН не найден)
Если ЗначениеЗаполнено(ДанныеКонтрагента.ОписаниеОшибки) Тогда
ЗаписьЖурналаРегистрации("ЗаполнениеПоИНН", УровеньЖурналаРегистрации.Предупреждение, , ,
"Ошибка по ИНН " + Выборка.ИНН + ": " + ДанныеКонтрагента.ОписаниеОшибки);
Продолжить;
КонецЕсли;
// Обновляем объект
ОбъектКонтрагент = Выборка.ПолучитьОбъект();
ОбъектКонтрагент.КПП = ДанныеКонтрагента.КПП;
ОбъектКонтрагент.НаименованиеПолное = ДанныеКонтрагента.НаименованиеПолное;
ОбъектКонтрагент.Наименование = ДанныеКонтрагента.НаименованиеСокращенное;
Попытка
ОбъектКонтрагент.Записать();
Исключение
Сообщить("Не удалось записать контрагента: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Важно помнить, что структура данных и методы для ИП отличаются. Если мы попытаемся вызвать функцию для юрлиц, передав ИНН предпринимателя (12 знаков), сервис может вернуть ошибку или пустой результат. Для ИП следует использовать метод РаботаСКонтрагентами.РеквизитыИндивидуальногоПредпринимателяПоИНН(ИНН).
Выясним причину разделения: у ИП отсутствуют такие реквизиты как КПП, а наименование формируется по шаблону "ИП Фамилия Имя Отчество". Поэтому в общем цикле обработки рекомендуется добавить условие на длину ИНН.
Сервис 1С:Контрагент возвращает адрес не просто строкой, а в виде структуры (часто в формате XML для КЛАДР/ФИАС). Простое присваивание строки в поле адреса может привести к некорректному отображению в печатных формах.
Для правильной записи адреса проанализируем ситуацию: в структуре ДанныеКонтрагента, которую мы получили ранее, есть вложенная структура ЮридическийАдрес. Для ее корректного сохранения в справочник Контрагенты необходимо использовать методы модуля УправлениеКонтактнойИнформацией.
Пример записи адреса:
Если ДанныеКонтрагента.Свойство("ЮридическийАдрес") И ДанныеКонтрагента.ЮридическийАдрес <> Неопределено Тогда
ТипАдреса = Перечисления.ТипыКонтактнойИнформации.Адрес;
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ОбъектКонтрагент,
ДанныеКонтрагента.ЮридическийАдрес.Представление, ВидАдреса, ТипАдреса);
КонецЕсли;
Разберем по шагам критические моменты, о которых стоит помнить при массовой обработке:
РеквизитыЮридическогоЛицаПоИНН списывает одну единицу из вашей подписки. Стандартный пакет включает около 7200 запросов в год. Массовый запуск обработки на базе с десятками тысяч контрагентов может мгновенно обнулить ваш лимит. Перед запуском обязательно проверьте количество доступных запросов в личном кабинете на портале 1С.Если лимитов сервиса 1С:Контрагент недостаточно, программисты часто прибегают к интеграции с внешними API, такими как Dadata. В этом случае вместо вызова функций модуля РаботаСКонтрагентами, вам потребуется написать собственную функцию формирования HTTP-запроса, которая будет принимать ИНН и возвращать JSON с данными. Принципиальная схема работы (получение структуры -> разбор по реквизитам -> запись объекта) останется прежней.
Подводя итог, можно сказать, что программное заполнение по ИНН — это мощный инструмент очистки базы, но он требует осторожности в части расхода платных лимитов и аккуратного обращения с существующими данными учета.