Как перенести авансовые отчеты из одной базы 1С:Бухгалтерия 3.0 в другую без задвоения справочника валют?

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

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

Рассмотри подробно причины этой проблемы и разберем проверенные способы её решения.

Выясним причину возникновения проблемы

Универсальная выгрузка и загрузка данных XML без правил обмена сопоставляет объекты строго по их внутреннему идентификатору (уникальному GUID). Если базы создавались не путем снятия копии, а создавались отдельно, то элемент «руб.» в источнике и элемент «руб.» в приемнике имеют разные GUID, несмотря на одинаковые коды и наименования.

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

Способ 1. Замена дублирующихся ссылок специализированной обработкой

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

Для замены одной валюты на другую во всей базе без необходимости распроводить документы прошлых периодов используют обработку «Поиск и замена значений» (или аналогичные сторонние инструменты с поддержкой режима обмена).

  1. Откроем обработку поиска и замены значений в базе-приемнике.
  2. В поле «Заменяемый элемент» укажем вновь созданный дубль валюты (пришедший из источника).
  3. В поле «Заменить на» укажем правильный элемент справочника Справочники.Валюты, который изначально существовал в базе-приемнике.
  4. Важный момент: в настройках обработки необходимо включить режим Обмен данными (Загрузка = Истина).

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

Способ 2. Настройка сопоставления по коду в «Конвертации данных 2.1»

Если перенос данных планируется выполнять регулярно, разберем более надежный подход — создание правил обмена в конфигурации «Конвертация данных 2.1».

  1. Загрузим метаданные конфигурации «Бухгалтерия предприятия 3.0» в программу «Конвертация данных 2.1».
  2. Создадим правило конвертации объектов (ПКО) для справочника Валюты.
  3. В настройках ПКО снимем флаг «Искать по внутреннему идентификатору».
  4. Для свойства Код (или Символьный код) установим флаг «Поиск».

В этом случае при загрузке авансового отчета платформа найдет валюту по ее коду (например, ISO-код 643 для рубля) и подставит уже существующую ссылку из базы-приемника, предотвратив создание дублей.

Способ 3. Программная загрузка документов с подстановкой правильной валюты

Проанализируем вариант, когда требуется программно перегрузить документы из базы-источника в базу-приемник через COM-соединение или с использованием СериализаторXDTO.

Рассмотрим пример кода, который считывает документы из выборки, сериализует их в XML и при записи в целевую базу подставляет валюту регламентированного учета по коду:


Пока Выборка.Следующий() Цикл
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Выборка.Документ.ПолучитьОбъект());
    
    Чтение = СоединениеСБазой.СоздатьОбъект("ЧтениеXML");
    Чтение.УстановитьСтроку(Запись.Закрыть());
    
    ДокументИБ2 = СоединениеСБазой.СериализаторXDTO.ПрочитатьXML(Чтение);
    ДокументИБ2.Валюта = СоединениеСБазой.Справочники.Валюты.НайтиПоКоду("643");
    ДокументИБ2.Записать(СоединениеСБазой.РежимЗаписиДокумента.Проведение);
КонецЦикла;

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

Способ 4. Корректировка GUID непосредственно в файле выгрузки XML

Если объем выгружаемых данных невелик, а перенос разовый, можно обойтись текстовой заменой непосредственно в выгруженном XML-файле:

  1. Скопируем GUID нужной валюты из базы-приемника (через меню «Получить ссылку» или с помощью консоли запросов/кода).
  2. Узнаем GUID валюты из базы-источника.
  3. Откроем выгруженный файл XML в текстовом редакторе (например, Notepad++).
  4. Выполним автозамену текстовой строки GUID источника на GUID приемника по всему файлу.
  5. Выполним загрузку файла через стандартную обработку.

После этой операции все выгруженные документы при загрузке автоматически свяжутся с имеющейся в базе валютой.

← На главную