Как настроить поиск объектов в Конвертации Данных 2.0 и избежать появления дублей при переносе?

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

При переносе документов и справочников из одной конфигурации в другую часто возникает ситуация: в базе-приемнике уже существуют нужные объекты (например, документы реализации или элементы справочников), созданные вручную. Однако при переносе связанных документов (например, платежных поручений) обработка выгрузки не сопоставляет существующие объекты, а заводит дубликаты.

Рассмотрим, почему возникает эта проблема при автоматической генерации правил и как правильно настроить поиск объектов в конфигурации «Конвертация Данных 2.0».

Причина появления дубликатов при автоматическом создании правил

Выясним причину такого поведения системы. Когда правила обмена создаются автоматически для двух одинаковых конфигураций, конфигурация «Конвертация Данных» по умолчанию устанавливает у всех элементов поиск по внутреннему идентификатору (УИД / GUID).

Если элемент справочника или документ был создан непосредственно вручную в базе-приемнике, у него формируется собственный уникальный идентификатор, отличающийся от аналогичного объекта в базе-источнике. В результате стандартный поиск по УИД возвращает ложь, и обработка загрузки создает новый документ-двойник.

Настройка сопоставления объектов по ключевым реквизитам

Разберем по шагам, как настроить правила конвертации объектов (ПКО), чтобы система находила существующие элементы по их реквизитам (например, по комбинации даты, номера и организации):

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

Важно: При автоматическом создании правил настройки поиска устанавливаются отдельно для каждого ПКО. Если платежное поручение ссылается на документ реализации, настройки сопоставления нужно задавать именно в ПКО для документа реализации, а не только в самом платежном поручении.

Особенности поиска по дате и номеру

Проанализируем возможные нюансы, которые могут помешать успешному поиску даже при включенных галочках поиска:

  1. Точное совпадение времени: Поиск по реквизиту Дата сравнивает значение с точностью до секунды. Если документ в источнике создан в 10:00:00, а в приемнике вручную — в 14:30:00, поиск по дате не сработает. Чтобы обойти это, при выгрузке даты можно приводить ее к началу дня с помощью функции НачалоДня().
  2. Формат номера и префиксы: Номера документов могут отличаться наличием префиксов организации или лидирующих нулей. Для нормализации номера используется обработчик Поля поиска.

Программный доиск и переопределение полей поиска

Если стандартного поиска по реквизитам недостаточно или требуется сложная логика сопоставления, воспользуемся обработчиком событий «Поля поиска» в ПКО.

Код в этом обработчике выполняется уже на стороне базы-приемника. Поэтому обращаться к метаданным и менеджеру объектов следует напрямую, без каких-либо дополнительных префиксов вроде Приемник.:


// Пример программного доиска документа в обработчике "Поля поиска"
Если СвойстваПоиска["Номер"] <> Неопределено Тогда
    // Удаляем префиксы или модифицируем номер при необходимости
    ОчищенныйНомер = СокрЛП(СвойстваПоиска["Номер"]);
    
    // Выполняем поиск по базе-приемнику
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	ТекДок.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.РеализацияТоваровУслуг КАК ТекДок
        |ГДЕ
        |	ТекДок.Номер ПОДОБНО %Номер";
        
    Запрос.УстановитьПараметр("Номер", "%" + ОчищенныйНомер);
    Результат = Запрос.Выполнить();
    
    Если НЕ Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        // Заполняем результирующую ссылку
        СсылкаНаОбъект = Выборка.Ссылка;
    КонецЕсли;
КонецЕсли;

Если переменная СсылкаНаОбъект заполнена в обработчике, КД 2.0 прекращает стандартный поиск и сразу подставляет найденный объект в загружаемый документ, что предотвратит создание дубликата.

← На главную