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