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

SeiOkami 398 5 8 6

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

Источник: https://t.me/JuniorOneS

// Процедура находит колонки с произвольным типом и заменяет их на типизированные
//
// Параметры:
//  ТаблицаЗначений	 - ТаблицаЗначений - Таблица, колонки которой необходимо типизировать
//
Процедура ТипизироватьКолонки(ТаблицаЗначений) Экспорт
	
	ТипизируемыеКолонки = Новый Массив;
	
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		
		Если ЗначениеЗаполнено(Колонка.ТипЗначения.Типы()) Тогда
			Продолжить;
		КонецЕсли;
		
		ОписаниеКолонки = Новый Структура("Имя,Заголовок,Типы,Ширина,Значения");
		ЗаполнитьЗначенияСвойств(ОписаниеКолонки, Колонка);
		
		ОписаниеКолонки.Типы     = Новый Массив;
		ОписаниеКолонки.Значения = ТаблицаЗначений.ВыгрузитьКолонку(Колонка.Имя);
		
		Для Каждого ТекущееЗначение Из ОписаниеКолонки.Значения Цикл
			ТипЗначения = ТипЗнч(ТекущееЗначение);
			Если ОписаниеКолонки.Типы.Найти(ТипЗначения) = Неопределено Тогда
				ОписаниеКолонки.Типы.Добавить(ТипЗначения);
			КонецЕсли;
		КонецЦикла;
		
		ТипизируемыеКолонки.Добавить(ОписаниеКолонки);
		
	КонецЦикла;
	
	Для Каждого ОписаниеКолонки Из ТипизируемыеКолонки Цикл
		
		ТипыКолонки  = ОписаниеКолонки.Типы;
		//"Нюанс" платформы. Невозможно создать описание типов с Неопределено. Для 1С это будет как "Произвольный"
		Если ТипыКолонки.Количество() = 1 И ТипыКолонки[0] = Тип("Неопределено") Тогда
			ТипыКолонки.Добавить(Тип("Null"));
			ТипыКолонки.Добавить(Тип("Булево"));
		КонецЕсли;
		
		ОписаниеТипа = Новый ОписаниеТипов(ОписаниеКолонки.Типы);
		
		ВременноеИмя = "Колонка" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
		
		НоваяКолонка = ТаблицаЗначений.Колонки.Добавить(ВременноеИмя, 
		ОписаниеТипа, ОписаниеКолонки.Заголовок, ОписаниеКолонки.Ширина);
		
		ТаблицаЗначений.ЗагрузитьКолонку(ОписаниеКолонки.Значения, НоваяКолонка);
		
		ТаблицаЗначений.Колонки.Удалить(ОписаниеКолонки.Имя);
		
		НоваяКолонка.Имя = ОписаниеКолонки.Имя;
		
	КонецЦикла;
	
КонецПроцедуры
1

Комментарии

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

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

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

Стало:

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

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


См. также

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

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

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

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

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

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

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

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

Модератору