Преобразовать массив структур в ТаблицуЗначений

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

Комментарии

mussolene
#1, 09 апреля 2020 10:00

Немного исправил код. Так как есть места где массив не однообразный и каждая строка может отличаться
нужно бы еще желательно переделать на определение типов в колонке. Так как могут встречаться значения NULL или что то подобное. Обработка в 2 цикла. Если кто оптимизируюет то респект
А так как есть выкидываю

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

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


См. также

Преобразовать таблицу значений в массив

Преобразовать строку таблицы значений в структуру

ПреобразоватьТаблицуКонтактовВМассив (БСП)

ТаблицаЗначенийВМассив (БСП)

Функция преобразует Массив из структур в ТаблицуЗначений

Выгрузить Таблицу значений в массив структур (для передачи сервер - клиент)

МассивСтруктурВТаблицуЗначений

ТаблицаЗначенийВМассивСтруктур

Работа с универсальными коллекциями данных

Модератору