При разработке отчетов или механизмов выгрузки данных часто возникает задача автоматического определения организационно-правовой формы (ОПФ) контрагента. Нам необходимо четко разделять, кем является партнер: Индивидуальным предпринимателем (ИП), Обществом с ограниченной ответственностью (ООО) или Акционерным обществом (АО/ЗАО). Стандартные средства конфигураций, таких как "1С:Бухгалтерия", не всегда предоставляют ОПФ в виде отдельного реквизита для контрагентов, поэтому программистам приходится прибегать к различным алгоритмическим решениям.
В этой статье мы подробно разберем несколько методов получения ОПФ: от простых проверок реквизитов до парсинга строк и использования внешних API. Проанализируем плюсы и минусы каждого подхода и выясним, как избежать типичных ошибок при определении формы собственности.
Самый простой и быстрый способ отсечь индивидуальных предпринимателей от юридических лиц — это анализ длины ИНН. Рассмотрим эту логику:
Проанализируем пример кода, который позволяет быстро идентифицировать ИП:
Если СтрДлина(СокрЛП(Контрагент.ИНН)) = 12 Тогда
ОПФ_Результат = "ИП";
ИначеЕсли СтрДлина(СокрЛП(Контрагент.ИНН)) = 10 Тогда
// Здесь логика для ЮрЛиц (ООО, АО и т.д.)
КонецЕсли;
Важное ограничение: Этот метод позволяет только отделить ИП от организаций, но не дает возможности различить ООО и АО между собой, так как у них длина ИНН одинакова.
Для того чтобы различить ООО, ЗАО и АО, мы можем проанализировать текст реквизита НаименованиеПолное. В официальных документах и справочнике контрагентов ОПФ обычно указывается в начале или в конце наименования. Рассмотрим алгоритм, предложенный в обсуждении, и доработаем его для повышения точности.
Разберем пример реализации через поиск вхождения подстроки:
Если СтрДлина(ИНН) = 12 Тогда
Результат = "ИП";
Иначе
Наименование = ВРег(Контрагент.НаименованиеПолное);
Если СтрНайти(Наименование, "ООО") > 0 Или СтрНайти(Наименование, "ОБЩЕСТВО С ОГРАНИЧЕННОЙ") > 0 Тогда
Результат = "ООО";
ИначеЕсли СтрНайти(Наименование, "ЗАО") > 0 Тогда
Результат = "ЗАО";
ИначеЕсли СтрНайти(Наименование, "АО") > 0 Тогда
Результат = "АО";
Иначе
Результат = "Прочее";
КонецЕсли;
КонецЕсли;
Проанализируем ситуацию, упомянутую участниками форума: что если название компании — ООО "Заоблачное"? В этом случае простая проверка СтрНайти(..., "ЗАО") вернет положительный результат, и система ошибочно определит ОПФ как "ЗАО", хотя компания является "ООО".
Чтобы избежать подобных ошибок, рекомендуется использовать следующие приемы:
Лев().Улучшенный вариант кода:
Функция ОпределитьОПФ(Контрагент)
ИНН = СокрЛП(Контрагент.ИНН);
Если СтрДлина(ИНН) = 12 Тогда Возврат "ИП"; КонецЕсли;
ПолноеИмя = ВРег(Контрагент.НаименованиеПолное);
// Ищем точное вхождение в начале строки
Если Лев(ПолноеИмя, 4) = "ООО " Или Лев(ПолноеИмя, 5) = """ООО " Тогда
Возврат "ООО";
ИначеЕсли Лев(ПолноеИмя, 4) = "ЗАО " Или Лев(ПолноеИмя, 5) = """ЗАО " Тогда
Возврат "ЗАО";
ИначеЕсли Лев(ПолноеИмя, 3) = "АО " Или Лев(ПолноеИмя, 4) = """АО " Тогда
Возврат "АО";
КонецЕсли;
// Если в начале не нашли, ищем полное название формы
Если СтрНайти(ПолноеИмя, "ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ") > 0 Тогда
Возврат "ООО";
КонецЕсли;
Возврат "Юр. лицо (не определено)";
КонецФункции
В типовых конфигурациях 1С (БП 3.0, ERP, КА 2) у справочника Контрагенты есть системный реквизит ЮридическоеФизическоеЛицо. Это перечисление, которое имеет значения ЮридическоеЛицо и ФизическоеЛицо.
Выясним причину, почему это важно: если пользователь правильно заполнил карточку, то выбрав ФизическоеЛицо для ИП, мы сразу получаем признак физика. Однако этот реквизит не скажет нам, является ли организация "ООО" или "ПАО". Этот метод хорош только для первичной фильтрации в запросах отчетов.
Если требуется 100% точность для большого массива данных, лучше всего использовать специализированные API. Сервис DaData или встроенный сервис 1С:Контрагент получают данные напрямую из ЕГРЮЛ/ЕГРИП.
Рассмотрим, какие данные возвращают такие сервисы. В ответе API DaData есть отдельная структура data.opf, которая содержит:
code — код ОКОПФ;short — краткая аббревиатура (ООО, ИП, АО);full — полное наименование ОПФ.Это самый надежный способ, так как он не зависит от того, как бухгалтер ввел название в базу "1С". Проанализируем пример интеграции (схематично):
// Пример логики запроса к API
Запрос = Новый HTTPЗапрос(АдресСервиса);
Запрос.Заголовки.Вставить("Authorization", "Token " + КлючAPI);
// ... формирование JSON с ИНН ...
Ответ = Соединение.ОтправитьЗапрос(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Данные = ЧтениеJSON(Ответ.ПолучитьТелоКакСтроку());
ОПФ_Кратко = Данные.suggestions[0].data.opf.short; // Вернет "ООО", "ИП" и т.д.
КонецЕсли;
Еще один технический способ отличить ИП от организации — анализ ОГРН (Основной государственный регистрационный номер):
Этот метод даже надежнее ИНН, так как структура ОГРН жестко регламентирована для разных типов субъектов бизнеса.
Подведем итоги нашего исследования. Для решения задачи в отчете выберите подходящий метод в зависимости от требований к точности:
Лев() и проверку длины ИНН (Метод 1 и 2). Это покроет 95% случаев.Контрагенты дополнительный реквизит "ОПФ" (ссылка на классификатор ОКОПФ) и заполнять его один раз при создании контрагента, чтобы потом просто выводить готовое значение в отчеты.Помните, что с 2014 года формы ЗАО и ОАО официально упразднены и заменены на АО и ПАО, однако в старых базах данных эти аббревиатуры все еще встречаются, и ваш код должен уметь их обрабатывать.