Обход объекта рекурсивно

27.10.24

Задачи пользователя - Поиск данных

Отображение и просмотр реквизитов справочника или документа - с бесконечным открытием подуровней.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Простое дерево объекта (без рекурсивного обхода реквизитов)
.epf 8,93Kb
1
1 Скачать (1 SM) Купить за 1 850 руб.
Обход объекта рекурсивно
.epf 10,77Kb
9
9 Скачать (1 SM) Купить за 1 850 руб.

Всем привет!

Представлена внешняя обработка - для просмотра полей документов (справочников), в том числе связанных ссылок. Вложенность просмотра - бесконечная.

Цель обработки и статьи:

  • реализовать бесконечное открытие связанных ссылок на форме,
  • реализовать алгоритм преобразования объекта метаданных (документа, справочника) в json-подобную структуру,
  • (*) реализовать алгоритм обратного преобразования из json-подобной структуры  в объект метаданных.

* Относительно последнего пункта задача решена частично, поскольку вывод в дерево не тождественен созданию объектов конфигурации.

Обработка была разработана и протестирована:

  • Платформа 1С:Предприятие 8.3 (8.3.23.1865)
  • Бухгалтерия предприятия, редакция 3.0, релизы 3.0.150.33
  • Управление нашей фирмой, редакция 3.0, релизы 3.0.6.200
  • Розница, редакция 3.0, релизы 3.0.6.200
  • Зарплата и управление персоналом, редакция 3.1, релизы 3.1.28.65
  • Управление торговлей, редакция 11, релизы 11.4.13.103
  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.6.227
  • 1С:Комплексная автоматизация 2, релизы 2.5.12.265
  • предполагается, что будет работать на любой конфигурации на управляемых формах.

Анализируются все реквизиты объекта и реквизиты всех табличных частей объекта (см. рис. в ленте):

  • вариант по умолчанию - показываются только заполненные связанные ссылки
  • дополнительный вариант - также включить анализ и отображение пустых незаполненных полей
  • дополнительный вариант - также включить анализ и отображение перечислений и примитивных типов данных (Строка, Булево, Дата, Число)

Подобный алгоритм был использован и применен:

Идея задачи родилась:

 
 Видео-демонстрация внешней обработки отображения дерева объекта

 

 

 

Перед выводом дерева происходит рекурсивный обход реквизитов: для каждой ссылки определяется тип значений и сохраняется структура всех связанных ссылок. Таким образом, для примера отображения дерева по документу "Расходная накладная 29 от 23.06.2022" (рис. 6 в ленте и рис. ниже) сохранился список из 914 типов и их структур (реквизитов и табл. частей) (рис. 7 в ленте и второй рис. ниже). 

Структура хранения информации напоминает структуру json - состоит из массива структур, каждая структура содержит массив. Хранение информации в подобном виде применяется мною в проектах для передачи дерева значений между сервером и клиентом, клиентом и сервером.

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

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

Бесконечно раскрывать узлы дерева также можно непосредственно на форме без усложнения исходной задачи (прикрепил к статье отдельный файл "Простое дерево объекта (без рекурсивного обхода реквизитов)") - без предварительного анализа всех связанных ссылок - выводим непосредственно каждый новый раскрытый узел дерева (каждый новый объект конфигурации). 

  

 

Следующий способ вывести дерево объекта - это использовать посредника в виде json-структуры. В данной реализации - вывод в дерево - это всего лишь один из способов показать, как разбирается и собирается объект базы данных (документ, например) через json-структуры, как рекурсивно обходится объект по всем связанным ссылкам.

Используемый стек алгоритмов:

  • Вывод дерева значений на управляемых формах
  • Добавление подчиненных узлов дерева по выделенной строке
  • Реализация бесконечной вложенности узлов
  • Реализация преобразования объекта метаданных в json-структуру
  • Реализация обратного преобразования из json-структуры в объект метаданных в виде дерева.

Обновление 19-06-2024:

  • Расширил тип исходного объекта - теперь не только Документы - добавил тип Справочники
  • Добавил в анализ примитивных типов данных такие типы, как Хранилище Значений и Уникальный Идентификатор - теперь корректно отображается и раскрывается такой справочник как Пользователи (обычно он используется в реквизите Ответственный или Автор).
  • Добавил обработку "Простое дерево объекта (без рекурсивного обхода реквизитов)". Эта обработка не хранит структуру реквизитов связанных ссылок и не обходит все поля рекурсивно - при первом построении дерева работает быстрее, и, в целом, не нагружает память устройства в отличие от другой прилагаемой обработки. См. видео ниже.

