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

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

При работе в 1С:Бухгалтерии 3.0 часто возникает задача автоматического создания нового контрагента и заполнения его реквизитов на основе известного ИНН. Ручной ввод данных занимает много времени и сопряжен с риском ошибок. Мы рассмотрим, как можно решить эту задачу программно, используя как встроенные механизмы 1С, так и альтернативные подходы с внешними API.

Для программного создания контрагента и заполнения его данных по ИНН в 1С:Бухгалтерии 3.0 существует несколько ключевых подходов, каждый из которых имеет свои особенности, преимущества и ограничения. Мы подробно разберем два основных метода: использование сервиса «1С-Контрагент» и интеграцию с внешними API, такими как API ФНС или DaData.ru.

Метод 1: Использование сервиса «1С-Контрагент»

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

Преимущества:

  1. Глубокая интеграция: Сервис встроен непосредственно в типовые конфигурации 1С, что обеспечивает максимальное удобство использования без необходимости написания сложного кода. Функционал доступен прямо из карточки контрагента.
  2. Актуальность данных: Информация поступает из официальных источников (ФНС), что гарантирует ее достоверность и своевременное обновление.
  3. Дополнительные возможности: Помимо заполнения реквизитов, «1С-Контрагент» предоставляет функцию «Досье контрагента», которая позволяет получить расширенную информацию для оценки благонадежности партнера, включая данные о проверках, финансовой отчетности и учредителях. Также сервис автоматически подбирает адреса по ФИАС.
  4. Простота использования для пользователя: Для заполнения достаточно ввести ИНН и нажать кнопку «Заполнить реквизиты по ИНН».

Ограничения и условия использования:

  1. Платность: «1С-Контрагент» является платным сервисом. Стоимость его использования составляет около 5800 рублей в год за ограниченный тариф. Существуют также безлимитные тарифы, которые стоят значительно дороже.
  2. Зависимость от ИТС: Для пользователей 1С:ИТС ПРОФ сервис может предоставляться бесплатно на весь срок действия договора в рамках определенного лимита запросов (например, 7200 обращений для автозаполнения и 360 для «Досье» ежегодно). Однако, даже если нет подписки ИТС ПРОФ, сервис можно приобрести отдельно. Тем не менее, для стабильной работы и обновлений конфигурации, наличие ИТС все равно крайне желательно.
  3. Лимиты запросов: Даже платные тарифы и тарифы для подписчиков ИТС ПРОФ имеют ограничения по количеству запросов в год. При превышении лимитов может потребоваться покупка дополнительных пакетов запросов.

Как это работает программно?

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

Рассмотрим общий подход к программному вызову заполнения реквизитов контрагента по ИНН. Мы создадим новый элемент справочника Контрагенты и затем вызовем процедуру, которая имитирует нажатие кнопки «Заполнить реквизиты по ИНН»:


// Пример программного создания контрагента и заполнения по ИНН
// Предполагаем, что у нас есть ИНН, по которому нужно найти и заполнить контрагента.

