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

SeiOkami 622 5 16 20

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

// Находит колонки с произвольным типом и заменяет их на типизированные
// Источник: 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);

Стало:

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

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


См. также

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

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

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

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

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

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

Добавить или обновить колонку

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

Модератору