При работе в 1С:Бухгалтерии 3.0 часто возникает задача автоматического создания нового контрагента и заполнения его реквизитов на основе известного ИНН. Ручной ввод данных занимает много времени и сопряжен с риском ошибок. Мы рассмотрим, как можно решить эту задачу программно, используя как встроенные механизмы 1С, так и альтернативные подходы с внешними API.
Для программного создания контрагента и заполнения его данных по ИНН в 1С:Бухгалтерии 3.0 существует несколько ключевых подходов, каждый из которых имеет свои особенности, преимущества и ограничения. Мы подробно разберем два основных метода: использование сервиса «1С-Контрагент» и интеграцию с внешними API, такими как API ФНС или DaData.ru.
Сервис «1С-Контрагент» является наиболее простым и интегрированным способом автоматического заполнения реквизитов контрагентов непосредственно в типовых конфигурациях 1С. Этот сервис позволяет получать актуальные данные из ЕГРЮЛ/ЕГРИП по ИНН или наименованию. При необходимости массовой автозагрузки можно использовать обработку для загрузки контрагентов по списку ИНН.
Преимущества:
Ограничения и условия использования:
Как это работает программно?
В типовых конфигурациях 1С, начиная с версии 3.0.35 для Бухгалтерии, функционал автозаполнения реквизитов по ИНН уже реализован. Мы можем вызвать этот функционал программно, используя стандартные методы платформы 1С. Обычно, для работы с контрагентами используется справочник Справочники.Контрагенты. При создании нового элемента или при изменении существующего, можно инициировать процесс заполнения.
Рассмотрим общий подход к программному вызову заполнения реквизитов контрагента по ИНН. Мы создадим новый элемент справочника Контрагенты и затем вызовем процедуру, которая имитирует нажатие кнопки «Заполнить реквизиты по ИНН»:
// Пример программного создания контрагента и заполнения по ИНН
// Предполагаем, что у нас есть ИНН, по которому нужно найти и заполнить контрагента.
Функция СоздатьИЗаполнитьКонтрагентаПоИНН(ИННКонтрагента) Экспорт
// Проверим, возможно, контрагент с таким ИНН уже существует
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", ИННКонтрагента);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
// Контрагент уже существует, возвращаем его ссылку
Возврат РезультатЗапроса.Выбрать().Ссылка;
КонецЕсли;
// Если контрагент не найден, создаем нового
НовыйКонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагентОбъект.ИНН = ИННКонтрагента;
Попытка
// Здесь мы вызываем типовой функционал автозаполнения
// В типовых конфигурациях этот функционал может быть реализован в общих модулях
// или в форме элемента справочника.
// Мы предполагаем наличие Общего модуля "РегламентированныйУчетПереопределяемый"
// или подобного, который содержит экспортные процедуры для работы с контрагентами.
// Имя функции может отличаться в зависимости от версии конфигурации.
// Предполагаемый вызов функции заполнения, которая использует 1С-Контрагент
// Эта функция может быть в разных общих модулях или быть методом объекта.
// Для 1С:Бухгалтерии 3.0 часто используются модули, связанные с работой с адресами и контрагентами.
// Например, может быть что-то вроде:
// ОбщегоНазначенияБП.ЗаполнитьРеквизитыКонтрагента(НовыйКонтрагентОбъект);
// Более универсальный подход - использование механизма фонового выполнения,
// но для простоты и прямого вызова мы можем искать функции, подобные той, что используется в формах.
// Вариант 1: Использование общих методов из модулей "ЗаполнениеРеквизитовКонтрагентовКлиентСервер"
// или "ОбщегоНазначенияБП" или "ОбщегоНазначенияКлиентСервер"
// Пример (псевдокод, точное имя функции может варьироваться):
ДанныеДляЗаполнения = Новый Структура;
ДанныеДляЗаполнения.Вставить("ИНН", ИННКонтрагента);
ДанныеДляЗаполнения.Вставить("КПП", ""); // КПП может быть неизвестен на старте
РезультатЗаполнения = ЗаполнениеРеквизитовКонтрагентовКлиентСервер.ПолучитьДанныеКонтрагентаИзЕГРЮЛ(НовыйКонтрагентОбъект, ДанныеДляЗаполнения);
// После получения данных, нам нужно их применить к объекту.
// В реальной конфигурации это делается внутри той же процедуры или возвращается структура.
Если РезультатЗаполнения.Заполнен Тогда
// Если данные успешно получены и заполнены, записываем объект
НовыйКонтрагентОбъект.Записать();
Возврат НовыйКонтрагентОбъект.Ссылка;
Иначе
Сообщить("Не удалось заполнить реквизиты контрагента по ИНН: " + ИННКонтрагента + ". " + РезультатЗаполнения.СообщениеОбОшибке);
Возврат Неопределено;
КонецЕсли;
Исключение
Сообщить("Произошла ошибка при попытке заполнить реквизиты контрагента по ИНН " + ИННКонтрагента + ": " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
// Пример использования:
// СсылкаНаКонтрагента = СоздатьИЗаполнитьКонтрагентаПоИНН("7707083893");
// Если СсылкаНаКонтрагента <> Неопределено Тогда
// Сообщить("Контрагент успешно создан/найден: " + СсылкаНаКонтрагента);
// Иначе
// Сообщить("Не удалось создать/найти контрагента.");
// КонецЕсли;
Важно отметить, что точные имена методов и их параметры для программного вызова «1С-Контрагента» могут отличаться в разных версиях конфигурации. Для определения точных вызовов рекомендуем использовать отладчик и проанализировать код типовой формы элемента справочника «Контрагенты», в частности, обработчик команды «Заполнить реквизиты по ИНН».
Если по каким-либо причинам использование «1С-Контрагента» не подходит (например, из-за стоимости, отсутствия ИТС или необходимости в более глубокой кастомизации), мы можем использовать сторонние API, которые предоставляют данные из ЕГРЮЛ/ЕГРИП. Этот подход требует написания собственного кода для отправки HTTP-запросов, парсинга JSON-ответов и заполнения полей справочника 1С.
Общий алгоритм действий:
Существуют различные сервисы, которые предоставляют доступ к данным ЕГРЮЛ/ЕГРИП, используя официальные источники ФНС. Одним из таких примеров является api-fns.ru. Этот сервис предлагает API для поиска компаний и ИП по ИНН, получения полных данных из реестров и отслеживания изменений.
Особенности api-fns.ru:
DaData.ru — это еще один популярный сервис, предоставляющий API для стандартизации и обогащения данных, включая информацию о компаниях и ИП. Он также собирает данные из ЕГРЮЛ/ЕГРИП и может предоставить бухгалтерскую отчетность. Для групповой обработки и импорта данных по списку ИНН подойдёт обработка для загрузки и создания контрагентов через DaData.
Особенности DaData.ru:
Пример программной реализации с внешним API (общий подход для JSON-API):
Мы рассмотрим шаги, которые необходимо выполнить в коде 1С для работы с внешним API. В качестве примера будем использовать гипотетический API, который принимает ИНН и возвращает JSON с данными контрагента.
// Пример функции для получения данных о контрагенте из внешнего JSON API
// и заполнения справочника "Контрагенты".
Функция ПолучитьДанныеКонтрагентаИзВнешнегоAPI(ИННКонтрагента) Экспорт
Если ПустаяСтрока(ИННКонтрагента) Тогда
Сообщить("ИНН не может быть пустым.");
Возврат Неопределено;
КонецЕсли;
// 1. Параметры API
// Замените на реальные URL и токен вашего API (например, DaData.ru или api-fns.ru)
СтрокаЗапросаAPI = "https://api.example.com/company?inn=" + ИННКонтрагента;
ТокенАвторизации = "ВАШ_API_ТОКЕН"; // Получите на сайте выбранного API
// 2. Инициализация объекта HTTP-запроса
HTTPЗапрос = Новый HTTPЗапрос(СтрокаЗапросаAPI);
HTTPЗапрос.Заголовки.Вставить("Authorization", "Token " + ТокенАвторизации); // Пример для DaData.ru, может отличаться
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json"); // Указываем тип контента
// 3. Отправка HTTP-запроса
Попытка
HTTPСоединение = Новый HTTPСоединение("api.example.com", , , , , , Новый ЗащищенноеСоединениеOpenSSL()); // Укажите хост API
Ответ = HTTPСоединение.Получить(HTTPЗапрос);
Исключение
Сообщить("Ошибка при выполнении HTTP-запроса: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
// 4. Проверка статуса ответа и получение JSON
Если Ответ.КодСостояния = 200 Тогда
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
// Преобразуем JSON строку в структуру 1С
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
ДанныеКонтрагента = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// 5. Обработка полученных данных и создание/обновление контрагента
Если ДанныеКонтрагента <> Неопределено Тогда
Возврат СоздатьИлиОбновитьКонтрагента(ДанныеКонтрагента);
Иначе
Сообщить("Не удалось прочитать данные контрагента из JSON.");
Возврат Неопределено;
КонецЕсли;
Иначе
Сообщить("Ошибка HTTP-запроса. Код состояния: " + Ответ.КодСостояния + ", Тело ответа: " + Ответ.ПолучитьТелоКакСтроку());
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Функция для создания или обновления элемента справочника "Контрагенты"
Функция СоздатьИлиОбновитьКонтрагента(ДанныеAPI)
// Примерный JSON-ответ от API может выглядеть так (зависит от API):
// {
// "inn": "7707083893",
// "kpp": "770701001",
// "short_name": "Сбербанк",
// "full_name": "Публичное акционерное общество 'Сбербанк России'",
// "address": "117997, г. Москва, ул. Вавилова, д. 19",
// "director_name": "Греф Герман Оскарович",
// "director_position": "Президент, Председатель Правления"
// }
// Проверим, есть ли обязательные поля
Если Не ДанныеAPI.Свойство("inn") Или ПустаяСтрока(ДанныеAPI.inn) Тогда
Сообщить("В полученных данных отсутствует ИНН.");
Возврат Неопределено;
КонецЕсли;
ИНН = ДанныеAPI.inn;
// Поиск существующего контрагента по ИНН
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", ИНН);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
СсылкаНаКонтрагента = Неопределено;
Если Выборка.Следующий() Тогда
СсылкаНаКонтрагента = Выборка.Ссылка;
Сообщить("Контрагент с ИНН " + ИНН + " уже существует. Обновляем данные.");
Иначе
Сообщить("Контрагент с ИНН " + ИНН + " не найден. Создаем нового.");
КонецЕсли;
// Получаем объект контрагента
КонтрагентОбъект = Неопределено;
Если СсылкаНаКонтрагента <> Неопределено Тогда
КонтрагентОбъект = СсылкаНаКонтрагента.ПолучитьОбъект();
Иначе
КонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
КонецЕсли;
// Заполняем реквизиты объекта данными из API
КонтрагентОбъект.ИНН = ИНН;
Если ДанныеAPI.Свойство("kpp") Тогда
КонтрагентОбъект.КПП = ДанныеAPI.kpp;
КонецЕсли;
Если ДанныеAPI.Свойство("full_name") Тогда
КонтрагентОбъект.НаименованиеПолное = ДанныеAPI.full_name;
КонецЕсли;
Если ДанныеAPI.Свойство("short_name") Тогда
КонтрагентОбъект.Наименование = ДанныеAPI.short_name; // Краткое наименование
ИначеЕсли ДанныеAPI.Свойство("full_name") Тогда
// Если короткого нет, используем полное
КонтрагентОбъект.Наименование = ДанныеAPI.full_name;
КонецЕсли;
// Адрес
Если ДанныеAPI.Свойство("address") Тогда
// Для адреса в 1С часто используется сложная структура
// Или можно просто установить строковое представление адреса в соответствующее поле
// Например: ЮридическийАдрес
// Здесь мы просто для примера устанавливаем в строковое поле
КонтрагентОбъект.ЮридическийАдрес = ДанныеAPI.address;
// В реальной жизни для точного заполнения адреса по ФИАС
// могут потребоваться дополнительные функции или вызовы стандартных обработчиков 1С.
// Пример: ОбщегоНазначенияБП.ПолучитьСтрокуАдреса(СтруктураАдресаИзAPI);
КонецЕсли;
// Контактная информация (руководитель)
Если ДанныеAPI.Свойство("director_name") Тогда
// Необходимо найти или создать физическое лицо
ФизЛицоРуководитель = Справочники.ФизическиеЛица.НайтиПоНаименованию(ДанныеAPI.director_name);
Если ФизЛицоРуководитель = Неопределено Тогда
НовоеФизЛицо = Справочники.ФизическиеЛица.СоздатьЭлемент();
НовоеФизЛицо.Наименование = ДанныеAPI.director_name;
Попытка
НовоеФизЛицо.Записать();
ФизЛицоРуководитель = НовоеФизЛицо.Ссылка;
Исключение
Сообщить("Ошибка при создании физического лица: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Если ФизЛицоРуководитель <> Неопределено Тогда
// Заполнение контактной информации руководителя может быть специфичным для конфигурации
// Например, через регистр сведений или поля в справочнике.
// Для БП 3.0 информация о руководителе обычно заполняется в специальной форме.
// Мы просто указываем ФИО руководителя в реквизит объекта
КонтрагентОбъект.Руководитель = ФизЛицоРуководитель;
Если ДанныеAPI.Свойство("director_position") Тогда
КонтрагентОбъект.ДолжностьРуководителя = ДанныеAPI.director_position;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Другие поля, которые можно заполнить, если они есть в ответе API:
// ОКПО, ОГРН, ОКФС, ОКОПФ, ОКВЭД, БанковскиеСчета, ДатаРегистрации и т.д.
// Каждый реквизит требует отдельной обработки.
Попытка
КонтрагентОбъект.Записать();
Возврат КонтрагентОбъект.Ссылка;
Исключение
Сообщить("Ошибка при записи контрагента: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
// Пример использования:
// СсылкаНаНовогоКонтрагента = ПолучитьДанныеКонтрагентаИзВнешнегоAPI("7707083893");
// Если СсылкаНаНовогоКонтрагента <> Неопределено Тогда
// Сообщить("Контрагент успешно создан/обновлен: " + СсылкаНаНовогоКонтрагента);
// Иначе
// Сообщить("Не удалось создать/обновить контрагента через внешний API.");
// КонецЕсли;
Важные моменты при работе с внешними API:
Программное создание контрагента в 1С:Бухгалтерии 3.0 по ИНН — это эффективный способ автоматизировать рутинные операции и повысить точность данных. Мы рассмотрели два основных подхода: использование встроенного сервиса «1С-Контрагент» и интеграцию с внешними API.
«1С-Контрагент» является предпочтительным выбором для тех, кто ищет максимально простую и интегрированную опцию, готовую к работе «из коробки», но при этом готов нести затраты на подписку и учитывать лимиты запросов.
Использование внешних API (таких как api-fns.ru или DaData.ru) предоставляет большую гибкость и возможность бесплатного использования в небольших объемах, однако требует значительных усилий по разработке собственного кода для взаимодействия с API, парсинга JSON и маппинга данных на объекты 1С. Этот метод подойдет для тех, кто нуждается в полной кастомизации или стремится минимизировать расходы, имея ресурсы для разработки.
При выборе метода всегда оценивайте ваши текущие потребности, доступные ресурсы и бюджет. Вне зависимости от выбранного пути, автоматизация заполнения данных контрагентов значительно улучшит качество и эффективность работы в 1С:Бухгалтерии 3.0.