Типизировать Колонки
Теги: 1С,ТаблицаЗначений,ТЗ,Желтый Чайник 1С,Таблица значений,Таблица

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

# Код реализации

```1c
// Находит колонки с произвольным типом и заменяет их на типизированные
// Источник: 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
//
Процедура ИзменитьТипКолонки(Знач ТаблицаЗначений, Знач ИмяКолонки, Знач НовыйТип, Знач ЗначенияКолонки = Неопределено) Экспорт

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

	ВременноеНазвание = "Колонка_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");

	НоваяКолонка = ТаблицаЗначений.Колонки.Добавить(ВременноеНазвание,
		НовыйТип, СтараяКолонка.Заголовок, СтараяКолонка.Ширина);

	ТаблицаЗначений.ЗагрузитьКолонку(ЗначенияКолонки, НоваяКолонка);

	ТаблицаЗначений.Колонки.Удалить(ИмяКолонки);

	НоваяКолонка.Имя = ИмяКолонки;

КонецПроцедуры
```

# Примечания

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

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

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