1С 8.3 Типизация колонок Таблицы Значений - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Типизация колонок Таблицы Значений

Данные > Примеры кода 1С > 1С 8.3 Таблица значений
Перейти в раздел примеры кода 1С 8.3:
Пример №1: Типизация колонок Таблицы значений в 1С 8.3:
Функция Типизация_колонок_ТЗ(ТЗ) Экспорт
  // Как типизировать колонку таблицы значений в 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.
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 21.05.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому