Как избежать дублирования предопределенных элементов при переносе данных через ВыгрузкаЗагрузкаXML?

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

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

Рассмотрим подробнее, почему стандартная обработка ВыгрузкаЗагрузкаXML ведет себя именно так, и разберем по шагам, как решить эту проблему различными способами.

Выясняем причину: почему происходит дублирование?

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

Важный нюанс: даже если в конфигураторе две базы абсолютно одинаковы, предопределенные данные в пользовательском режиме могут иметь разные GUID. Это происходит, если базы создавались независимо или если предопределенные элементы были созданы платформой в разное время. Когда вы загружаете данные, система видит, что GUID из файла не совпадает ни с одним GUID в базе. Несмотря на то, что поле ИмяПредопределенныхДанных совпадает, платформа создает новый объект. В итоге мы получаем два элемента, каждый из которых считает себя предопределенным.

Метод 1. Использование стандартной обработки «Поиск и удаление дублей»

Если перенос уже выполнен и вы обнаружили дубли, не спешите паниковать или пытаться удалять их вручную. В типовых конфигурациях, таких как УНФ, встроен мощный механизм очистки данных. Разберем алгоритм действий:

  1. Откроем раздел Администрирование — Обслуживание — Корректировка данных.
  2. Выберем пункт Поиск и удаление дублей.
  3. В поле "Искать в:" укажем проблемный справочник, например, Статьи движения денежных средств.
  4. Настроим критерии сравнения (обычно достаточно поиска по "Наименованию").
  5. После выполнения поиска система выведет список групп дублей. Здесь критически важно правильно выбрать Оригинал.
  6. Оригиналом следует назначить тот элемент, который уже использовался в документах текущей базы до переноса.
  7. Нажмем кнопку "Удалить дубли". Платформа автоматически найдет все ссылки на "плохой" дубль в документах, регистрах и справочниках, заменит их на ссылку на "хороший" оригинал и пометит дубль на удаление.

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

Метод 2. Программное выравнивание GUID перед загрузкой

Посмотрим на ситуацию со стороны разработчика. Если мы хотим, чтобы ВыгрузкаЗагрузкаXML работала корректно, нам нужно сделать так, чтобы GUID предопределенных элементов в обеих базах совпадали. Это можно сделать с помощью небольшой доработки или внешней обработки.

Для реализации этого метода нам потребуется метод УстановитьСсылкуНового(). Однако, для уже существующих элементов изменить GUID напрямую невозможно. Схема действий будет следующей: выявить GUID в базе-источнике и принудительно установить такой же GUID для соответствующего элемента в базе-приемнике (если база-приемник еще пустая или элемент еще не создан).

Если же элементы уже созданы, мы можем использовать свойство ИмяПредопределенныхДанных для программного связывания. Проанализируем пример кода, который помогает сопоставить элементы:


// Пример получения ссылки по имени предопределенного значения
ИмяМетаданных = "СтатьиДвиженияДенежныхСредств";
ИмяЭлемента = "ОплатаПоставщику";
СсылкаНаЭлемент = Справочники[ИмяМетаданных][ИмяЭлемента];

Если Не СсылкаНаЭлемент.Пустая() Тогда
    Сообщить("GUID элемента: " + СсылкаНаЭлемент.УникальныйИдентификатор());
КонецЕсли;

Чтобы данные не дублировались, перед переносом можно воспользоваться обработкой "Установка ссылок предопределенным данным", которая позволяет перепривязать существующие в базе объекты к именам предопределенных данных из метаданных.

Метод 3. Переход на «Конвертацию данных» (рекомендуемый способ)

Рассмотрим самый надежный способ решения проблемы. Обработка ВыгрузкаЗагрузкаXML предназначена для простого копирования "один в один". Если вам нужна интеллектуальная синхронизация, следует использовать правила обмена, созданные в конфигурации «Конвертация данных 2.1» или 3.0.

В чем преимущество этого подхода? В правилах обмена (ПВД) для каждого справочника мы можем гибко настроить поля поиска. Разберем настройки:

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

В этом случае система сначала попробует найти объект по GUID. Если не найдет (как в нашем случае), она начнет искать по названию. Найдя существующую статью ДДС по имени, она просто обновит её реквизиты данными из файла загрузки, а не создаст новый элемент. Это полностью исключает появление дублей предопределенных данных.

Осторожно: Тестирование и исправление (ТиИ)

Проанализируем важный момент, упомянутый в обсуждении. Если вы уже допустили появление дублей и запустили Тестирование и исправление с включенной проверкой ссылочной целостности, ситуация может ухудшиться. Платформа видит два объекта, претендующих на одну и ту же роль предопределенного элемента. В процессе исправления она может "отвязать" один из них, сняв флаг Предопределенный.

Помните: Никогда не запускайте ТиИ до того, как вы объединили дубли обработкой "Поиск и удаление дублей". Сначала нужно схлопнуть ссылки на один объект, и только потом чистить базу средствами тестирования.

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

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

Следуя этим инструкциям, мы обеспечим чистоту данных и корректную работу аналитических отчетов в конфигурации 1С:Управление нашей фирмой.

← На главную