Находит колонки с произвольным типом и заменяет их на типизированные
// Находит колонки с произвольным типом и заменяет их на типизированные
// Источник: 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, ред. 14 сентября 2021 12:08
Опечатка у вас:
Было:
Стало:
Если так оставить, потом во всех колонках будут значения из первой колонки