При настройке обмена данными между конфигурациями «Управление торговлей» (УТ) и «Бухгалтерия предприятия» (БП) часто возникает задача консолидации данных. Типичный сценарий: необходимо, чтобы все продажи обычным физическим лицам в бухгалтерии отражались на одном предопределенном контрагенте «Розничный покупатель», в то время как индивидуальные предприниматели (ИП) и юридические лица (ООО, АО) должны переноситься со своими оригинальными именами для корректного ведения взаиморасчетов и налогового учета.
В этой статье мы разберем, как модифицировать логику синхронизации, используя расширения или правила обмена, и какие критерии проверки контрагента являются наиболее надежными. Мы проанализируем ситуацию, когда ИП хранятся в отдельной папке, и выясним, как программно отделить их от обычных граждан.
Если в исходной базе (УТ) структура справочника Контрагенты строго регламентирована, мы можем использовать проверку родительской группы. Разберем пример кода, который можно вставить в обработчик синхронизации или в расширение в БП при загрузке данных. Допустим, нам известно, что ИП находятся в папке с определенным наименованием.
Рассмотрим логику проверки:
// Проверяем, является ли контрагент физическим лицом, не входящим в группу ИП
Если НЕ ЭтотОбъект.Контрагент.ЭтоГруппа Тогда
РодительНаименование = ЭтотОбъект.Контрагент.Родитель.Наименование;
// Если родитель не "ИП" и это не юридическое лицо (ООО)
Если РодительНаименование <> "ИП" И ЭтотОбъект.Контрагент.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда
ЭтотОбъект.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Розничный покупатель");
КонецЕсли;
КонецЕсли;
Важный нюанс: Поиск по наименованию родителя ("ИП") — не самый надежный метод, так как пользователи могут переименовать папку или создать вложенную структуру. Более надежным будет использование ссылки на папку, если она является предопределенной, или поиск по коду группы.
Проанализируем ситуацию с точки зрения законодательства РФ. Индивидуальный предприниматель — это физическое лицо, наделенное правом заниматься предпринимательской деятельностью. Самый точный способ отличить Юрлицо от Физлица/ИП — это длина ИНН:
Посмотрим на пример кода, реализующий проверку через реквизит ИНН:
ДлинаИНН = СтрДлина(СокрЛП(ЭтотОбъект.Контрагент.ИНН));
Если ДлинаИНН = 0 Тогда
// Если ИНН не заполнен, считаем это розницей
ЭтотОбъект.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Розничный покупатель");
ИначеЕсли ДлинаИНН = 12 Тогда
// Здесь сложнее: нужно понять, ИП это или просто ФизЛицо
// Проверяем наличие ОГРНИП или принадлежность к папке ИП
Если Найти(ЭтотОбъект.Контрагент.Наименование, "ИП") = 0 Тогда
ЭтотОбъект.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Розничный покупатель");
КонецЕсли;
КонецЕсли;
Иногда требуется быстрое решение «здесь и сейчас», основанное на том, как менеджеры заносят данные. Если в базе принято всегда писать «ИП» перед ФИО, можно использовать строковые функции. Проанализируем пример условия, которое проверяет вхождение ключевых слов:
Наименование = ВРег(ЭтотОбъект.Контрагент.Наименование);
ЭтоИП = (Лев(Наименование, 3) = "ИП ")
ИЛИ (СтрНайти(Наименование, "ИНДИВИДУАЛЬНЫЙ ПРЕДПРИНИМАТЕЛЬ") > 0);
ЭтоООО = (СтрНайти(Наименование, "ООО") > 0)
ИЛИ (СтрНайти(Наименование, "ОБЩЕСТВО С ОГРАНИЧЕННОЙ") > 0);
Если НЕ (ЭтоИП ИЛИ ЭтоООО) Тогда
ЭтотОбъект.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Розничный покупатель");
КонецЕсли;
Внимание: Данный метод чувствителен к опечаткам. Например, если бухгалтер напишет «И.П. Иванов», фильтр может не сработать. Рекомендуется сочетать этот метод с проверкой системных реквизитов.
В типовых конфигурациях 1С (УТ 11, БП 3.0) у справочника Контрагенты есть стандартный реквизит ЮридическоеФизическоеЛицо. Рассмотрим, как применить его для решения нашей задачи. Выясним, какие значения может принимать этот реквизит:
Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицоПеречисления.ЮридическоеФизическоеЛицо.ФизическоеЛицоПеречисления.ЮридическоеФизическоеЛицо.ИндивидуальныйПредприниматель (в ряде релизов БП).Разберем алгоритм: если тип контрагента — юридическое лицо, мы его не трогаем. Если физическое лицо — проверяем, нет ли у него признака ИП. В 1С:Бухгалтерии признак ИП часто определяется не только перечислением, но и заполнением реквизита ОГРНИП.
Если ЭтотОбъект.Контрагент.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо Тогда
// Это ООО, АО и т.д. Оставляем как есть.
Иначе
// Это физлицо. Проверяем, является ли он ИП.
// Самый надежный признак ИП в БП - наличие заполненного ОГРНИП.
Если ПустаяСтрока(ЭтотОбъект.Контрагент.ОГРНИП) Тогда
ЭтотОбъект.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Розничный покупатель");
КонецЕсли;
КонецЕсли;
Выясним, где именно лучше прописывать эту логику. Существует два основных подхода:
ПередЗаписью или ОбработкаЗаполнения документа и подменяете контрагента. Однако это может привести к тому, что в регистре соответствий объектов создастся связь между реальным физлицом из УТ и «Розничным покупателем» в БП, что в будущем может вызвать путаницу.ПКО_Контрагенты_ПриОтправкеДанных можно прописать условие: если объект не соответствует критериям ИП/ООО, то вместо текущей ссылки отправлять ссылку на «Розничного покупателя». Это правильнее с точки зрения архитектуры 1С, так как в базу-приемник уже придут «чистые» данные.Проанализируем важный технический момент: при синхронизации система запоминает связи между объектами по их уникальным идентификаторам (GUID). Если вы один раз синхронизировали Иванова И.И. как «Розничного покупателя», 1С запишет, что GUID_Иванова_из_УТ соответствует GUID_Розничного_из_БП.
Совет: Если вы меняете логику «на лету» для уже работающего обмена, убедитесь, что вы очистили записи в регистре сведений Соответствия объектов информационных баз для тех контрагентов, которых вы больше не хотите сворачивать в розницу. В противном случае старая связь будет иметь приоритет над вашим новым кодом.
Подводя итог, наиболее стабильным решением будет сочетание проверки реквизита ЮридическоеФизическоеЛицо и длины ИНН (или заполненности ОГРНИП), реализованное на стороне выгрузки данных из УТ.