Функция СоздатьИЗаполнитьКонтрагентаПоИНН(ИННКонтрагента) Экспорт

    // Проверим, возможно, контрагент с таким ИНН уже существует
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Контрагенты.Ссылка
        |ИЗ
        |    Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |    Контрагенты.ИНН = &ИНН";
    Запрос.УстановитьПараметр("ИНН", ИННКонтрагента);

    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        // Контрагент уже существует, возвращаем его ссылку
        Возврат РезультатЗапроса.Выбрать().Ссылка;
    КонецЕсли;

    // Если контрагент не найден, создаем нового
    НовыйКонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
    НовыйКонтрагентОбъект.ИНН = ИННКонтрагента;
    
    Попытка
        // Здесь мы вызываем типовой функционал автозаполнения
        // В типовых конфигурациях этот функционал может быть реализован в общих модулях
        // или в форме элемента справочника. 
        // Мы предполагаем наличие Общего модуля "РегламентированныйУчетПереопределяемый"
        // или подобного, который содержит экспортные процедуры для работы с контрагентами.
        // Имя функции может отличаться в зависимости от версии конфигурации.

        // Предполагаемый вызов функции заполнения, которая использует 1С-Контрагент
        // Эта функция может быть в разных общих модулях или быть методом объекта.
        // Для 1С:Бухгалтерии 3.0 часто используются модули, связанные с работой с адресами и контрагентами.
        // Например, может быть что-то вроде:
        // ОбщегоНазначенияБП.ЗаполнитьРеквизитыКонтрагента(НовыйКонтрагентОбъект);
        
        // Более универсальный подход - использование механизма фонового выполнения,
        // но для простоты и прямого вызова мы можем искать функции, подобные той, что используется в формах.

        // Вариант 1: Использование общих методов из модулей "ЗаполнениеРеквизитовКонтрагентовКлиентСервер"
        // или "ОбщегоНазначенияБП" или "ОбщегоНазначенияКлиентСервер"
        // Пример (псевдокод, точное имя функции может варьироваться):
        ДанныеДляЗаполнения = Новый Структура;
        ДанныеДляЗаполнения.Вставить("ИНН", ИННКонтрагента);
        ДанныеДляЗаполнения.Вставить("КПП", ""); // КПП может быть неизвестен на старте

        РезультатЗаполнения = ЗаполнениеРеквизитовКонтрагентовКлиентСервер.ПолучитьДанныеКонтрагентаИзЕГРЮЛ(НовыйКонтрагентОбъект, ДанныеДляЗаполнения);
        // После получения данных, нам нужно их применить к объекту.
        // В реальной конфигурации это делается внутри той же процедуры или возвращается структура.

        Если РезультатЗаполнения.Заполнен Тогда
            // Если данные успешно получены и заполнены, записываем объект
            НовыйКонтрагентОбъект.Записать();
            Возврат НовыйКонтрагентОбъект.Ссылка;
        Иначе
            Сообщить("Не удалось заполнить реквизиты контрагента по ИНН: " + ИННКонтрагента + ". " + РезультатЗаполнения.СообщениеОбОшибке);
            Возврат Неопределено;
        КонецЕсли;

    Исключение
        Сообщить("Произошла ошибка при попытке заполнить реквизиты контрагента по ИНН " + ИННКонтрагента + ": " + ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;

КонецФункции

// Пример использования:
// СсылкаНаКонтрагента = СоздатьИЗаполнитьКонтрагентаПоИНН("7707083893"); 
// Если СсылкаНаКонтрагента <> Неопределено Тогда
//     Сообщить("Контрагент успешно создан/найден: " + СсылкаНаКонтрагента);
// Иначе
//     Сообщить("Не удалось создать/найти контрагента.");
// КонецЕсли;

Важно отметить, что точные имена методов и их параметры для программного вызова «1С-Контрагента» могут отличаться в разных версиях конфигурации. Для определения точных вызовов рекомендуем использовать отладчик и проанализировать код типовой формы элемента справочника «Контрагенты», в частности, обработчик команды «Заполнить реквизиты по ИНН».

Метод 2: Использование бесплатных и альтернативных API

Если по каким-либо причинам использование «1С-Контрагента» не подходит (например, из-за стоимости, отсутствия ИТС или необходимости в более глубокой кастомизации), мы можем использовать сторонние API, которые предоставляют данные из ЕГРЮЛ/ЕГРИП. Этот подход требует написания собственного кода для отправки HTTP-запросов, парсинга JSON-ответов и заполнения полей справочника 1С.

Общий алгоритм действий:

  1. Выбор API: Выбираем подходящий сервис (например, api-fns.ru или DaData.ru).
  2. Регистрация и получение токена: Регистрируемся на выбранном сервисе и получаем API-ключ или токен, который потребуется для авторизации запросов.
  3. Отправка HTTP-запроса: Формируем HTTP-запрос к API, передавая ИНН в качестве параметра.
  4. Получение и парсинг JSON-ответа: Обрабатываем полученный ответ, который обычно представляет собой строку в формате JSON, и преобразуем его в структуру данных 1С.
  5. Заполнение объекта 1С: Используем полученные данные для заполнения полей нового элемента справочника «Контрагенты».
  6. Запись объекта: Записываем заполненный элемент справочника в базу данных.

2.1. Интеграция с API ФНС (например, api-fns.ru)

Существуют различные сервисы, которые предоставляют доступ к данным ЕГРЮЛ/ЕГРИП, используя официальные источники ФНС. Одним из таких примеров является api-fns.ru. Этот сервис предлагает API для поиска компаний и ИП по ИНН, получения полных данных из реестров и отслеживания изменений.

Особенности api-fns.ru:

2.2. Интеграция с DaData.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. Безопасность: Убедитесь, что ваш API-токен хранится безопасно и не передается в открытом виде. Желательно использовать защищенное соединение (HTTPS).
  2. Обработка ошибок: Необходимо тщательно обрабатывать различные коды состояния HTTP-ответов (например, 401 Unauthorized, 403 Forbidden, 404 Not Found, 500 Internal Server Error) и ошибки парсинга JSON.
  3. Лимиты запросов: Бесплатные тарифы API обычно имеют строгие лимиты. Важно учитывать это и, при необходимости, реализовать механизм кэширования или задержки между запросами.
  4. Формат данных: Каждое API имеет свой формат возвращаемых данных. Необходимо внимательно изучить документацию выбранного сервиса, чтобы правильно парсить JSON и сопоставлять поля с реквизитами справочника «Контрагенты».
  5. Адреса по ФИАС: Заполнение адреса по стандартам ФИАС может быть сложной задачей. Некоторые API, такие как DaData.ru, могут возвращать стандартизованные адреса, но их интеграция с адресным классификатором 1С может потребовать дополнительных усилий или использования встроенных механизмов 1С по работе с адресами.
  6. Производительность: Частые синхронные запросы к внешним API могут замедлять работу 1С. Для больших объемов данных рекомендуется использовать асинхронные запросы или фоновые задания.

Заключение

Программное создание контрагента в 1С:Бухгалтерии 3.0 по ИНН — это эффективный способ автоматизировать рутинные операции и повысить точность данных. Мы рассмотрели два основных подхода: использование встроенного сервиса «1С-Контрагент» и интеграцию с внешними API.

«1С-Контрагент» является предпочтительным выбором для тех, кто ищет максимально простую и интегрированную опцию, готовую к работе «из коробки», но при этом готов нести затраты на подписку и учитывать лимиты запросов.

Использование внешних API (таких как api-fns.ru или DaData.ru) предоставляет большую гибкость и возможность бесплатного использования в небольших объемах, однако требует значительных усилий по разработке собственного кода для взаимодействия с API, парсинга JSON и маппинга данных на объекты 1С. Этот метод подойдет для тех, кто нуждается в полной кастомизации или стремится минимизировать расходы, имея ресурсы для разработки.

При выборе метода всегда оценивайте ваши текущие потребности, доступные ресурсы и бюджет. Вне зависимости от выбранного пути, автоматизация заполнения данных контрагентов значительно улучшит качество и эффективность работы в 1С:Бухгалтерии 3.0.

← На главную