В процессе подготовки финансовых и аналитических отчетов для банков или внутренних нужд компании часто возникает необходимость вывести детальные сведения о контрагентах. Типичная задача, с которой сталкиваются разработчики и аналитики, — это добавление в отчет двух важных колонок: ОГРН (Основной государственный регистрационный номер) и ОПФ (Организационно-правовая форма, например: ООО, ИП, АО, ЗАО).
На первый взгляд в конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) эти данные неочевидны. Разберем по шагам, где именно хранятся эти сведения в базе данных, как правильно составить запрос для их получения и какими альтернативными способами можно заполнить утерянные или незаполненные реквизиты.
Проанализируем структуру справочника Контрагенты. Многие начинающие разработчики пытаются найти реквизит с именем "ОГРН", но не обнаруживают его. Дело в том, что в типовых конфигурациях на платформе "1С:Предприятие 8" этот параметр имеет другое имя.
Для юридических лиц ОГРН, а для индивидуальных предпринимателей ОГРНИП записывается в стандартный реквизит РегистрационныйНомер. Это универсальное текстовое поле, длина которого достаточна для хранения 13-значного ОГРН или 15-значного ОГРНИП.
Посмотрим на пример простого запроса, который позволяет выгрузить ИНН, КПП и ОГРН из базы данных:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
Контрагенты.Наименование КАК РабочееНаименование,
Контрагенты.ИНН КАК ИНН,
Контрагенты.КПП КАК КПП,
Контрагенты.РегистрационныйНомер КАК ОГРН
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НЕ Контрагенты.ПометкаУдаления
И НЕ Контрагенты.ЭтоГруппа
Этот запрос вернет базовую информацию. Однако часто финансистам требуется не просто ОГРН, а четкое разделение контрагентов по организационно-правовым формам.
В типовой конфигурации БП 3.0 нет отдельного текстового поля, где было бы написано исключительно "ООО" или "ИП". Тем не менее, у нас есть несколько надежных способов вычислить эту информацию непосредственно из данных системы.
Способ 1. Использование реквизита "ЮрФизЛицо"
В справочнике Контрагенты есть реквизит ЮрФизЛицо, который ссылается на системное перечисление. С его помощью мы можем мгновенно отделить индивидуальных предпринимателей от юридических лиц. Перечисление содержит следующие значения:
ЮрЛицо — юридические лица (ООО, АО, ПАО и т.д.).ИндивидуальныйПредприниматель — индивидуальные предприниматели (ИП).ФизЛицо — обычные физические лица.ОбособленноеПодразделение — филиалы компаний.Способ 2. Использование классификатора ОКОПФ
В карточке контрагента на вкладке классификаторов присутствует поле ОКОПФ (Общероссийский классификатор организационно-правовых форм). Если пользователи аккуратно ведут базу данных или используют автоматическое заполнение, этот реквизит будет заполнен. Из него можно вытащить краткое наименование формы собственности (например, "ООО").
Способ 3. Программный разбор наименования контрагента
Если ОКОПФ в информационной базе заполнен не у всех, самым практичным выходом будет строковый анализ наименования. Нам нужно проанализировать реквизиты Наименование (сокращенное) или НаименованиеПолное.
Рассмотрим подробнее пример функции на языке 1С, которая определяет ОПФ на основе комплексного анализа реквизитов контрагента:
Функция ОпределитьОПФКонтрагента(ТекущийКонтрагент) Экспорт
// Если это индивидуальный предприниматель по типу в базе
Если ТекущийКонтрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель Тогда
Возврат "ИП";
КонецЕсли;
// Анализируем полное наименование на наличие ключевых слов
ПолноеИмяВВерхнемРегистре = ВРег(ТекущийКонтрагент.НаименованиеПолное);
РабочееИмяВВерхнемРегистре = ВРег(ТекущийКонтрагент.Наименование);
Если Найти(ПолноеИмяВВерхнемРегистре, "ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ") > 0
Или Найти(РабочееИмяВВерхнемРегистре, "ООО") > 0 Тогда
Возврат "ООО";
ИначеЕсли Найти(ПолноеИмяВВерхнемРегистре, "АКЦИОНЕРНОЕ ОБЩЕСТВО") > 0
Или Найти(РабочееИмяВВерхнемРегистре, "АО") > 0 Тогда
Возврат "АО";
ИначеЕсли Найти(ПолноеИмяВВерхнемРегистре, "ЗАКРЫТОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО") > 0
Или Найти(РабочееИмяВВерхнемРегистре, "ЗАО") > 0 Тогда
Возврат "ЗАО";
ИначеЕсли Найти(ПолноеИмяВВерхнемРегистре, "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО") > 0
Или Найти(РабочееИмяВВерхнемРегистре, "ПАО") > 0 Тогда
Возврат "ПАО";
КонецЕсли;
// Если не удалось определить по строке, пробуем взять из ОКОПФ
Если ЗначениеЗаполнено(ТекущийКонтрагент.ОКОПФ) Тогда
Возврат ТекущийКонтрагент.ОКОПФ.Наименование;
КонецЕсли;
Возврат "Прочие";
КонецФункции
Выясним причину, почему данные ОГРН или ОКОПФ могут отсутствовать в базе. Чаще всего это происходит из-за ручного ввода контрагентов бухгалтерами. Чтобы избежать этой проблемы в будущем и автоматически заполнить исторические данные, рекомендуется использовать встроенный сервис 1С:Контрагент.
При активном сервисе программа автоматически отправляет запрос на серверы поддержки 1С при вводе ИНН контрагента. Сервис возвращает полный пакет данных ЕГРЮЛ/ЕГРИП, включая ОГРН и ОКОПФ, и записывает их в соответствующие поля карточки. Разработчик может программно запустить это заполнение для списка контрагентов, используя процедуры общего модуля КонтрагентыСлужебный.
Проанализируем ситуацию, когда у компании нет активной подписки на сервисы 1С, но необходимо автоматизировать заполнение ОГРН и ОПФ по ИНН. В этом случае на помощь приходят внешние REST-сервисы, например, популярный инструмент DaData или официальные API ФНС.
Для интеграции мы можем отправлять HTTP-запросы прямо из кода 1С. Сервис принимает ИНН и возвращает структурированный ответ в формате JSON, где содержатся точные и актуальные данные прямо из налогового реестра.
Разберем по шагам, как реализовать такую интеграцию в коде 1С:
Функция ПолучитьСведенияИзВнешнегоAPI(ИННКонтрагента)
// Настраиваем защищенное SSL-соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
HTTPСоединение = Новый HTTPСоединение("suggestions.dadata.ru", 443,,,,, ЗащищенноеСоединение);
// Формируем заголовки запроса (необходимо получить бесплатный API-ключ на сайте dadata)
ПараметрыЗапроса = Новый Соответствие;
ПараметрыЗапроса.Вставить("Content-Type", "application/json");
ПараметрыЗапроса.Вставить("Accept", "application/json");
ПараметрыЗапроса.Вставить("Authorization", "Token " + "ВАШ_API_КЛЮЧ_ЗДЕСЬ");
HTTPЗапрос = Новый HTTPЗапрос("/suggestions/api/4_1/rs/findById/party", ПараметрыЗапроса);
// Готовим тело запроса с ИНН в формате JSON
ПараметрыТела = Новый Структура;
ПараметрыТела.Вставить("query", ИННКонтрагента);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыТела);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8, ИспользованиеМаркераВремени.НеИспользовать);
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
// Читаем полученный JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Если ДанныеОтвета.suggestions.Количество() > 0 Тогда
Организация = ДанныеОтвета.suggestions[0].data;
Результат = Новый Структура;
Результат.Вставить("ОГРН", Организация.ogrn);
Результат.Вставить("ОПФ_Краткая", Организация.opf.short);
Результат.Вставить("ПолноеНаименование", Организация.name.full_with_opf);
Возврат Результат;
КонецЕсли;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Интеграция.Контрагенты", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
Возврат Неопределено;
КонецФункции
С помощью этой функции вы сможете обогатить ваш отчет актуальными данными "на лету" прямо во время его формирования, даже если эти реквизиты изначально не были заполнены в вашей базе 1С.
Мы выяснили, что для решения задачи вывода ОГРН и ОПФ в отчет финансиста не требуется вручную перебирать карточки контрагентов. ОГРН уже хранится в поле РегистрационныйНомер. ОПФ можно вычислить комбинацией реквизита ЮрФизЛицо и разбором строки наименования либо использовать встроенные и внешние API-сервисы, которые сделают ваш отчет точным, актуальным и профессиональным.