При переносе данных между базами 1С часто возникает задача выгрузить не весь справочник целиком, а только одну конкретную группу вместе со всей ее иерархической структурой (дочерними подгруппами и элементами). Дополнительно может потребоваться перенести связанные с этими элементами данные, например, записи независимых или подчиненных регистров сведений.
Разберем основные способы решения этой задачи: от использования конфигурации «1С:Конвертация данных 2» (КД 2) до штатных сервисных обработок платформы 1С:Предприятие.
Рассмотрим наиболее простой и производительный вариант фильтрации данных в правилах обмена. Если в правилах конвертации объектов (ПКО) справочника выполнять запрос к базе на каждый элемент, это существенно замедлит процесс выгрузки на больших объемах данных. Вместо этого применим встроенный платформенный метод ссылки ПринадлежитЭлементу().
В конфигурации «Конвертация данных» откроем нужное ПКО (например, для справочника Контрагенты) и в обработчике событий «ПередВыгрузкой» напишем следующий код:
НужнаяГруппа = Справочники.Контрагенты.НайтиПоКоду("000000001");
Если ЗначениеЗаполнено(НужнаяГруппа) Тогда
// Проверяем, является ли выгружаемый объект самой группой или входит в ее состав на любой глубине
Если Источник <> НужнаяГруппа И НЕ Источник.ПринадлежитЭлементу(НужнаяГруппа) Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Метод ПринадлежитЭлементу() проверяет всю глубину вложенности без выполнения тяжелых запросов к базе данных и сразу отсекает все элементы и папки, не входящие в указанную иерархию.
Если мы хотим избежать полного перебора всех элементов справочника в базе источнике, настроим выборку данных на уровне Правила выгрузки данных (ПВД). В этом случае платформа сразу выберет из базы только нужные записи одним запросом.
Разберем настройку по шагам:
Контрагенты.ВыборкаДанных:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Ссылка В ИЕРАРХИИ(&Родитель)";
// Указываем ссылку на нужную группу
Запрос.УстановитьПараметр("Родитель", Справочники.Контрагенты.НайтиПоКоду("000000001"));
ВыборкаДанных = Запрос.Выполнить().Выбрать();
Обратите внимание на конструкцию Контрагенты.Ссылка В ИЕРАРХИИ(&Родитель). В отличие от условия по реквизиту Родитель, проверка поля Ссылка включает в выборку как саму корневую группу, так и все подчиненные подгруппы и элементы независимо от уровня вложенности.
Если правила обмена уже созданы для выгрузки справочника целиком, мы можем не вносить изменения в сами правила, а настроить фильтр непосредственно при запуске выгрузки:
Универсальный обмен данными в формате XML в базе-источнике.Если перенос выполняется между одинаковыми конфигурациями (например, из рабочей базы в чистую копию), создавать правила обмена в КД 2 необязательно. Удобно воспользоваться типовой обработкой ВыгрузкаЗагрузкаXML.
Проанализируем порядок действий для выгрузки группы и связанных с ней регистров:
ВыгрузкаЗагрузкаXML.Контрагенты) и отметим его флагом.Контрагент), вид сравнения «В иерархии» и выберем ту же самую группу контрагентов.Важный момент: если в списке метаданных обработки не удается найти добавленный в конфигураторе регистр, проверьте его свойство Синоним и представление в дереве метаданных. Обработка строит дерево динамически по составу конфигурации и отображает как типовые, так и доработанные объекты.
При использовании «Конвертации данных 2» часто возникает ситуация, когда при выгрузке группы подтягиваются лишние элементы, не входящие в нее (например, если на них ссылаются реквизиты переносимых контрагентов или связанные документы). Чтобы исключить фоновую выгрузку объектов по ссылкам, в свойствах ПКО справочника включим флаг «Не выгружать объект по ссылке, если он не найден» или отключим признак выгрузки по ссылке в настройках соответствующих ПКС.