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