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