При переносе документов между идентичными конфигурациями 1С:Бухгалтерия 3.0 с помощью обработки «Универсальный обмен данными в формате XML» часто возникает проблема задвоения элементов справочников. Особенно остро это проявляется на системных справочниках, таких как Справочники.Валюты. В выгруженном файле документы ссылаются на внутренний идентификатор (GUID) из базы-источника. Если в базе-приемнике элемент справочника был создан отдельно, его GUID не совпадет, что приведет к появлению дубля валюты или битой ссылке «Объект не найден».
Рассмотри подробно причины этой проблемы и разберем проверенные способы её решения.
Универсальная выгрузка и загрузка данных XML без правил обмена сопоставляет объекты строго по их внутреннему идентификатору (уникальному GUID). Если базы создавались не путем снятия копии, а создавались отдельно, то элемент «руб.» в источнике и элемент «руб.» в приемнике имеют разные GUID, несмотря на одинаковые коды и наименования.
При загрузке авансового отчета платформа пытается найти валюту с GUID из источника. Если такой объект не найден, она создаст новую валюту-дубль. Если попытаться заменить ссылку или удалить дубль штатно, программа может потребовать распровести документы за прошлые периоды.
Посмотрим на самый быстрый вариант, когда данные уже выгружены и загружены в базу-приемник, создав дублирующий элемент валюты.
Для замены одной валюты на другую во всей базе без необходимости распроводить документы прошлых периодов используют обработку «Поиск и замена значений» (или аналогичные сторонние инструменты с поддержкой режима обмена).
Справочники.Валюты, который изначально существовал в базе-приемнике.Обмен данными (Загрузка = Истина).В режиме обмена данными платформа отключит прикладные проверки проверок заполнения и проведения документов. Обработка напрямую заменит ссылки во всех объектах и движениях регистров без снятия документов с проведения.
Если перенос данных планируется выполнять регулярно, разберем более надежный подход — создание правил обмена в конфигурации «Конвертация данных 2.1».
Валюты.Код (или Символьный код) установим флаг «Поиск».В этом случае при загрузке авансового отчета платформа найдет валюту по ее коду (например, ISO-код 643 для рубля) и подставит уже существующую ссылку из базы-приемника, предотвратив создание дублей.
Проанализируем вариант, когда требуется программно перегрузить документы из базы-источника в базу-приемник через COM-соединение или с использованием СериализаторXDTO.
Рассмотрим пример кода, который считывает документы из выборки, сериализует их в XML и при записи в целевую базу подставляет валюту регламентированного учета по коду:
Пока Выборка.Следующий() Цикл
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, Выборка.Документ.ПолучитьОбъект());
Чтение = СоединениеСБазой.СоздатьОбъект("ЧтениеXML");
Чтение.УстановитьСтроку(Запись.Закрыть());
ДокументИБ2 = СоединениеСБазой.СериализаторXDTO.ПрочитатьXML(Чтение);
ДокументИБ2.Валюта = СоединениеСБазой.Справочники.Валюты.НайтиПоКоду("643");
ДокументИБ2.Записать(СоединениеСБазой.РежимЗаписиДокумента.Проведение);
КонецЦикла;
При таком подходе объект создается непосредственно в целевой базе, а реквизит Валюта явно переопределяется ссылкой на корректный элемент до момента сохранения и проведения документа.
Если объем выгружаемых данных невелик, а перенос разовый, можно обойтись текстовой заменой непосредственно в выгруженном XML-файле:
После этой операции все выгруженные документы при загрузке автоматически свяжутся с имеющейся в базе валютой.