При настройке правил обмена между двумя конфигурациями (в частности, «1С:Управление нашей фирмой») часто возникает ситуация, когда в обеих информационных базах уже существуют предопределенные элементы справочников — например, организация «Наша фирма». При попытке перенести такой справочник через правила конвертации данных (КД 2.1 или универсальный обмен XML) система в базе-приемнике не создает новый элемент, а принудительно находит и перезаписывает существующий предопределенный объект, даже если у них разные внутренние идентификаторы (GUID) и отключен флаг «Продолжить поиск по полям поиска».
Разберем детально, почему типовой механизм загрузки ведет себя подобным образом и какими способами можно обойти такое сопоставление, чтобы перенести объект источника как новую запись.
Проанализируем алгоритм работы типовой обработки выгрузки и загрузки данных XML в формате «Конвертации данных 2.1». Когда выгружается ссылочный объект, алгоритм проверяет, является ли он предопределенным. Если это так, в файл выгрузки XML помещается специальное служебное свойство {ИмяПредопределенногоЭлемента}.
На стороне базы-приемника поиск по имени предопределенного элемента обладает абсолютным приоритетом. Он выполняется еще до проверки совпадения по внутреннему идентификатору (GUID) и до перехода к стандартным полям поиска (код, наименование, ИНН и т. д.). Как только обработка загрузки встречает тег с именем предопределенного элемента, она находит элемент с аналогичным именем в метаданных приемника и сопоставляет данные с ним, игнорируя любые пользовательские настройки полей поиска.
Важно помнить об ограничении платформы 1С:Предприятие 8.3: в одной базе не могут одновременно существовать два элемента справочника с одинаковым непустым реквизитом ИмяПредопределенныхДанных. Следовательно, перенести элемент источника как второй предопределенный невозможно в принципе — в приемнике он может появиться исключительно как обычный (пользовательский) элемент.
Самый правильный и надежный программный способ решения задачи в рамках правил конвертации — подавить передачу признака предопределенности еще на этапе выгрузки из базы-источника. Если в XML не попадет служебный узел с именем предопределенного элемента, база-приемник воспримет запись как обычный элемент и выполнит поиск по GUID или по настроенным полям поиска.
Разберем по шагам, как это реализовать:
Организации).
// Сбрасываем служебную переменную, чтобы признак предопределенности не попал в XML
ИмяПредопределенногоЭлемента = Неопределено;
После выполнения этого кода элемент выгрузится без признака предопределенности. Так как GUID у организаций в двух базах различаются, при отключенном поиске по полям поиска обработка загрузки создаст в базе-приемнике новую обычную организацию с данными из источника, оставив существующую предопределенную организацию нетронутой.
Если требуется принудительно запретить сопоставление на стороне базы-приемника независимо от входящих данных, используем обработчик событий загрузки. Разберем реализацию этого сценария:
// Принудительно отменяем сопоставление
СсылкаНаОбъект = Неопределено;
ПрекратитьПоиск = Истина;
Когда переменной ПрекратитьПоиск присваивается значение Истина, а в СсылкаНаОбъект остается Неопределено, алгоритм загрузки прерывает процедуру поиска и сразу переходит к созданию нового объекта информационной базы.
Если базы полностью идентичны по структуре метаданных и перенос выполняется разово, можно воспользоваться типовой внешней обработкой ВыгрузкаЗагрузкаДанныхXML.epf вместо механизмов конвертации данных. Особенность этой обработки заключается в том, что она сопоставляет данные исключительно по внутренним идентификаторам (GUID) и не ориентируется на свойство ИмяПредопределенныхДанных. При загрузке элемент источника будет создан как новый объект, так как идентификаторы в базах не совпадают.
В некоторых случаях применяют программное снятие признака предопределенности у существующего объекта в базе. Выясним, как это делается:
С помощью внешней обработки или консоли кода у существующей организации очищается имя предопределенного элемента:
ОбъектОрганизация = Справочники.Организации.НашаФирма.ПолучитьОбъект();
ОбъектОрганизация.ИмяПредопределенныхДанных = "";
ОбъектОрганизация.Записать();
Однако к этому методу следует подходить с особой осторожностью. В конфигурациях на платформе «1С:Предприятие 8.3» с включенным автосозданием предопределенных элементов при очередном обновлении конфигурации или выполнении процедур первоначального заполнения БСП платформа обнаружит отсутствие обязательного предопределенного элемента НашаФирма и создаст его заново в пустом виде. Это приведет к появлению нежелательных дублей в базе данных.
Если нет возможности редактировать правила конвертации данных (например, используется закрытый типовой план обмена), задачу можно решить на уровне прикладных данных в источнике:
Организации.