Как решить проблему дублирования банковских счетов при конвертации данных в 1С?

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

Перенос данных между конфигурациями 1С с помощью инструмента «1С:Конвертация данных 2.1» — задача, требующая глубокого понимания механизмов идентификации объектов. Одной из самых частых проблем, с которыми сталкиваются разработчики, является появление дублей при выгрузке ссылочных типов, в частности — банковских счетов организаций и контрагентов. В этой статье мы подробно разберем, почему возникают дубли, как правильно настроить правила поиска и какие нюансы архитектуры 1С следует учитывать.

Анализируем причину появления дублей: сущность против номера счета

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

Проанализируем ситуацию подробнее. Главная причина кроется не в ошибке программы, а в логике работы справочников. В большинстве типовых конфигураций 1С справочник БанковскиеСчета является подчиненным. Это означает, что уникальность записи в системе часто определяется связкой «Владелец + Номер счета». Если один и тот же номер счета в базе-источнике принадлежит Организации, а вы пытаетесь сопоставить его с записью, где владельцем является Контрагент, система может создать новый элемент, так как для нее это разные бизнес-сущности.

Принцип единого ПКО

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

  1. Откройте дерево правил конвертации.
  2. Найдите ПКС (Правила конвертации свойств) для организации (свойство ОсновнойБанковскийСчет) и для контрагента.
  3. Убедитесь, что в обоих случаях выбрано одно и то же ПКО БанковскиеСчета.
  4. Если вы нажмете на кнопку открытия ПКО в разных местах, должно открыться одно и то же окно настроек. Если открываются разные окна — значит, вы создали дублирующие правила, которые могут иметь разные настройки поиска.

Настройка полей поиска: GUID против реквизитов

Разберем, как система ищет объект в базе-приемнике. По умолчанию многие включают поиск по GUID (уникальному идентификатору). Рассмотрим пошагово, почему этого может быть недостаточно:

Поиск по GUID: Если объект выгружается впервые, система записывает его GUID. При повторной загрузке (если GUID совпал) объект будет обновлен. Однако, если банковский счет уже был создан в приемнике вручную, его GUID будет отличаться от идентификатора в источнике. В этом случае поиск по GUID не сработает, и система перейдет к поиску по полям, отмеченным галочкой «Поиск».

Поиск по полям: Для банковских счетов критически важно правильно выбрать поля поиска. Обычно это НомерСчета и Банк (или БИК банка). Рассмотрим ситуацию с владельцем: если в настройках ПКО стоит галочка поиска по Владельцу, то при несовпадении владельца (например, вы перепутали и привязали счет организации к контрагенту) система создаст дубль.

Работа с обработчиком «Поля поиска»

Если стандартных настроек недостаточно, мы можем прибегнуть к написанию кода в обработчике «Поля поиска» на стороне приемника. Это позволяет реализовать сложную логику сопоставления. Проанализируем пример кода, который помогает найти счет, игнорируя владельца или специфические символы в номере:


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

Использование ПрекратитьПоиск = Истина позволяет остановить стандартный алгоритм, если наш запрос нашел подходящий объект. Это гарантирует, что система не создаст дубль, даже если GUID-ы различаются.

Важные флаги и настройки ПКО

Посмотрим на дополнительные опции в ПКО, которые помогут управлять процессом создания объектов:

Порядок выгрузки и кэширование

Выясним, влияет ли порядок выгрузки на появление дублей. В «Конвертации данных 2.1» объекты выгружаются по мере их появления в структуре данных. Если сначала выгружается Организация, система встречает ссылку на БанковскийСчет и тут же выгружает его по правилам ПКО. Этот объект помещается в кэш выгрузки.

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

Резюме для настройки правил

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

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

Таким образом, понимание того, как 1С:Конвертация данных обрабатывает ссылки и использует поля поиска, позволяет избежать «замусоривания» базы-приемника и обеспечить корректную синхронизацию данных между любыми конфигурациями.

← На главную