Как перенести предопределенные данные между базами 1С 8.3 без дублирования и битых ссылок?

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

При переносе нормативно-справочной информации, настроек или документов в новую (или соседнюю) информационную базу специалисты часто сталкиваются с проблемой задвоения предопределенных элементов или появления битых ссылок вида <Объект не найден>. Если в версии платформы «1С:Предприятие 8.2» эта задача решалась простым использованием универсальной обработки ВыгрузкаЗагрузкаДанныхXML, то в «1С:Предприятие 8.3» этот процесс превратился в головную боль для многих разработчиков.

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

Выясняем причину: почему в 1С 8.3 возникла эта проблема?

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

В платформе 1С:Предприятие 8.2 предопределенные элементы жестко описывались в метаданных конфигурации. Их уникальные идентификаторы (UUID или GUID) определялись на уровне конфигуратора и всегда оставались абсолютно одинаковыми во всех информационных базах, созданных на основе этого шаблона или файла конфигурации. Это позволяло без труда переносить данные XML-выгрузкой: ссылка в файле сопоставлялась по UUID, и система безошибочно находила нужный элемент в базе-приемнике.

Начиная с версии 1С:Предприятие 8.3, концепция работы с предопределенными данными кардинально изменилась. Теперь предопределенные элементы стали полноценными записями в таблицах базы данных (СУБД). Если базы не связаны через механизм распределенных информационных баз (РИБ), а созданы независимо (например, путем загрузки конфигурации .cf в новую пустую базу), платформа при первом запуске автоматически генерирует предопределенные элементы в режиме «1С:Предприятие». При этом для одних и тех же элементов создаются абсолютно разные, случайные UUID в базе-источнике и базе-приемнике.

Если мы попытаемся перенести документы или справочники стандартной XML-выгрузкой старого образца, система будет ориентироваться исключительно на UUID. Это неминуемо приведет к двум неприятным сценариям:

  1. Задвоение предопределенных элементов: в базе-приемнике создается копия элемента с UUID из источника. В результате пользователь видит два одинаковых элемента (например, две ставки НДС «20%» или два предопределенных склада), один из которых связан с метаданными, а второй является его дублем.
  2. Появление битых ссылок: если мы умышленно снимем галочки с предопределенных элементов при выгрузке, чтобы не плодить дубли, то перенесенные документы запишутся со ссылками на UUID источника. Поскольку этих UUID нет в приемнике, в полях документов появится надпись <Объект не найден>....

Рассмотрим, какими инструментами и методами мы можем решить эту проблему.

Решение 1. Использование актуальной версии «ВыгрузкаЗагрузкаДанныхXML»

Самый простой и быстрый способ, не требующий написания правил конвертации данных (КД) для разовых задач, — это использование правильной версии стандартной обработки ВыгрузкаЗагрузкаДанныхXML.epf.

В актуальных версиях этой обработки (которые поставляются в каталогах шаблонов конфигурации «1С:Конвертация данных», начиная с версии 2.1.8.2 и новее) алгоритм работы с предопределенными данными был существенно доработан:

Рекомендация по шагам:

  1. Найдите на диске ИТС или в каталоге установки Конвертации Данных (версии 2.1.8.2 или выше) свежий файл обработки ВыгрузкаЗагрузкаДанныхXML.epf.
  2. Запустите обработку в базе-источнике, выберите нужные объекты (справочники, документы) и выполните выгрузку в файл.
  3. Запустите эту же обработку в базе-приемнике и загрузите полученный файл. Благодаря сопоставлению по именам предопределенных данных, все ссылки будут корректно перенаправлены на локальные элементы приемника, и дублирования не произойдет.

Решение 2. Настройка свойства «Обновление предопределенных данных» в конфигурации

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

У каждого объекта метаданных, поддерживающего предопределенные элементы (справочники, планы видов характеристик, планы счетов, планы видов расчета), есть это свойство. Оно может принимать три значения:

Порядок действий для чистого переноса:

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

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

Иногда требуется решить задачу точечно или написать собственный скрипт переноса (например, через COM-соединение или HTTP-сервисы). В платформе 1С 8.3 у объектов баз данных появилось стандартное свойство ИмяПредопределенныхДанных. С его помощью разработчик может изменять связь между объектом в базе данных и метаданными конфигурации прямо из программного кода.

Рассмотрим два сценария использования этого свойства.

Сценарий А: Программная привязка обычного элемента к предопределенному

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


// Получаем объект по ссылке
ОбъектДанных = СсылкаНаЭлемент.ПолучитьОбъект();

// Указываем системное имя предопределенного элемента из конфигуратора
ОбъектДанных.ИмяПредопределенныхДанных = "ОсновнойСклад";

// Записываем объект для фиксации изменений в базе данных
ОбъектДанных.Записать();

После выполнения этого кода элемент с указанной ссылкой получит статус предопределенного, и платформа будет сопоставлять его с метаданными конфигуратора по имени ОсновнойСклад.

Сценарий Б: Как «отвязать» предопределенный элемент

В случае, если в процессе переноса создался дубль, платформа не позволит нам просто так удалить лишний предопределенный элемент, заблокировав операцию интерактивного удаления. Чтобы обойти это ограничение, мы должны сначала превратить предопределенный элемент в обычную запись базы данных. Для этого достаточно очистить свойство ИмяПредопределенныхДанных:


// Получаем объект ошибочно созданного предопределенного элемента
ОбъектДубль = СсылкаНаДубль.ПолучитьОбъект();

// Очищаем связь с предопределенными данными конфигурации
ОбъектДубль.ИмяПредопределенныхДанных = "";

// Сохраняем изменения
ОбъектДубль.Записать();

Теперь элемент ОбъектДубль стал рядовым элементом справочника. Мы можем пометить его на удаление и безболезненно удалить стандартными средствами платформы.

Решение 4. Что делать, если дубли предопределенных элементов уже создались?

Проанализируем ситуацию, когда перенос уже выполнен некорректно, и в информационной базе-приемнике появились дублирующиеся предопределенные элементы. Стандартная обработка «Поиск и удаление дублей» в данном случае окажется бессильной, так как платформа заблокирует удаление предопределенного объекта.

В этом случае нам поможет следующий пошаговый алгоритм действий:

  1. Определим, какой из двух элементов является «правильным» (то есть связанным с конфигуратором), а какой — «дублем» (просто скопированным элементом с чужим UUID). Обычно правильным является тот, который был автоматически создан базой-приемником при ее развертывании.
  2. С помощью внешней обработки (например, «Установка предопределенных элементов» или написав короткий скрипт во внешней обработке группового изменения реквизитов) у элемента-дубля очищаем свойство ИмяПредопределенныхДанных, как было показано в Сценарии Б.
  3. После очистки этого свойства элемент-дубль превращается в обычный элемент справочника.
  4. Запускаем стандартную системную обработку «Поиск и замена дублей».
  5. В качестве «Оригинала» выбираем правильный предопределенный элемент базы-приемника.
  6. В качестве «Дубля» указываем наш бывший предопределенный (а теперь обычный) элемент.
  7. Запускаем процесс слияния. Обработка автоматически найдет все ссылки в документах, регистрах сведений и регистрах накопления, перенаправит их на правильный элемент и корректно удалит ставший ненужным дубликат.

Используя предложенные методики и поддерживая инструменты администрирования в актуальном состоянии, мы сможем навсегда забыть о сложностях переноса предопределенных данных в среде «1С:Предприятие 8.3».

← На главную