Обновление 20-06-2024г:

  • Исправлена ошибка в обработке "Обход дерева рекурсивно" - теперь вывод дерева ускорен. Протестировано на КА 2.5.12.265 на объекте Справочник "Варианты отчета" - см. рис. 11 в ленте и ниже. 

На этом все. Всем добра!

С пользой для клиентов, Рустем

 
 См. также
  1. Анализ прав и ролей. Поиск подходящего профиля - алгоритмический анализ и поиск
  2. Оцифровка и визуализация склада - программная прорисовка склада
  3. Удаление документов для любых баз на управляемых формах
  4. Удаление справочников для любых баз на управляемых и обычных формах
  5. Перенумерация документов и справочников - с учетом префиксов номеров
  6. Свертка базы УТ 10.3 подокументно - новая концепция 
  7. Матричное программирование - демо-стенд матричного калькулятора
  8. Справочное хранение товаров в КА 2.5 - кейс запуска адресного склада
  9. Мини-обзор разных задач - от очевидного до неочевидного
  10. Поиск отчета по документам - пример анализа незнакомых конфигураций
  11. Флажок в динамическом списке - от теории до практики "как бы простой" задачи
  12. Из Json в ДеревоЗначений - удобный просмотрщик json-структуры
  13. Внедрение адресного склада в КА 2.5 - кейс запуска адресного склада
  14. Фрилансеру: про цены, про клиентов, про планирование - мое исследование
  15. Что такое форматированный документ - прекрасная возможность раскрасить любой текст
  16. Программная работа с упаковками в КА 2.5 - примеры адаптаций механизмов упаковок в КА 2.5
  17. Универсальное сравнение регистров накопления - связь по измерениям, сравнение по ресурсам

 

Проверено на следующих конфигурациях и релизах:

  • Бухгалтерия предприятия, редакция 3.0, релизы 3.0.150.33
  • Управление нашей фирмой, редакция 3.0, релизы 3.0.6.200
  • Розница, редакция 3.0, релизы 3.0.6.200
  • Зарплата и управление персоналом, редакция 3.1, релизы 3.1.28.65
  • Управление торговлей, редакция 11, релизы 11.4.13.103
  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.6.227
  • 1С:Комплексная автоматизация 2, релизы 2.5.12.265

обход дерева значений рекурсией

См. также

Поиск данных Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

10800 руб.

14.05.2012    159627    339    253    

573

Математика и алгоритмы Инструментарий разработчика Универсальные функции Поиск данных Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Абонемент ($m)

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

5 стартмани

25.09.2024    2582    1    Артано    14    

19

Поиск данных Программист Платформа 1С v8.3 Россия Бесплатно (free)

В этой статье я хочу рассмотреть еще один кейс применения Clickhouse в связке с 1С - оптимизацию поиска в справочнике по ключевым словам. Здесь не будет готового решения, но будут описаны важные моменты, которые позволят легко применить данный кейс в реальности.

18.08.2024    2192    1cnik2    23    

16

Поиск данных Системный администратор Программист Платформа 1С v8.3 Россия Абонемент ($m)

Статья об опыте развертывания и интеграции с базой данных Manticore Search для быстрого полнотекстового поиска.

1 стартмани

30.11.2023    5037    andreysidor4uk    18    

54

Поиск данных Корректировка данных Пользователь Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Абонемент ($m)

PowerOffice - обработка для поиска, просмотра и обработки данных для пользователей. Доступ к объектам на просмотр и редактирование данных определяется правами пользователя.

1 стартмани

05.06.2023    2431    26    PowerBoy    1    

16

Поиск данных Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Абонемент ($m)

Получение ссылки в 1С по бинарной строке из PostgreSQL в виде строки формата bytea или из MSSQL в виде шестнадцатиричной строки. Кроме ссылочных объектов ссылки могут быть получены и для перечислений. Это может быть полезно при анализе логов журнала регистрации или СУБД.

1 стартмани

04.04.2023    3324    4    berserg    2    

13

Поиск данных Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Абонемент ($m)

Обработка позволяет найти проведенные документы без движений и, наоборот, НЕ проведенные документы с движениями. Подходит для любой конфигурации.

