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

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

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

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

Главная путаница: две похожие обработки

Для начала устраним распространенное заблуждение, которое часто возникает даже у опытных специалистов. В экосистеме 1С существуют два совершенно разных инструмента со схожими названиями:

  1. «Выгрузка и загрузка данных XML» — это стандартная обработка, предназначенная для обмена данными между идентичными конфигурациями (например, из БП 3.0 в БП 3.0). Она работает «напрямую» с базой данных и сопоставляет объекты исключительно по их внутренним уникальным идентификаторам — GUID (UUID). В ней нет пользовательских настроек для выбора полей поиска (нельзя указать поиск по ИНН, коду или наименованию).
  2. «Универсальный обмен данными в формате XML» — эта обработка работает на основе правил конвертации данных, созданных в специализированной конфигурации «1С:Конвертация данных» (КД 2.0 или 3.0). Здесь разработчик может гибко настроить поля поиска: искать контрагента по ИНН/КПП, номенклатуру по артикулу, а документы — по дате и номеру.

Если вы используете первый инструмент — Выгрузка и загрузка данных XML, то сопоставление будет происходить строго по GUID. Если идентификаторы в базах различаются, платформа создаст новый объект, даже если все его видимые реквизиты (наименование, ИНН, номера документов) полностью совпадают.

Почему происходит задвоение при использовании «Выгрузки и загрузки XML»?

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

1. Разное происхождение (генеалогия) информационных баз

Для того чтобы перенос по GUID проходил корректно, база-источник и база-приемник должны иметь общую историю происхождения. Идеальный сценарий — когда база-приемник когда-то была создана как копия базы-источника (или наоборот).

Если же базы создавались независимо друг от друга (например, были просто развернуты из одного чистого шаблона .cf):

2. Влияние опции «Выгружать при необходимости»

В настройках выгрузки обработки присутствует флаг «Выгружать при необходимости» (выгрузка связанных объектов по ссылкам). Давайте проанализируем, как он влияет на появление дублей:

3. Задвоение предопределенных элементов

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

Как решить проблему задвоения: практические методы

Поскольку в стандартном интерфейсе обработки Выгрузка и загрузка данных XML нет возможности настроить правила сопоставления, на практике применяют следующие обходные пути.

Вариант 1. Использование модифицированных версий обработки

В сообществе разработчиков 1С популярны доработанные внешние версии обработки «Выгрузка и загрузка данных XML». В их код внедрен функционал предварительного сопоставления объектов. Перед началом загрузки вы можете указать правила:

Если объект с такими реквизитами уже существует в базе-приемнике, обработка не создает новый GUID, а привязывает загружаемый документ к уже существующему в системе элементу.

Вариант 2. Использование планов обмена или «1С:Конвертации данных»

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

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

Вариант 3. Пост-обработка базы (поиск и замена дублей)

Если выгрузка уже была произведена и в базе-приемнике появились дубликаты, проблему можно решить инструментами самой платформы 1С:

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

Программное дублирование объектов (для разработчиков)

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

Для этого в обработчиках событий обмена (например, в событии ПослеЗаписиОбъекта или при программном чтении XML) используют метод копирования ссылки. Рассмотрим пример кода:


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

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

Резюме

Для предотвращения задвоения данных всегда анализируйте происхождение баз данных. Если базы создавались независимо, стандартная обработка Выгрузка и загрузка данных XML гарантированно создаст дубли справочников. В таких случаях используйте обмены по правилам (через Универсальный обмен данными) либо проводите очистку базы-приемника стандартной обработкой Поиск и удаление дублей сразу после завершения импорта.

← На главную