Пакетная сортировка метаданных основной конфигурации и расширений

Быстрая пакетная сортировка метаданных по алфавиту независимо от конфигурации поставщика. Сравнение производительности алгоритмов на Java и 1C:Enterprise.

Дисклеймер

Целью публикации не является занижение или завышение возможностей того или иного языка программирования.
Замеры времени работы алгоритмов выполнены исключительно из любопытства.

Причина создания утилиты

Бывают такие конфигурации, в которых объекты метаданных следуют в произвольном порядке. Это происходит как в следствии объединения с другой конфигурацией так и при добавлении кастомных объектов без учета порядка. Как правило, это затрудняет быстрый поиск объекта.
Частично проблема решается с помощью конфигурации поставщика, но в ней также порядок объектов метаданных бывает не идеален. Кроме того, конфигурации поставщика может и не быть, если речь о кастомной конфигурации.

UPD: Также есть возможность сортировки средствами конфигуратора, но она не позволяет сразу упорядочить все объекты и их реквизиты. Необходимо выделять каждый объект метаданных для того, чтобы упорядочить его реквизиты. Моя утилита не имеет таких ограничений.

Решение задачи

Предлагаю Java алгоритм сортировки метаданных. Работает с конфигурацией, которая выгружена в файлы xml.
Алгоритм разделен на две части:

  • Сортировка родительских объектов (общие модули, константы, обработки и т.д.) без учета реквизитов, табличных частей и пр. (файл Configuration.xml).
  • Сортировка реквизитов, табличных частей и прочих объектов, которая работает согласно файлу (metadataDescription.xml), в котором описаные правила сортировки. 

При разработке Java алгоритма не использовался способ последовательного чтения файла (SAX) а также многопоточность, то есть тоже самое реализуется и средствами 1С:Enterprise. Ниже приведен сниппет алгоритма, который сортирует файл Configuration.xml (сортировку реквизитов объектов на 1С не реализовывал).

 

 Сниппет алгоритма сортировки файла Configuration.xml

Приведу результаты 3 тестов работы алогритмов. В качестве образца для сортировки использовал файлы Configuration.xml из директории example проекта (1), продукта 1С:Управление торговлей 11.4 (2) и продукта 1С:ERP 2.4 (3). Замеры произвел несколько раз для получения среднего результата.


Видно, что на небольшом файле разницы во времени никакой нет, но на файле большего размера разница в 5-6 раз.

На сортировку объектов и реквизитов продукта 1С:Управление торговлей 11.4 с использованием алгоритма на Java ушло ~30 сек (без многопоточности).

Инструкция

Утилита имеет интерфейс CLI. Для запуска на ПК должна быть установлена JVM.

cd MetadataSorting
java -jar MetadataSorting.jar -h

Для сортировки реквизитов, команд и прочих объектов, файл metadataDescription.xml должен находится в одной директории с файлами конфигурации. Таким образом, если нет необходимости сортировать те или иные объекты, нужно просто отредактировать файл metadataDescription.xml

Внимание

Работа утилиты подразумевает перезапись исходных файлов конфигурации, поэтому убедитесь, что сделана копия. 

Java проект доступен на GitHub

 

11 Comments

  1. comol

    (0) а где код на 1С? Предполагаю что я на 1С напишу алгоритм который «сделает это» быстрее чем на Java.

    В коде сортировки не должно быть циклов иначе сравнение псевдокода и интерпретатора конечно же некорректно.

    А вот если использовать Xpath то тут будет сравнение скорости работы движков. При условии что движок 1С написан на C++ если взята правильная библиотека — я думаю преимущество в скорости будет не за псевдокодом.

    Reply
  2. nixel

    (1) код на 1с в статье 🙂

    Reply
  3. fr13

    (1) Код на 1С реализован частично, о чем написано в публикации.

    Если Вы можете что-то сделать лучше — всегда пожалуйста, особено хотелось бы посмотреть как это будет реализовано без циклов.

    Если говорить об XPath, то я рассматривал этот вариант, но отказался от него, так как цель была коснольная утилита, а не таблица XSL.

    Reply
  4. dm_romanov.idm

    А чем сортировка метаданных в конфигураторе не устроила?

    Reply
  5. fr13

    (4)Если Вы про тот, который осуществляется с помощью синих стрелок, то это слишком трудоемкий процесс в рамках даже небольшой конфигурации.

    Reply
  6. a-novoselov

    (5)

    Так пробовали?

    Reply
  7. dm_romanov.idm

    (5) Рядом есть кнопка «Упорядочить список», которая позволяет сортировать по наименованию, комментарию, синониму.

    Reply
  8. fr13

    (6) вот это я как то упустил ) спасибо )

    В любом случае задача утилиты была сделать что-то на ООП языке и только потом практическое применение сделанного.

    Так или иначе сделаю многопоточность.

    Reply
  9. fr13

    (7) Я посмотрел эту фичу — это немного не то. Чтобы упорядочить реквизиты объекта — нужно выделить его и дальше сделать еще пару клиеов. В моей реализации все объекты и их реквизиты сортируются полностю автоматически.

    Reply
  10. Vladimir Litvinenko

    (9) Разработка интересная, но согласно стандартам разработки только объекты метаданных верхнего уровня должны быть упорядочены по имени в алфавитном порядке. Реквизиты объектов должны располагаться в соответствии с их прикладным смыслом, что бы это не значило ))

    Например, реквизиты ДатаВходящегоДокумента и НомерВходящегоДокумента следует располагать непосредственно друг за другом, независимо от наличия реквизита ДатаРожденияКлиента и НомерАвтомобиля, которые при упорядочивании по алфавиту встрянут между ними.

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

    Поэтому логично, что в конфигураторе реализовано только упорядочивание, позволяющее удовлетворить требованиям стандарта разработки и не реализованы механизмы, ведущие к проблемам с индексацией или разгруппирующие логически связанных реквизитов объектов.

    2.3. Объекты метаданных верхнего уровня, такие как Справочники, Документы, Общие модули и т.д. рекомендуется сортировать в дереве метаданных по имени. Подчиненные объекты метаданных, такие как реквизиты, измерения, формы, располагаются в дереве метаданных в соответствии с проектной логикой.

    https://its.1c.ru/db/v8std#content:2149184116:hdoc
    Reply
  11. fr13

    (11)Спасибо за комментарий.

    Измерения регистров конечно же пропускаются при сортировке.

    Reply

Leave a Comment

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