1 стартмани

18.08.2022    3432    32    KVIKS    4    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vis_tmp 32 15.06.24 15:51 Сейчас в теме
Спасибо, полезная вещь
2. Alxby 1123 15.06.24 19:58 Сейчас в теме
Не увидел, есть ли пометка цикла, т.е. уже выведенного объекта. Если нет, неплохо бы сделать.
5. RustIG 1834 15.06.24 21:55 Сейчас в теме
(2) уточните, что это? Что за цикл? В каком виде фиксировать уже выведенный объект?
7. Alxby 1123 16.06.24 08:07 Сейчас в теме
(5) Рустем, смотрите: вот исследую я какой-то объект. В процессе исследования я раскрываю вложенные объекты до 10 уровня, и на 10 уровне дохожу до элемента, который мне уже попадался на 3 уровне. Чтобы снова не повторить путь раскрытия с 3-го по 10-й уровень для этого элемента, мне нужно вспомнить, что я его уже проходил. А чтобы не запоминать все пройденные объекты, лучше чтобы система сама об этом сообщала. Например выделением цветом, флажком, шрифтом, etc.
9. RustIG 1834 16.06.24 18:50 Сейчас в теме
(7) концепция разработки другая. Здесь нет уровней и подсчета вложенностей. Система запоминает все объекты. К примеру первым объектом будет сам Заказ покупателю. Запоминается весь его скелет. Далее по очереди будет первый реквизит ссылочного типа. У второго элемента запоминается также весь скелет. И рекурсивно обходятся все элементы ссылочного типа с запоминанием скелета объекта. Запоминается единожды, потом скелет используется бесконечно много раз при выводе дерева.
13. Alxby 1123 16.06.24 19:23 Сейчас в теме
(9)Если сама система рекурсивно запоминает все дерево - скелет до самого последнего узла, тогда тем более необходим контроль зацикливания, например, если в заказе будет ссылка на контрагента, у контрагента - ссылка на основной договор, а у договора - владелец - этот же контрагент. А если такой контроль есть, почему бы его не отразить для пользователя? ))
17. RustIG 1834 16.06.24 19:49 Сейчас в теме
(13) контроль есть, очень просто реализован . легко показать. Как вам показать зацикливание?
19. Alxby 1123 16.06.24 20:44 Сейчас в теме
(17) Да нет, мне показывать не надо). Я просто подумал, что может быть полезным отметить это для пользователя. Но автору в данном случае виднее, нужен ли такой функционал. Повторюсь: обработка заслуживает "плюса" в любом случае.
10. RustIG 1834 16.06.24 18:52 Сейчас в теме
(7)в примере на видео система запомнила 900 объектов и их скелеты - структуры данных.
14. Alxby 1123 16.06.24 19:30 Сейчас в теме
(10) Для задач, связанных с разузлованием номенклатуры (изделий и деталей) дерево может быть очень большим - с понятными последствиями для быстродействия и объема памяти. Обработка проверялась в веб-клиенте? А так, решение классное, особенно для проведения анализа взаимосвязей в базе.
15. RustIG 1834 16.06.24 19:46 Сейчас в теме
(14) 1)веб-клиент не проверялась, на сервере используется контекст формы обработки только из-за параметров " показывать примитивные типы", "показывать пустые" , если их убрать, задействовать априори, то контекст формы можно не передавать на сервер. В целом алгоритм адаптируем под любые задачи.
2)Разузлование очень большое это хорошо. В задаче разузлования разных скелетов будет мало: номенклатура и спецификации , что то еще . У меня на видео по заказу запомнилось 900 разных типов для быстрого построения дерева. В задаче разузлования разных типов будет условно 10, потом только ссылки меняются, а сама структура объектов не изменяется. Думаю, быстро отработает.
18. Alxby 1123 16.06.24 20:40 Сейчас в теме
(15) А, теперь я понял, скелет - это не состав объекта, а состав типа объекта. Тогда ок.
11. RustIG 1834 16.06.24 18:56 Сейчас в теме
(7) в процессе обследования система обходит все объекты ссылочного типа, то есть у некоторых объектов уровень вложенности один будет - когда у объекта нет своих связанных ссылок, у некоторых - уровней будет 50 - когда связанных ссылок много, а у тех в свою очередь тоже связанные ссылки. Тутиспользуется рекурсия при обходе всех ссылок.
29. RustIG 1834 27.12.24 09:42 Сейчас в теме
(7) понял вас, интересная мысль.
Скажем так, в момент написания статьи я был внутри своей концепции - и не видел других (не слышал никого).
Скажем так, для определенных целей (задач) такой способ конечно надо реализовывать самостоятельно: ввести какой-нибудь механизм, хранящий уже обработанные данные.
В последствии решая другие задачи, где можно было использовать рекурсивный обход объектов, я не только облегчил алгоритм, но и задействовал подобный механизм хранения и проверки , что следующий объект уже был обработан.
Например, в задаче регистрации объектов в плане обмена - когда для справочника (документа) мы регистрируем все ссылки реквизитов, и все ссылки реквизитов у предыдущих ссылок....
3. Alxby 1123 15.06.24 19:59 Сейчас в теме
Еще колонку с типом реквизита можно добавить
4. RustIG 1834 15.06.24 21:51 Сейчас в теме
21. RustIG 1834 17.06.24 13:02 Сейчас в теме
(3) добавил
Прикрепленные файлы:
6. Grigoriy251 119 15.06.24 23:34 Сейчас в теме
Точно, хотел тоже написать.
Полезная чтука, для анализа и для разработок. Но чего то долго обрабатывает.
А ещё можно добавить отображение движений, в принципе это не сложно.)
16. RustIG 1834 16.06.24 19:47 Сейчас в теме
(6) у меня старый ноутбук, у меня любая файловая база на упр формах открывается и работает долго
8. aximo 2134 16.06.24 09:20 Сейчас в теме
По-моему это какая-то бсп-шная тема
12. RustIG 1834 16.06.24 19:04 Сейчас в теме
(8) процедуры общих модулей Бсп не использую. Не знаю, про что вы написали.
20. kser87 2452 17.06.24 12:26 Сейчас в теме
Чего только не придумают
22. ixijixi 1978 18.06.24 09:01 Сейчас в теме
Плюсанул. Не могу не отметить, что для подобных целей (только без данных) можно использовать механизм СКД
Прикрепленные файлы:
0x00; RustIG; +2 Ответить
23. RustIG 1834 18.06.24 10:06 Сейчас в теме
(22) спасибо, интересный момент.

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

