Как из файла json записать корректно иерархический справочник

1. alexfps79 19.07.23 16:39 Сейчас в теме
Добрый день, коллеги!

Помогите, пожалуйста, сделать правильный алгоритм для заполнения справочника с родителями из файла json. Я сделал код но результат не очень точный. Файл json прилагаю

Для каждого Элем Из СтруктураJSON Цикл
		
		
		Если ТекРодитель ="" И Счетчик =0 Тогда
			 НоваяНомГруппа = Справочники.Арт_НоменклатурныеГруппы.СоздатьЭлемент();
		     НоваяНомГруппа.Код = "_"+Элем.Код+"_";
			 НоваяНомГруппа.Наименование = Элем.Наименование;
		     НоваяНомГруппа.Комментарий = "Загружено из Документооборота2";
		     НоваяНомГруппа.Записать();
		     ТекРодитель = НоваяНомГруппа; //ПерваяКорневая группа
		     Счетчик = Счетчик + 1;
		Иначе	//Здесь Родитель равен ТекРодитель.Наименование
			Если Элем.Родитель = ТекРодитель.Наименование Тогда
				НоваяНомГруппа = Справочники.Арт_НоменклатурныеГруппы.СоздатьЭлемент();
				НоваяНомГруппа.Код =  "_"+Элем.Код+"_";
				НоваяНомГруппа.Родитель = ТекРодитель;
				НоваяНомГруппа.Наименование = Элем.Наименование;
				НоваяНомГруппа.Комментарий = "Загружено из Документооборота2";
				НоваяНомГруппа.Записать();
				Счетчик = Счетчик + 1;
				
			Иначе  //новый родитель ищем по наименованию
				НайденныйРодитель = Справочники.Арт_НоменклатурныеГруппы.НайтиПоНаименованию(Элем.Родитель);
				
				НоваяНомГруппа = Справочники.Арт_НоменклатурныеГруппы.СоздатьЭлемент();
				НоваяНомГруппа.Код =  "_"+Элем.Код+"_";
				НоваяНомГруппа.Наименование = Элем.Наименование;
				НоваяНомГруппа.Родитель = НайденныйРодитель;
				НоваяНомГруппа.Комментарий = "Загружено из Документооборота2";
				НоваяНомГруппа.Записать();
				Счетчик = Счетчик + 1;
				ТекРодитель = НайденныйРодитель; 
			КонецЕсли;
		КонецЕсли;
	конецЦикла;	
Показать
Прикрепленные файлы:
simpleWrite.json
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 19.07.23 16:53 Сейчас в теме
(1)лично я преобразовал бы СтруктураJSON в ТаблицаЗначений и уже ее использовал бы в качестве источника данных.
spacecraft; +1 Ответить
4. alexfps79 19.07.23 17:02 Сейчас в теме
(2) Спасибо за ответ, а как с помощью ТЗ присвоить родителя корректно? Как-то перекомпоновать?
10. spacecraft 19.07.23 17:15 Сейчас в теме
(4) из подготовленного ТЗ получить все элементы, у которых не заполнен родитель.
Из полученного массива в цикле получать элемент. Создавать элемент справочника. Сохранять. И сразу получать из ТЗ массив элементов, у которых этот элемент является родителем.
В итоге получится обход рекурсией.
Но тут может быть подводный камень - зацикливание рекурсии, если окажется, что элемент (поиск ведь по строке) является родителем в во вложенной иерархии элементов.
По ГУИД будет более надежно.
nomad_irk; +1 Ответить
12. Said-We 19.07.23 17:25 Сейчас в теме
(10)
По ГУИД будет более надежно.
И быстрее.
13. spacecraft 19.07.23 17:29 Сейчас в теме
(12) не принципиально. Поиск будет по текстовому представлению ГУИД. Скорость будет одинаковой.
15. alexfps79 20.07.23 08:42 Сейчас в теме
(12) а еще момент как контролировать корневую группу? ГУИД пустая строка?

Нужна проверка на пустоту ГУИД? перед вот этим кодом?
СсылкаНаНоменклатуру = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ГУИД_Строкой));
Попытка
    ОбъектПоСсылке = СсылкаНаНоменклатуру.Получитьобъект();
Исключение
    ОбъектПоСсылке = Неопределено;
КонецПопытки;
16. nomad_irk 76 20.07.23 08:49 Сейчас в теме
(15)Пустой UID - это по сути произвольный UID
Корень - это Справочники.Номенклатура.ПустаяСсылка()
17. alexfps79 20.07.23 08:51 Сейчас в теме
(16) спасибо за оперативный ответ!
3. Said-We 19.07.23 17:01 Сейчас в теме
Источник что за программа?
Почему каждый раз создается новый элемент? Загрузка одноразовая или предполагается повторная загрузка?

Если источник 1С, то в json добавить ГУИД элемента и ГУИД родителя и не заниматься поиском.
5. alexfps79 19.07.23 17:03 Сейчас в теме
(3) Источник 1С Документооборот. Задача загрузить список из ДО, в дальнейшем подгружать только новые элементы. По ГУИД да это хорошая идея.
6. Said-We 19.07.23 17:04 Сейчас в теме
(5) Задача похожа на:
https://forum.infostart.ru/forum9/topic300390/

Ответ там есть.
alexfps79; +1 Ответить
7. alexfps79 19.07.23 17:10 Сейчас в теме
(6)Спасибо за ссылку коллега! Скажите, пожалуйста, если Иерархия элементов метод СоздатьГруппу() будет работать?
8. пользователь 19.07.23 17:11
Сообщение было скрыто модератором.
...
9. Said-We 19.07.23 17:12 Сейчас в теме
(7) Если группа, то создавать группу. Если элемент, то создавать элемент. Если заранее известно что иерархия элементов и групп нет, то и не создавать группы. Я Вашей структуры данных не видел. Тут Вам виднее.
11. alexfps79 19.07.23 17:17 Сейчас в теме
(9)да элементы и Родители.

Справка : " В случае иерархии элементов всегда нужно создавать элементы, но также следует в свойстве Родитель созданного элемента указать ссылку на другой элемент, которому будет подчинен созданный."
14. Said-We 19.07.23 20:08 Сейчас в теме
Поиск будет сразу с получением объекта. А его и так и так получать. Для новых элементов будет создание.
Если запросом есть доступ на чтение ГУИД любого объекта, то можно найти сразу всех.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот