Как в Конвертации данных 2.1 автоматически перемещать контрагентов в нужную папку и избежать дублей?

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

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

Способ 1. Создание отдельного ПКО для целевой группы

Самый простой и наглядный способ — создать специализированное правило конвертации объектов (ПКО). Проанализируем этот алгоритм по шагам:

  1. В конфигурации «Конвертация данных» найдем существующее правило для справочника Контрагенты.
  2. Скопируем его и назовем, например, Контрагенты_Покупатели.
  3. В новом правиле перейдем на вкладку «Обработчики событий» и выберем «После загрузки».
  4. Пропишем программную установку родителя. Рассмотрим пример кода, где поиск папки идет по ее уникальному идентификатору (УИД):

// Установка родителя по УИД (если он известен и статичен)
УИДГруппы = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"); // Замените на реальный УИД
Объект.Родитель = Справочники.Контрагенты.ПолучитьСсылку(УИДГруппы);

После создания правила необходимо зайти в ПКО документа ЗаказКлиента, найти в таблице свойств реквизит Контрагент и в колонке «Правило конвертации» принудительно выбрать наше новое правило Контрагенты_Покупатели. Теперь при загрузке заказов система будет использовать именно эту логику для создания контрагентов.

Способ 2. Динамический выбор правила (ИмяПКО)

Рассмотрим ситуацию, когда мы не хотим вручную менять настройки в каждом документе. Мы можем автоматизировать выбор правила конвертации. Для этого в ПКС (правиле конвертации свойства) Контрагент в документе-источнике пропишем обработчик «Перед выгрузкой»:


// Динамически назначаем правило в зависимости от контекста
ИмяПКО = "Контрагенты_Покупатели";

Этот метод удобен тем, что позволяет гибко управлять логикой: например, если сумма заказа больше определенного порога или заполнены специфические реквизиты, мы можем отправлять контрагента в разные группы, просто меняя ИмяПКО.

Способ 3. Безопасное создание папки при ее отсутствии

Жесткое прописывание УИД в коде (как в первом способе) несет риски: если папку «Покупатели» удалят и создадут заново, ее идентификатор изменится, и код перестанет работать. Выясним, как сделать решение более отказоустойчивым. Разберем пример кода для обработчика «После загрузки»:


// Ищем папку по наименованию
ЦелеваяПапка = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели", Истина);

// Если папка не найдена - создаем ее программно
Если ЦелеваяПапка.Пустая() Тогда
    НоваяГруппа = Справочники.Контрагенты.СоздатьГруппу();
    НоваяГруппа.Наименование = "Покупатели";
    НоваяГруппа.Записать();
    ЦелеваяПапка = НоваяГруппа.Ссылка;
КонецЕсли;

// Устанавливаем родителя только для новых объектов, чтобы не перемещать существующих
Если Объект.ЭтоНовый() Тогда
    Объект.Родитель = ЦелеваяПапка;
КонецЕсли;

Использование проверки Объект.ЭтоНовый() критически важно. Если контрагент уже существует в базе и закреплен за папкой «VIP-клиенты», мы, скорее всего, не захотим, чтобы при каждом новом заказе он принудительно перепрыгивал в общую папку «Покупатели».

Решение проблемы дублирования контрагентов

Часто программисты сталкиваются с тем, что даже при настроенных правилах поиска контрагенты в базе-приемнике задваиваются. Проанализируем причины и способы решения этой проблемы.

1. Поиск по внутреннему идентификатору (GUID). По умолчанию 1С пытается найти объект по его УИД. Если обмен идет между базами, которые не являются прямыми потомками друг друга, УИДы будут разными. В настройках ПКО на закладке «Настройки поиска» проверьте флаг «Искать объект приемника по внутреннему идентификатору источника». Если вы не уверены в совпадении GUID, этот флаг лучше дополнить опцией «Продолжить поиск по полям поиска, если по идентификатору не нашли».

2. Настройка полей поиска. Для контрагентов стандартного поиска по Наименованию недостаточно (возможны ошибки в регистрах или лишние пробелы). Рассмотрим наиболее надежную комбинацию:

В ПКО справочника Контрагенты установите галочки в колонке «Поиск» напротив соответствующих реквизитов.

3. Использование обработчика «При поиске». Если стандартных галочек не хватает, мы можем написать произвольный алгоритм поиска. Посмотрим на пример:


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

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

В этом коде мы явно указываем, что искать нужно только среди объектов, не помеченных на удаление, что существенно повышает чистоту данных в приемнике.

Продвинутая настройка через параметры конвертации

Чтобы не «хардкодить» названия папок внутри правил, воспользуемся вкладкой «Параметры» в основной форме настроек конвертации. Создадим параметр ОсновнаяГруппаПокупателей. Это позволит нам передавать имя группы прямо в момент запуска обмена или настраивать его в узле обмена.

В коде ПКО обращение будет выглядеть так: Объект.Родитель = Параметры.ОсновнаяГруппаПокупателей;. Такой подход делает ваши правила универсальными и облегчает их поддержку при изменении структуры справочников в будущем.

Особенности для современных конфигураций (УТ 11, ERP, КА 2)

Если ваша база-приемник построена на современных типовых решениях, важно помнить о разделении сущностей Партнеры и Контрагенты. Справочник Контрагенты в этих системах часто является «плоским» (без иерархии), а за структуру и папки отвечает справочник Партнеры. При выгрузке данных убедитесь, что вы устанавливаете родителя именно для того объекта, который поддерживает иерархию в целевой конфигурации, иначе установка свойства Родитель будет проигнорирована системой.

← На главную