Как в 1С выгрузить определенную группу справочника со всеми вложенными подгруппами и элементами?

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

При переносе данных между базами 1С часто возникает задача выгрузить не весь справочник целиком, а только одну конкретную группу вместе со всей ее иерархической структурой (дочерними подгруппами и элементами). Дополнительно может потребоваться перенести связанные с этими элементами данные, например, записи независимых или подчиненных регистров сведений.

Разберем основные способы решения этой задачи: от использования конфигурации «1С:Конвертация данных 2» (КД 2) до штатных сервисных обработок платформы 1С:Предприятие.

Способ 1. Использование встроенного метода «ПринадлежитЭлементу» в ПКО (Конвертация данных 2)

Рассмотрим наиболее простой и производительный вариант фильтрации данных в правилах обмена. Если в правилах конвертации объектов (ПКО) справочника выполнять запрос к базе на каждый элемент, это существенно замедлит процесс выгрузки на больших объемах данных. Вместо этого применим встроенный платформенный метод ссылки ПринадлежитЭлементу().

В конфигурации «Конвертация данных» откроем нужное ПКО (например, для справочника Контрагенты) и в обработчике событий «ПередВыгрузкой» напишем следующий код:


НужнаяГруппа = Справочники.Контрагенты.НайтиПоКоду("000000001");

Если ЗначениеЗаполнено(НужнаяГруппа) Тогда
    // Проверяем, является ли выгружаемый объект самой группой или входит в ее состав на любой глубине
    Если Источник <> НужнаяГруппа И НЕ Источник.ПринадлежитЭлементу(НужнаяГруппа) Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

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

Способ 2. Выгрузка через ПВД с произвольным алгоритмом выборки

Если мы хотим избежать полного перебора всех элементов справочника в базе источнике, настроим выборку данных на уровне Правила выгрузки данных (ПВД). В этом случае платформа сразу выберет из базы только нужные записи одним запросом.

Разберем настройку по шагам:

  1. Откроем ПВД для справочника Контрагенты.
  2. Установим способ выборки данных в значение «Произвольный алгоритм».
  3. В обработчике «ПередОбработкойПравила» сформируем запрос и передадим его результат в предопределенный параметр ВыборкаДанных:

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Контрагенты.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |   Контрагенты.Ссылка В ИЕРАРХИИ(&Родитель)";

// Указываем ссылку на нужную группу
Запрос.УстановитьПараметр("Родитель", Справочники.Контрагенты.НайтиПоКоду("000000001"));

ВыборкаДанных = Запрос.Выполнить().Выбрать();

Обратите внимание на конструкцию Контрагенты.Ссылка В ИЕРАРХИИ(&Родитель). В отличие от условия по реквизиту Родитель, проверка поля Ссылка включает в выборку как саму корневую группу, так и все подчиненные подгруппы и элементы независимо от уровня вложенности.

Способ 3. Установка отбора в обработке «Универсальный обмен данными в формате XML»

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

  1. Откроем обработку Универсальный обмен данными в формате XML в базе-источнике.
  2. Загрузим файл правил конвертации данных.
  3. На вкладке «Выгрузка данных» найдем строку нужного справочника.
  4. В правой части окна настройки отбора добавим новое условие: поле «Ссылка», вид сравнения — «В иерархии» (или «В группе»), в поле значения выберем нужную группу справочника.
  5. Запустим процесс выгрузки данных.

Способ 4. Перенос данных через обработку «ВыгрузкаЗагрузкаXML» для идентичных конфигураций

Если перенос выполняется между одинаковыми конфигурациями (например, из рабочей базы в чистую копию), создавать правила обмена в КД 2 необязательно. Удобно воспользоваться типовой обработкой ВыгрузкаЗагрузкаXML.

Проанализируем порядок действий для выгрузки группы и связанных с ней регистров:

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

Важный момент: если в списке метаданных обработки не удается найти добавленный в конфигураторе регистр, проверьте его свойство Синоним и представление в дереве метаданных. Обработка строит дерево динамически по составу конфигурации и отображает как типовые, так и доработанные объекты.

Предотвращение выгрузки лишних объектов по ссылкам

При использовании «Конвертации данных 2» часто возникает ситуация, когда при выгрузке группы подтягиваются лишние элементы, не входящие в нее (например, если на них ссылаются реквизиты переносимых контрагентов или связанные документы). Чтобы исключить фоновую выгрузку объектов по ссылкам, в свойствах ПКО справочника включим флаг «Не выгружать объект по ссылке, если он не найден» или отключим признак выгрузки по ссылке в настройках соответствующих ПКС.

← На главную