Как перенести одну папку номенклатуры между базами 1С с помощью обработки «Выгрузка и загрузка данных XML»?

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

При администрировании и сопровождении баз данных на платформе «1С:Предприятие 8.3» (например, при работе с конфигурацией «Комплексная автоматизация 1.1» на обычных формах) регулярно возникает необходимость частичного переноса нормативно-справочной информации (НСИ). Часто требуется перенести не весь справочник Номенклатура, а лишь его отдельный сегмент — конкретную папку (группу) со всем содержимым.

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

Почему перенесенные элементы исчезают? Разбор архитектуры 1С

Проанализируем ситуацию, в которой оказался автор темы. В базе-источнике (Б) существовала иерархическая структура справочника, где в папке «01» находилась подпапка «001», внутри которой содержались папки «0001» и «0002». Задача заключалась в переносе в базу-приемник (А) только папки «0002» с ее содержимым.

Пользователь попытался решить задачу «в лоб»: установил отбор для справочника Номенклатура по правилу Родитель Равно "0002". На первый взгляд это логично, но с точки зрения архитектуры базы данных 1С здесь кроются две серьезные проблемы:

  1. Исключение самой папки-родителя из выгрузки. Когда мы задаем условие Родитель Равно "0002", система делает запрос к таблице справочника и выбирает только те записи, у которых в поле Родитель (хранящем уникальный идентификатор GUID) указана ссылка на папку «0002». Сама папка «0002» при этом условию не удовлетворяет, так как ее родителем является папка «001». В результате в XML-файл попадают только конечные товары, а сама папка-родитель игнорируется.
  2. Образование элементов-«сирот» в базе-приемнике. При загрузке полученного XML-файла в базу (А) система считывает записи товаров и пытается записать их в базу данных. В полях Родитель у этих товаров прописан уникальный идентификатор (GUID) папки «0002». Платформа успешно создает записи в таблице справочника, но физического объекта с GUID папки «0002» в базе-приемнике не существует. В иерархическом динамическом списке справочника такие элементы становятся невидимыми («сиротами»), поскольку система не может построить для них корректное дерево иерархии.

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


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    Номенклатура.Код КАК Код,
    Номенклатура.Наименование КАК Наименование,
    Номенклатура.Родитель КАК Родитель
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель.Наименование ЕСТЬ NULL
    И НЕ Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
    И НЕ Номенклатура.ЭтоГруппа

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

---

Решение проблемы через дополнительные объекты выгрузки

Самый простой способ исправить ситуацию при использовании отбора по конкретному родителю — принудительно включить саму папку-родитель в XML-файл. Рассмотрим, как это сделать по шагам:

  1. Откроем обработку «Выгрузка и загрузка данных XML» в базе-источнике (Б).
  2. В дереве метаданных найдем справочник Номенклатура, отметим его флажком и откроем настройки отбора.
  3. Добавим отбор по полю Родитель со значением Равно "0002" (выбираем конкретную папку из справочника).
  4. Перейдем на вкладку или в раздел «Дополнительные объекты для выгрузки» (в зависимости от версии обработки интерфейс может незначительно отличаться).
  5. Добавим туда непосредственно саму папку «0002» как отдельный объект выгрузки.
  6. Выгрузим данные в XML-файл и загрузим их в базу-приемник (А).

При таком подходе в XML-файл сначала запишется тело самой папки «0002» (ее наименование, код, уникальный идентификатор GUID), а затем — подчиненные ей элементы. При загрузке в базу (А) сначала создастся папка, а затем все дочерние товары успешно привяжутся к ней по GUID.

---

Более элегантные альтернативные варианты отбора

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

Использование оператора «В группе»

Вместо использования плоского оператора сравнения Равно при настройке отбора справочника Номенклатура гораздо эффективнее использовать оператор иерархического сравнения:

Ссылка В группе "0002"

Разберем подробнее, почему это решение является наиболее предпочтительным. Оператор В группе указывает платформе выполнить иерархический запрос. В выгрузку автоматически попадет сама выбранная папка «0002», абсолютно все элементы, находящиеся непосредственно в ней, а также любые вложенные подпапки со всем их содержимым. Нам не придется вручную контролировать состав выгружаемых объектов.

Использование флага «Выгружать при необходимости»

В параметрах обработки «Выгрузка и загрузка данных XML» для каждого типа метаданных предусмотрена важная опция — «Выгружать при необходимости» (или опция определения данных, выгружаемых по ссылке). Если этот флаг активен для справочника Номенклатура, поведение системы меняется:

При анализе элементов, проходящих по отбору (наших товаров из папки «0002»), обработка видит заполненный реквизит Родитель. Понимая, что этот реквизит ссылается на другой объект того же справочника, система автоматически и принудительно включает саму родительскую папку «0002» в XML-выгрузку, предотвращая появление битых ссылок в базе-приемнике.

---

Критические подводные камни при переносе через XML

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

---

Что делать, если XML-перенос не подходит?

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

Перенос через правила обмена (Конвертация данных)

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

Загрузка из табличного документа (Excel)

Для разового переноса небольшой группы товаров часто быстрее и безопаснее использовать стандартный импорт таблиц:

  1. В базе-источнике зайдем в нужную группу номенклатуры.
  2. Через меню «Таблица» или команду «Вывести список» сформируем плоский список элементов и сохраним его в формате Excel (XLSX).
  3. В базе-приемнике воспользуемся встроенной или внешней обработкой «Загрузка данных из табличного документа».
  4. В настройках укажем соответствие колонок и определим режим создания групп. Обработка сама создаст необходимую иерархию папок по их текстовым наименованиям, корректно связав новые элементы с существующей структурой в базе.
← На главную