Типизировать Колонки

SeiOkami 469 5 11 10

Находит колонки с произвольным типом и заменяет их на типизированные

// Находит колонки с произвольным типом и заменяет их на типизированные
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/34
// 
// Параметры:
//  ТаблицаЗначений	 - ТаблицаЗначений - Таблица, колонки которой необходимо типизировать
//  
// Пример:
// 	ТЗ = Новый ТаблицаЗначений;
// 	ТЗ.Колонки.Добавить("К1");
// 	ТЗ.Добавить().К1 = 1;
// 	ТЗ.Добавить().К1 = 2;
// 	ТипизироватьКолонки(ТЗ);
// 	Сообщить(ТЗ.Колонки.К1.ТипЗначения); //Число
//  
Процедура ТипизироватьКолонки(Знач ТаблицаЗначений) Экспорт
	
	//Определяем колонки с произвольным типом
	ОбрабатываемыеКолонки = Новый Массив; // Массив из КолонкаТаблицыЗначений
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		Если Колонка.ТипЗначения.Типы().Количество() = 0 Тогда
			ОбрабатываемыеКолонки.Добавить(Колонка);
		КонецЕсли;
	КонецЦикла;
	
	КоличествоОбрабатываемыхКолонок = ОбрабатываемыеКолонки.Количество();
	Если КоличествоОбрабатываемыхКолонок = 0 Тогда
		Возврат;
	КонецЕсли;
	
	//Сохраняем содержащиеся в колонках значения и запоминаем их типы
	ЗначенияСтрокКолонок = Новый Массив(КоличествоОбрабатываемыхКолонок); // Массив из Массив
	ТипыЗначенийКолонок = Новый Массив(КоличествоОбрабатываемыхКолонок); // Массив из Массив
	Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
		
		Для Индекс = 0 По КоличествоОбрабатываемыхКолонок - 1 Цикл
			
			Колонка = ОбрабатываемыеКолонки[Индекс];
			ТипыЗначений = ТипыЗначенийКолонок[Индекс]; // Массив из Тип
			Если ТипыЗначений = Неопределено Тогда
				ТипыЗначений = Новый Массив;
				ТипыЗначенийКолонок[Индекс] = ТипыЗначений;
			КонецЕсли;
			
			ЗначенияКолонки = ЗначенияСтрокКолонок[Индекс]; // Массив из Неопределено
			Если ЗначенияКолонки = Неопределено Тогда
				ЗначенияКолонки = Новый Массив;
				ЗначенияСтрокКолонок[Индекс] = ЗначенияКолонки;
			КонецЕсли;
			
			ТекущееЗначение = СтрокаТаблицы[Колонка.Имя]; // Произвольный
			
			ЗначенияКолонки.Добавить(ТекущееЗначение);			
			
			ТипЗначения = ТипЗнч(СтрокаТаблицы[Колонка.Имя]);
			Если ТипыЗначений.Найти(ТипЗначения) = Неопределено Тогда
				ТипыЗначений.Добавить(ТипЗначения);
			КонецЕсли;
				
		КонецЦикла;
		
	КонецЦикла;
	
	//Типизируем колонки
	Для Индекс = 0 По КоличествоОбрабатываемыхКолонок - 1 Цикл
			
		ИмяКолонки = ОбрабатываемыеКолонки[Индекс].Имя;
		
		ИзменитьТипКолонки(ТаблицаЗначений, ИмяКолонки, 
			Новый ОписаниеТипов(ТипыЗначенийКолонок[Индекс]), ЗначенияСтрокКолонок[Индекс]);
		
	КонецЦикла;
	
КонецПроцедуры

// Изменить тип колонки.
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/34
//  
// Параметры:
//  ТаблицаЗначений - ТаблицаЗначений - Таблица значений
//  ИмяКолонки - Строка - Имя колонки
//  НовыйТип - ОписаниеТипов - Новый тип
//  ЗначенияКолонки - Массив из Неопределено - Значения колонки
//
// Пример:
//  ТЗ = Новый ТаблицаЗначений;
//  ТЗ.Колонки.Добавить("К1");
//  ТЗ.Добавить().К1 = "2";
//  ТЗ.Добавить().К1 = "тест";
//  ТЗ.Добавить().К1 = 2;
//
//	ИзменитьТипКолонки(ТЗ, "К1", Новый ОписаниеТипов("Число"));
//
//	//Значения К1 в ТЗ: 2, 0, 2
//	
Процедура ИзменитьТипКолонки(Знач ТаблицаЗначений, Знач ИмяКолонки, Знач НовыйТип, Знач ЗначенияКолонки = Неопределено) Экспорт
	
	СтараяКолонка = ТаблицаЗначений.Колонки.Найти(ИмяКолонки);
	Если ЗначенияКолонки = Неопределено Тогда
		ЗначенияКолонки = ТаблицаЗначений.ВыгрузитьКолонку(СтараяКолонка)
	КонецЕсли;
	
	ВременноеНазвание = "Колонка_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
	
	НоваяКолонка = ТаблицаЗначений.Колонки.Добавить(ВременноеНазвание, 
		НовыйТип, СтараяКолонка.Заголовок, СтараяКолонка.Ширина);
	
	ТаблицаЗначений.ЗагрузитьКолонку(ЗначенияКолонки, НоваяКолонка);
	
	ТаблицаЗначений.Колонки.Удалить(ИмяКолонки);
	
	НоваяКолонка.Имя = ИмяКолонки;
	
КонецПроцедуры
1

Комментарии

akop4
#1, ред. 14 сентября 2021 12:08

Опечатка у вас:
Было:

ОписаниеКолонки.Значения = ТаблицаЗначений.ВыгрузитьКолонку(0);

Стало:

ОписаниеКолонки.Значения = ТаблицаЗначений.ВыгрузитьКолонку(Колонка.Имя);

Если так оставить, потом во всех колонках будут значения из первой колонки


См. также

Типизированная таблица значений

ТелоСодержитТипизированноеСообщение (БСП)

КолонкиДляЗагрузкиДанных (БСП)

КолонкиИмеютГруппировку (БСП)

КолонкаМакета (БСП)

УдалитьКолонкуМакета (БСП)

Проверить наличие колонки в таблице значений, когда нет доступа к самой таблице и методу Найти у коллекции Колонки

ВыгрузитьКолонку (БСП)

Модератору