При администрировании и сопровождении баз данных на платформе «1С:Предприятие 8.3» (например, при работе с конфигурацией «Комплексная автоматизация 1.1» на обычных формах) регулярно возникает необходимость частичного переноса нормативно-справочной информации (НСИ). Часто требуется перенести не весь справочник Номенклатура, а лишь его отдельный сегмент — конкретную папку (группу) со всем содержимым.
Для решения этой задачи технические специалисты традиционно используют стандартную обработку с диска ИТС «Выгрузка и загрузка данных XML». Однако при выполнении этой операции начинающие разработчики и администраторы часто сталкиваются со следующей проблемой: процесс выгрузки и загрузки завершается успешно и без ошибок, но перенесенная папка и элементы внутри базы-приемника просто не отображаются в справочнике. Выясним причину этого поведения, разберем архитектурные нюансы платформы 1С и рассмотрим несколько способов решения этой задачи.
Проанализируем ситуацию, в которой оказался автор темы. В базе-источнике (Б) существовала иерархическая структура справочника, где в папке «01» находилась подпапка «001», внутри которой содержались папки «0001» и «0002». Задача заключалась в переносе в базу-приемник (А) только папки «0002» с ее содержимым.
Пользователь попытался решить задачу «в лоб»: установил отбор для справочника Номенклатура по правилу Родитель Равно "0002". На первый взгляд это логично, но с точки зрения архитектуры базы данных 1С здесь кроются две серьезные проблемы:
Родитель Равно "0002", система делает запрос к таблице справочника и выбирает только те записи, у которых в поле Родитель (хранящем уникальный идентификатор GUID) указана ссылка на папку «0002». Сама папка «0002» при этом условию не удовлетворяет, так как ее родителем является папка «001». В результате в XML-файл попадают только конечные товары, а сама папка-родитель игнорируется.Родитель у этих товаров прописан уникальный идентификатор (GUID) папки «0002». Платформа успешно создает записи в таблице справочника, но физического объекта с GUID папки «0002» в базе-приемнике не существует. В иерархическом динамическом списке справочника такие элементы становятся невидимыми («сиротами»), поскольку система не может построить для них корректное дерево иерархии.Если мы хотим убедиться, что данные физически попали в базу (А), мы можем переключить динамический список справочника в режим просмотра «Дерево» на режим «Список» (без отображения групп) или написать простой запрос в консоли запросов. Рассмотрим пример такого запроса для поиска «сирот» с битыми ссылками на родителя:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Родитель КАК Родитель
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель.Наименование ЕСТЬ NULL
И НЕ Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
И НЕ Номенклатура.ЭтоГруппа
Этот запрос наглядно покажет нам элементы, у которых поле Родитель заполнено некорректной (битой) ссылкой, ссылающейся на несуществующий в базе объект.
---
Самый простой способ исправить ситуацию при использовании отбора по конкретному родителю — принудительно включить саму папку-родитель в XML-файл. Рассмотрим, как это сделать по шагам:
Номенклатура, отметим его флажком и откроем настройки отбора.Родитель со значением Равно "0002" (выбираем конкретную папку из справочника).При таком подходе в XML-файл сначала запишется тело самой папки «0002» (ее наименование, код, уникальный идентификатор GUID), а затем — подчиненные ей элементы. При загрузке в базу (А) сначала создастся папка, а затем все дочерние товары успешно привяжутся к ней по GUID.
---
Чтобы не добавлять папки вручную в список дополнительных объектов, мы можем использовать более продвинутые механизмы платформы 1С, встроенные в обработку выгрузки.
Вместо использования плоского оператора сравнения Равно при настройке отбора справочника Номенклатура гораздо эффективнее использовать оператор иерархического сравнения:
Ссылка В группе "0002"
Разберем подробнее, почему это решение является наиболее предпочтительным. Оператор В группе указывает платформе выполнить иерархический запрос. В выгрузку автоматически попадет сама выбранная папка «0002», абсолютно все элементы, находящиеся непосредственно в ней, а также любые вложенные подпапки со всем их содержимым. Нам не придется вручную контролировать состав выгружаемых объектов.
В параметрах обработки «Выгрузка и загрузка данных XML» для каждого типа метаданных предусмотрена важная опция — «Выгружать при необходимости» (или опция определения данных, выгружаемых по ссылке). Если этот флаг активен для справочника Номенклатура, поведение системы меняется:
При анализе элементов, проходящих по отбору (наших товаров из папки «0002»), обработка видит заполненный реквизит Родитель. Понимая, что этот реквизит ссылается на другой объект того же справочника, система автоматически и принудительно включает саму родительскую папку «0002» в XML-выгрузку, предотвращая появление битых ссылок в базе-приемнике.
---
Использование обработки «Выгрузка и загрузка данных XML» сопряжено с рядом технических нюансов, о которых обязательно нужно помнить, чтобы не повредить данные в рабочей базе:
Номенклатура), загрузка файлов XML может аварийно завершиться критической ошибкой, что потенциально чревато разрушением целостности базы данных. Перед выполнением подобных операций всегда делайте резервную копию (бэкап) базы-приемника.---
Если конфигурации баз различаются или структуры справочников сильно изменены, лучше отказаться от низкоуровневого XML-переноса в пользу прикладных методов:
С помощью специализированной конфигурации «1С:Конвертация данных» можно настроить правила обмена (ПКО и ПВД) для справочника Номенклатура. В правилах можно четко указать поля поиска (например, производить синхронизацию не по GUID, а по полям Код или Наименование + ЭтоГруппа). Это полностью исключит появление дублей при переносе.
Для разового переноса небольшой группы товаров часто быстрее и безопаснее использовать стандартный импорт таблиц: