1С 8.3 Типизация колонок Таблицы Значений
Данные > Примеры кода 1С > 1С 8.3 Таблица значений
Перейти в раздел примеры кода 1С 8.3:
Пример №1: Типизация колонок Таблицы значений в 1С 8.3:
Функция Типизация_колонок_ТЗ(ТЗ) Экспорт
// Как типизировать колонку таблицы значений в 1С 8.3?
// Функция обходит колонки Таблицы Значений,
// а те колонки у которых тип: "Произвольный",
// меняет на типизированные
МассивКолонок = Новый Массив;
Для Каждого ТекКолонка Из ТЗ.Колонки Цикл
Если ЗначениеЗаполнено(ТекКолонка.ТипЗначения.Типы()) Тогда // тип есть, в обработке не нуждается
Продолжить;
КонецЕсли;
ОписаниеТЗ = Новый Структура("Имя,Заголовок,Типы,Ширина,Значения");
ЗаполнитьЗначенияСвойств(ОписаниеТЗ, ТекКолонка);
ОписаниеТЗ.Типы = Новый Массив;
ОписаниеТЗ.Значения = ТЗ.ВыгрузитьКолонку(0);
Для Каждого ТекущееЗначение Из ОписаниеТЗ.Значения Цикл
ТипЗначения = ТипЗнч(ТекущееЗначение);
Если ОписаниеТЗ.Типы.Найти(ТипЗначения) = Неопределено Тогда
ОписаниеТЗ.Типы.Добавить(ТипЗначения);
КонецЕсли;
КонецЦикла;
МассивКолонок.Добавить(ОписаниеТЗ);
КонецЦикла;
Для Каждого ОписаниеТЗ Из МассивКолонок Цикл
ТипыКолонкиТЗ = ОписаниеТЗ.Типы;
// создаем с произвольным типом, так как невозможно создать колонку с типом "Неопределено"
Если ТипыКолонкиТЗ.Количество() = 1 И ТипыКолонкиТЗ[0] = Тип("Неопределено") Тогда
ТипыКолонкиТЗ.Добавить(Тип("Null"));
ТипыКолонкиТЗ.Добавить(Тип("Булево"));
КонецЕсли;
ИмяТемп = "Колонка" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
ОписаниеТипа = Новый ОписаниеТипов(ОписаниеТЗ.Типы);
НоваяКолонкаТЗ = ТЗ.Колонки.Добавить(ИмяТемп, ОписаниеТипа, ОписаниеТЗ.Заголовок, ОписаниеТЗ.Ширина);
ТЗ.ЗагрузитьКолонку(ОписаниеТЗ.Значения, НоваяКолонкаТЗ);
ТЗ.Колонки.Удалить(ОписаниеТЗ.Имя);
НоваяКолонкаТЗ.Имя = ОписаниеТЗ.Имя;
КонецЦикла;
Возврат ТЗ;
КонецФункции
// Как типизировать колонку таблицы значений в 1С 8.3?
// Функция обходит колонки Таблицы Значений,
// а те колонки у которых тип: "Произвольный",
// меняет на типизированные
МассивКолонок = Новый Массив;
Для Каждого ТекКолонка Из ТЗ.Колонки Цикл
Если ЗначениеЗаполнено(ТекКолонка.ТипЗначения.Типы()) Тогда // тип есть, в обработке не нуждается
Продолжить;
КонецЕсли;
ОписаниеТЗ = Новый Структура("Имя,Заголовок,Типы,Ширина,Значения");
ЗаполнитьЗначенияСвойств(ОписаниеТЗ, ТекКолонка);
ОписаниеТЗ.Типы = Новый Массив;
ОписаниеТЗ.Значения = ТЗ.ВыгрузитьКолонку(0);
Для Каждого ТекущееЗначение Из ОписаниеТЗ.Значения Цикл
ТипЗначения = ТипЗнч(ТекущееЗначение);
Если ОписаниеТЗ.Типы.Найти(ТипЗначения) = Неопределено Тогда
ОписаниеТЗ.Типы.Добавить(ТипЗначения);
КонецЕсли;
КонецЦикла;
МассивКолонок.Добавить(ОписаниеТЗ);
КонецЦикла;
Для Каждого ОписаниеТЗ Из МассивКолонок Цикл
ТипыКолонкиТЗ = ОписаниеТЗ.Типы;
// создаем с произвольным типом, так как невозможно создать колонку с типом "Неопределено"
Если ТипыКолонкиТЗ.Количество() = 1 И ТипыКолонкиТЗ[0] = Тип("Неопределено") Тогда
ТипыКолонкиТЗ.Добавить(Тип("Null"));
ТипыКолонкиТЗ.Добавить(Тип("Булево"));
КонецЕсли;
ИмяТемп = "Колонка" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
ОписаниеТипа = Новый ОписаниеТипов(ОписаниеТЗ.Типы);
НоваяКолонкаТЗ = ТЗ.Колонки.Добавить(ИмяТемп, ОписаниеТипа, ОписаниеТЗ.Заголовок, ОписаниеТЗ.Ширина);
ТЗ.ЗагрузитьКолонку(ОписаниеТЗ.Значения, НоваяКолонкаТЗ);
ТЗ.Колонки.Удалить(ОписаниеТЗ.Имя);
НоваяКолонкаТЗ.Имя = ОписаниеТЗ.Имя;
КонецЦикла;
Возврат ТЗ;
КонецФункции
Пример №2: Типизация колонок Таблицы значений в 1С 8.3:
// Находит колонки с произвольным типом и заменяет их на типизированные
// Источник: 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
//
Процедура ИзменитьТипКолонки(Знач ТаблицаЗначений, Знач ИмяКолонки, Знач НовыйТип, Знач ЗначенияКолонки = Неопределено) Экспорт
СтараяКолонка = ТаблицаЗначений.Колонки.Найти(ИмяКолонки);
Если ЗначенияКолонки = Неопределено Тогда
ЗначенияКолонки = ТаблицаЗначений.ВыгрузитьКолонку(СтараяКолонка)
КонецЕсли;
ВременноеНазвание = "Колонка_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
НоваяКолонка = ТаблицаЗначений.Колонки.Добавить(ВременноеНазвание,
НовыйТип, СтараяКолонка.Заголовок, СтараяКолонка.Ширина);
ТаблицаЗначений.ЗагрузитьКолонку(ЗначенияКолонки, НоваяКолонка);
ТаблицаЗначений.Колонки.Удалить(ИмяКолонки);
НоваяКолонка.Имя = ИмяКолонки;
КонецПроцедуры
// MIT License
// Copyright (c) 2024 SeiOkami
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
// Источник: 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
//
Процедура ИзменитьТипКолонки(Знач ТаблицаЗначений, Знач ИмяКолонки, Знач НовыйТип, Знач ЗначенияКолонки = Неопределено) Экспорт
СтараяКолонка = ТаблицаЗначений.Колонки.Найти(ИмяКолонки);
Если ЗначенияКолонки = Неопределено Тогда
ЗначенияКолонки = ТаблицаЗначений.ВыгрузитьКолонку(СтараяКолонка)
КонецЕсли;
ВременноеНазвание = "Колонка_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
НоваяКолонка = ТаблицаЗначений.Колонки.Добавить(ВременноеНазвание,
НовыйТип, СтараяКолонка.Заголовок, СтараяКолонка.Ширина);
ТаблицаЗначений.ЗагрузитьКолонку(ЗначенияКолонки, НоваяКолонка);
ТаблицаЗначений.Колонки.Удалить(ИмяКолонки);
НоваяКолонка.Имя = ИмяКолонки;
КонецПроцедуры
// MIT License
// Copyright (c) 2024 SeiOkami
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник