Как при переносе данных между базами 1С создать новый элемент вместо сопоставления с предопределенным?

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

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

Разберем детально, почему типовой механизм загрузки ведет себя подобным образом и какими способами можно обойти такое сопоставление, чтобы перенести объект источника как новую запись.

Почему происходит автоматическое сопоставление предопределенных элементов

Проанализируем алгоритм работы типовой обработки выгрузки и загрузки данных XML в формате «Конвертации данных 2.1». Когда выгружается ссылочный объект, алгоритм проверяет, является ли он предопределенным. Если это так, в файл выгрузки XML помещается специальное служебное свойство {ИмяПредопределенногоЭлемента}.

На стороне базы-приемника поиск по имени предопределенного элемента обладает абсолютным приоритетом. Он выполняется еще до проверки совпадения по внутреннему идентификатору (GUID) и до перехода к стандартным полям поиска (код, наименование, ИНН и т. д.). Как только обработка загрузки встречает тег с именем предопределенного элемента, она находит элемент с аналогичным именем в метаданных приемника и сопоставляет данные с ним, игнорируя любые пользовательские настройки полей поиска.

Важно помнить об ограничении платформы 1С:Предприятие 8.3: в одной базе не могут одновременно существовать два элемента справочника с одинаковым непустым реквизитом ИмяПредопределенныхДанных. Следовательно, перенести элемент источника как второй предопределенный невозможно в принципе — в приемнике он может появиться исключительно как обычный (пользовательский) элемент.

Способ 1. Очистка признака предопределенности в правилах обмена (КД 2.1)

Самый правильный и надежный программный способ решения задачи в рамках правил конвертации — подавить передачу признака предопределенности еще на этапе выгрузки из базы-источника. Если в XML не попадет служебный узел с именем предопределенного элемента, база-приемник воспримет запись как обычный элемент и выполнит поиск по GUID или по настроенным полям поиска.

Разберем по шагам, как это реализовать:

  1. Откроем конфигурацию «Конвертация данных, ред. 2.1» и перейдем в правило конвертации объектов (ПКО) нужного справочника (например, справочника Организации).
  2. Откроем вкладку «Обработчики событий» и перейдем к событию «Перед выгрузкой» (или «При выгрузке»).
  3. Вставим следующий фрагмент программного кода:
    
    // Сбрасываем служебную переменную, чтобы признак предопределенности не попал в XML
    ИмяПредопределенногоЭлемента = Неопределено;
    
  4. Сохраним правило и выгрузим обновленный файл правил обмена.

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

Способ 2. Управление поиском в обработчике «Поля поиска»

Если требуется принудительно запретить сопоставление на стороне базы-приемника независимо от входящих данных, используем обработчик событий загрузки. Разберем реализацию этого сценария:

  1. В ПКО справочника в «Конвертации данных» перейдем в обработчик «Поля поиска» (выполняется на стороне приемника).
  2. Напишем код, который завершает поиск с пустым результатом, если обрабатывается переносимый элемент:
    
    // Принудительно отменяем сопоставление
    СсылкаНаОбъект = Неопределено;
    ПрекратитьПоиск = Истина;
    

Когда переменной ПрекратитьПоиск присваивается значение Истина, а в СсылкаНаОбъект остается Неопределено, алгоритм загрузки прерывает процедуру поиска и сразу переходит к созданию нового объекта информационной базы.

Способ 3. Использование универсальной выгрузки/загрузки XML

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

Способ 4. «Отвязка» предопределенного элемента на уровне базы данных

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

С помощью внешней обработки или консоли кода у существующей организации очищается имя предопределенного элемента:


ОбъектОрганизация = Справочники.Организации.НашаФирма.ПолучитьОбъект();
ОбъектОрганизация.ИмяПредопределенныхДанных = "";
ОбъектОрганизация.Записать();

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

Способ 5. Замена ссылок в базе-источнике перед выгрузкой

Если нет возможности редактировать правила конвертации данных (например, используется закрытый типовой план обмена), задачу можно решить на уровне прикладных данных в источнике:

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