gifts2017

1С:Конвертация данных: Способ переноса дерева элементов справочников между разнородными конфигурациями.

Опубликовал Вадим (api.vl) в раздел Программирование - Теория программирования

Данная задача возникает когда необходимо перенести справочники между конфигурациями у которых различается количество уровней. Например, количество уровней в справочнике "Номенклатура" в конфигурации "Торговля и Склад" - 5, а в конфигурации "Бухгалтерия" - 4. Самое простое решение - отбросить реквизит "Родитель" элементов справочника при выгрузке, но есть способ элегантнее. В данном случае мы не обсуждаем возможность изменения структуры справочника в базе-приемнике конфигурации "1С:Бухгалтерия".

Данная задача возникает, когда необходимо перенести справочники между конфигурациями у которых различается количество уровней (например, количество уровней в справочнике "Номенклатура" в конфигурации "Торговля и Склад" - 5, а в конфигурации "Бухгалтерия" - 4).

Самое простое решение - отбросить реквизит "Родитель" элементов справочника при выгрузке, но есть способ элегантнее. В данном случае мы не обсуждаем возможность изменения структуры справочника в базе-приемнике конфигурации "1С:Бухгалтерия".

Т.к. количество уровней в целевой конфигурации на 1 меньше, придется пожертвовать одним уровнем исходной конфигурации. Как правило это будет подгруппа уровня 4. Конечно, возможна ситуация, когда на Вашем предприятии каждый уровень имеет определенную семантику, тогда решение о том какой уровень отбросить надо принимать по ситуации.

Итак, как избавиться от подгруппы уровня №4? Разделим все множество элементов справочника на два множества:

  1. находящиеся на уровне 5,
  2. и находящиеся на уровне меньше 5-го.

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

Пятый уровень иерархии (вернее более четвертого)...

...и

Уровень иерархии 4 и меньше.

Для каждого из данных правил конвертации определяем условия выгрузки. Соответственно:

...и:

Для элементов, которые удовлетворяют первому правилу (уровень оказался менее 5) состав правила конвертации объекта обычен, в части конвертации реквизита "Родитель":

А для элементов с уровнем более 5 преобразуем реквизит "Родитель":

Вот и все. При загрузке элементы пятого уровня попадут в четвертый, группы четвертого уровня перенесены не будут.

Дополнение: Хотя, конечно, данное решение имеет и свои недостатки. Например, если мы выгружаем какие-либо документы имеющие реквизит "Номенклатура" - придется явно указывать по какому из двух правилу конвертировать данный реквизит, а для этого предварительно вычислять его уровень. Это же верно и для случая, когда выгружаем элементы переданные в качестве параметра форму выгрузки.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Lochness ЛохНесс (ЛохНесс) 23.06.08 13:10
Фигасе статью сократил. ;-) В результате, утерян смысл предложенного решения.

По сути - изобретен велосипед. Достаточно посмотреть в типовые правила и увидеть простое решение.
В ПКА "Родитель --> Родитель" написать скрипт:
Код
Родитель = Источник.Родитель;
Если ПустоеЗначение(Родитель) = 1 Тогда Возврат (0) КонецЕсли;
Пока Родитель.Уровень() > 3 Цикл
    Родитель = Родитель.Родитель;
КонецЦикла;
Возврат(Родитель);
Показать полностью


При таком решении, разница между количеством уровней справочников может быть больше одного.
Светлый ум; skurser; begemot; asc; +4 Ответить