При переходе на современные конфигурации, такие как 1С:Комплексная автоматизация 2 или 1С:ERP, разработчики часто сталкиваются с разделением привычного справочника Контрагенты на два независимых объекта: Партнеры и Контрагенты. Это вызывает определенные трудности при написании обработок загрузки данных или интеграций.
В этой статье мы подробно разберем, как правильно создавать эти объекты программно, как их связать между собой и какие нюансы настройки системы следует учитывать, чтобы данные корректно отображались в интерфейсе и использовались в документах.
Прежде чем переходить к написанию кода, проанализируем, зачем в системе разделены эти понятия:
Даже если в настройках системы (НСИ и администрирование — Настройка НСИ и разделов — СРМ и маркетинг) отключена опция "Независимо вести партнеров и контрагентов", в структуре базы данных они все равно остаются двумя разными справочниками. В этом случае система просто поддерживает жесткую связь "один к одному", но программно создавать нужно оба объекта.
Рассмотрим ситуацию, когда нам нужно создать нового поставщика. Процесс должен состоять из трех этапов: создание партнера, создание контрагента и их взаимная привязка.
Первым делом мы создаем управленческую сущность. Важно не забыть установить флаги, определяющие роль партнера (клиент, поставщик и т.д.), иначе вы не сможете выбрать его в соответствующих документах.
// Создаем элемент справочника Партнеры
НовыйПартнер = Справочники.Партнеры.СоздатьЭлемент();
НовыйПартнер.Наименование = "ООО МегаТрейд";
НовыйПартнер.НаименованиеПолное = "Общество с ограниченной ответственностью МегаТрейд";
// Указываем тип (Компания или Частное лицо)
НовыйПартнер.ЮрФизЛицо = Перечисления.КомпанияЧастноеЛицо.Компания;
// Устанавливаем признаки деятельности
НовыйПартнер.Поставщик = Истина;
НовыйПартнер.Клиент = Ложь;
// Обязательно указываем статус, чтобы объект был доступен для выбора
НовыйПартнер.Статус = Перечисления.СтатусыПартнеров.ВРаботе;
Попытка
НовыйПартнер.Записать();
Исключение
Сообщить("Ошибка при записи партнера: " + ОписаниеОшибки());
КонецПопытки;
Теперь создадим юридическое лицо. Главное здесь — реквизит Партнер, который и связывает эти два справочника. Обратите внимание, что у контрагента поле Владелец в данных версиях программ обычно не используется для связи с партнером, для этого есть отдельный реквизит.
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = НовыйПартнер.Наименование;
НовыйКонтрагент.НаименованиеПолное = НовыйПартнер.НаименованиеПолное;
// Связываем с ранее созданным партнером
НовыйКонтрагент.Партнер = НовыйПартнер.Ссылка;
// Заполняем реквизиты регламентированного учета
НовыйКонтрагент.ИНН = "7701020304";
НовыйКонтрагент.КПП = "770101001";
НовыйКонтрагент.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
Попытка
НовыйКонтрагент.Записать();
Исключение
Сообщить("Ошибка при записи контрагента: " + ОписаниеОшибки());
КонецПопытки;
Если в системе используется связь "один к одному", хорошим тоном считается записать созданного контрагента в реквизит ОсновнойКонтрагент у партнера. Это позволит системе автоматически подставлять юрлицо в документы, когда пользователь выбирает партнера.
// Обновим партнера, указав ссылку на созданного контрагента
ОбъектПартнер = НовыйПартнер.Ссылка.ПолучитьОбъект();
ОбъектПартнер.ОсновнойКонтрагент = НовыйКонтрагент.Ссылка;
ОбъектПартнер.Записать();
Проанализируем ситуацию глубже. В реальных задачах простого создания полей наименования недостаточно. Разберем дополнительные аспекты, которые сделают ваш код профессиональным.
1. Контактная информация. Адреса и телефоны в КА 2 и ERP хранятся в табличных частях. Напрямую заполнять их не рекомендуется. Лучше использовать функции общего модуля УправлениеКонтактнойИнформацией. Выясним причину: это гарантирует правильное формирование нормализованных адресов, которые требуются для отчетности.
2. Проверка на дубли. Перед созданием объекта обязательно проверьте, не существует ли уже такой контрагент по ИНН. Использование Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ЗначениеИНН) спасет вашу базу от замусоривания.
3. Иерархия. Помните, что в справочнике Контрагенты иерархия (группы) отсутствует — он плоский. Вся структура подчиненности и группировки настраивается исключительно в справочнике Партнеры. Если вам нужно создать "папку", создавайте партнера с типом "Группа".
4. Работа с Соглашениями. Даже после создания связки Партнер-Контрагент, вы можете не увидеть их в подборе в документах "Заказ поставщику" или "Реализация". Посмотрим на пример: для полноценной работы часто требуется программно создать ИндивидуальноеСоглашениеСКлиентом или СоглашениеСПоставщиком, где будут прописаны условия оплаты и цены.
Объединим всё вышесказанное в единую удобную процедуру, которую вы сможете использовать в своих обработках:
&НаСервере
Процедура СоздатьСвязкуПартнерКонтрагент(СтруктураДанных)
// 1. Создаем партнера
ПартнерОбъект = Справочники.Партнеры.СоздатьЭлемент();
ПартнерОбъект.Наименование = СтруктураДанных.Наименование;
ПартнерОбъект.НаименованиеПолное = СтруктураДанных.НаименованиеПолное;
ПартнерОбъект.Поставщик = Истина;
ПартнерОбъект.Статус = Перечисления.СтатусыПартнеров.ВРаботе;
ПартнерОбъект.ЮрФизЛицо = Перечисления.КомпанияЧастноеЛицо.Компания;
ПартнерОбъект.Записать();
// 2. Создаем контрагента
КонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
КонтрагентОбъект.Наименование = СтруктураДанных.Наименование;
КонтрагентОбъект.ИНН = СтруктураДанных.ИНН;
КонтрагентОбъект.Партнер = ПартнерОбъект.Ссылка; // Ключевая связь
КонтрагентОбъект.Записать();
// 3. Замыкаем связь для удобства интерфейса
ПартнерОбъект.ОсновнойКонтрагент = КонтрагентОбъект.Ссылка;
ПартнерОбъект.Записать();
КонецПроцедуры
Таким образом, соблюдая последовательность Партнер -> Контрагент -> Связь через реквизиты, вы обеспечите корректную работу бизнес-логики типового решения. Это позволит избежать ошибок при проведении документов и обеспечит прозрачность учета как для бухгалтера, так и для менеджера по продажам.