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

04.06.21

Разработка - Универсальные функции

Функция преобразования дерева значений в структуру. В обработке пример работы функции.

Бесплатные

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

Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО

Наименование Скачано Бесплатно
Дерево в структуру
.epf 7,63Kb
83 Скачать бесплатно

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Стояла задача преобразования дерева значений в структуру. Это нужно для преобразования данных в json и удобного визуального восприятия.

Первый вариант, без промежуточного преобразования в структуру, сразу в json (он не подошел):

ДеревоЗначений = Новый ДеревоЗначений; // Наше дерево

ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ДеревоЗначений);
Результат = ЗаписьJSON.Закрыть();

Результат:

{
	"#value": {
		"column": [
			{
				"Name": {
					"#type": "jxs:string",
					"#value": "ИмяФайла"
				},
				"ValueType": {
					"Type": [
						"{http://www.w3.org/2001/XMLSchema}string"
					],
					"StringQualifiers": {
						"Length": 0,
						"AllowedLength": "Variable"
					}
				}
			},
			{
				"Name": {
					"#type": "jxs:string",
					"#value": "ИндексКартинки"
				},
				"ValueType": {
					"Type": [
						"{http://www.w3.org/2001/XMLSchema}decimal"
					],
					"NumberQualifiers": {
						"Digits": 10,
						"FractionDigits": 0,
						"AllowedSign": "Nonnegative"
					}
				}
			},
			{
				"Name": {
					"#type": "jxs:string",
					"#value": "ПолноеИмя"
				},
				"ValueType": {
					"Type": [
						"{http://www.w3.org/2001/XMLSchema}string"
					],
					"StringQualifiers": {
						"Length": 0,
						"AllowedLength": "Variable"
					}
				}
			}
		],
		"row": [
			{
				"row": [
					{
						"Value": [
							"Строка 2",
							0,
							"Имя 1"
						]
					},
					{
						"Value": [
							"Строка 3",
							0,
							"Имя 2"
						]
					}
				],
				"Value": [
					"Строка 1",
					0,
					""
				]
			},
			{
				"Value": [
					"Строка 5",
					0,
					""
				]
			}
		]
	}
}

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

Второй вариант написан самостоятельно:

// Произвольная функция
Функция ОсновнаяФункция(ДеревоЗначений)
	
	// ДеревоЗначений - ваше значение тип "ДеревоЗначений" для преобразования
		
	СтруктураДерева = Новый Структура();
	
	ДеревоВСтруктуру(ДеревоЗначений.Строки, СтруктураДерева);

   	ЗаписьJSON = Новый ЗаписьJSON;
	ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
	ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
	ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
	Результат = ЗаписьJSON.Закрыть();

КонецФункции

// Функция преобразования
Функция ДеревоВСтруктуру(СтрокиДерева, СтруктураДерева)

	МассивСтрок = Новый Массив();
	
	Для Каждого Строка Из СтрокиДерева Цикл
				
		ДанныеСтроки = СтрокаТаблицыЗначенийВСтруктуру(Строка);
		ДанныеСтроки.Вставить("Строки", Новый Структура);
		
		ДеревоВСтруктуру(Строка.Строки, ДанныеСтроки);	
		
		МассивСтрок.Добавить(ДанныеСтроки);
		
	КонецЦикла;
	
	СтруктураДерева.Вставить("Строки", МассивСтрок);
	
КонецФункции

// Взято из БСП (вынес отдельно)
Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт
	
	Структура = Новый Структура;
	Для каждого Колонка Из СтрокаТаблицыЗначений.Владелец().Колонки Цикл
		Структура.Вставить(Колонка.Имя, СтрокаТаблицыЗначений[Колонка.Имя]);
	КонецЦикла;
	
	Возврат Структура;
	
КонецФункции

Результат:

{
	"Строки": [
		{
			"ИмяФайла": "Строка 1",
			"ИндексКартинки": 0,
			"ПолноеИмя": "",
			"Строки": [
				{
					"ИмяФайла": "Строка 2",
					"ИндексКартинки": 0,
					"ПолноеИмя": "Имя 1",
					"Строки": []
				},
				{
					"ИмяФайла": "Строка 3",
					"ИндексКартинки": 0,
					"ПолноеИмя": "Имя 2",
					"Строки": []
				}
			]
		},
		{
			"ИмяФайла": "Строка 5",
			"ИндексКартинки": 0,
			"ПолноеИмя": "",
			"Строки": []
		}
	]
}

Ограничения: работает с простыми типами.

Платформа 8.3.14.

Позже нашел разработку, но на нее нет ссылок при запросе "Дерево в структуру": 

https://github.com/arkuznetsov/SerLib1C

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4825    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    9027    DeerCven    15    

63

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    57915    dimanich70    85    

175

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

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8138    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    72664    atdonya    31    

73

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    10112    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dkoder 6 25.10.23 09:56 Сейчас в теме
Тут рекурсия не нужна, тут же ничего на верх поднимать не надо.
При больших деревьях, строк так в 10000 и глубиной в 7 - 10, будет формироваться кучу вызовов функций, это прям вот долго, и дорого по ресурсам на обслуживание рекурсий

нужно все в одной функции сделать, просто нужно взять два доп массива в первый пишем родителей во второй пишем подчиненные строки, потом первому массиву присваивам второй, и повторяем. При этом мы работаем со срезами дерева, что примерно на порядок быстрее. Как бонус, если нужно вытащить доп данные запросом, то количество запросов получается равным глубине дерева, в отличии от рекурсии.
Mechanik21; +1 Ответить
2. user1600314 02.11.23 15:39 Сейчас в теме
а обратно структуру в дерево
Для отправки сообщения требуется регистрация/авторизация