Я расширил описание статьи некоторыми выводами.
Alxby; ixijixi; +2 Ответить
24. RustIG 1834 19.06.24 12:47 Сейчас в теме
Обновление от 19-06-2024:

Проверил на следующих конфигурациях и релизах:

+ Бухгалтерия предприятия, редакция 3.0, релизы 3.0.150.33
+ Управление нашей фирмой, редакция 3.0, релизы 3.0.6.200
+ Розница, редакция 3.0, релизы 3.0.6.200
+ Зарплата и управление персоналом, редакция 3.1, релизы 3.1.28.65
+ Управление торговлей, редакция 11, релизы 11.4.13.103
+ 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.6.227
+ 1С:Комплексная автоматизация 2, релизы 2.5.12.265

Добавил новое:

+ Расширил тип исходного объекта - теперь не только Документы - добавил тип Справочники
+ Добавил в анализ примитивных типов данных такие типы, как Хранилище Значений и Уникальный Идентификатор - теперь корректно отображается и раскрывается такой справочник как Пользователи (обычно он используется в реквизите Ответственный или Автор).
+ Добавил обработку "Простое дерево объекта (без рекурсивного обхода реквизитов)"
25. RustIG 1834 19.06.24 13:53 Сейчас в теме
Добавил видео - две обработки - тесты на разных конфигурациях
26. RustIG 1834 20.06.24 22:10 Сейчас в теме
Обновление 20-06-2024г:

Исправлена ошибка в обработке "Обход дерева рекурсивно" - теперь вывод дерева ускорен. Протестировано на КА 2.5.12.265 на объекте Справочник "Варианты отчета".
Переполнения памяти нет.
27. Светлый ум 454 27.12.24 07:07 Сейчас в теме
Какое количество подуровней было?
(мне нужно спецификацию 14-18 уровней раскрутить)
28. RustIG 1834 27.12.24 09:21 Сейчас в теме
(27)
Какое количество подуровней было?


безлимит

мне нужно спецификацию 14-18 уровней раскрутить


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

____________________________________________________
В Томске , кажется, штаб -квартира компании Ольги Усковой...
Оставьте свое сообщение