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






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

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

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

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

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

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

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

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

…и

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

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

…и:

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

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

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

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

1 Comment

  1. ЛохНесс

    Фигасе статью сократил. 😉 В результате, утерян смысл предложенного решения.

    По сути — изобретен велосипед. Достаточно посмотреть в типовые правила и увидеть простое решение.

    В ПКА "Родитель —> Родитель" написать скрипт:

    Код
    Родитель = Источник.Родитель;
    Если ПустоеЗначение(Родитель) = 1 Тогда Возврат (0) КонецЕсли;
    Пока Родитель.Уровень() > 3 Цикл
        Родитель = Родитель.Родитель;
    КонецЦикла;
    Возврат(Родитель);
    

    Показать полностью

    При таком решении, разница между количеством уровней справочников может быть больше одного.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *