1С 8.3 Удаление дублирующих строк в Таблице значений - Программист 1С Минск. Автоматизация бизнеса.

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

1С 8.3 Удаление дублирующих строк в Таблице значений

Данные > Примеры кода 1С > 1С 8.3 Таблица значений
Перейти в раздел примеры кода 1С 8.3:
Данная функция принимает таблицу значений (с любой структурой), а возвращает обработанную таблицу с удаленными одинаковыми строками. В параметр КолонкиТЗ можно передать колонки (через запятую), по которым нужно выполнять проверку и удаление строк-дублей. Если параметр пустой, то метод сворачивает ТЗ по всем колонкам.
Удаление строк-дублей в Таблице значений в 1С 8.3:
Функция УдалениеДублирующихСтрокТЗ(ТЗ, КолонкиТЗ = "") Экспорт

   Если ПустаяСтрока(КолонкиТЗ) Тогда // свертка ТЗ по всем колонкам

       Для Каждого ТЗКолонка Из ТЗ.Колонки Цикл
           КолонкиТЗ = КолонкиТЗ + ?(ПустаяСтрока(КолонкиТЗ), "", ",") + ТЗКолонка.Имя;
       КонецЦикла;
       КопияТЗ = ТЗ.Скопировать();
       КопияТЗ.Свернуть(КолонкиТЗ);

   Иначе

       КолонкиЗапроса = "ТЗ." + СтрЗаменить(КолонкиТЗ, ",", ",ТЗ.");

       Запрос = Новый Запрос;
       Запрос.Текст = "ВЫБРАТЬ
                              |    " + КолонкиЗапроса + "
                              |ПОМЕСТИТЬ ВТ_ТЗ
                              |ИЗ
                              |    &ТЗ КАК ТЗ
                              |;
                              |
                              |//////////////////
                              |ВЫБРАТЬ РАЗЛИЧНЫЕ
                              |    " + СтрЗаменить(КолонкиЗапроса, "ТЗ.", "ВТ_ТЗ.") + "
                              |ИЗ
                              |    ВТ_ТЗ КАК ВТ_ТЗ
                              |";

       Запрос.УстановитьПараметр("ТЗ", ТЗ);
       РезультатЗапроса = Запрос.Выполнить();
       Если Не РезультатЗапроса.Пустой() Тогда
           ТаблицаЗапроса = РезультатЗапроса.Выгрузить();

           КопияТЗ = ТЗ.СкопироватьКолонки();
           Для Каждого СтрокаТЗ Из ТаблицаЗапроса Цикл
               ОтборСтруктура = Новый Структура(КолонкиТЗ);
               ЗаполнитьЗначенияСвойств(ОтборСтруктура, СтрокаТЗ);

               ОтборТЗ = ТЗ.НайтиСтроки(ОтборСтруктура);
               Для Каждого СтрокаОтбораТЗ Из ОтборТЗ Цикл

                   НоваяСтрокаТЗ = КопияТЗ.Добавить();
                   ЗаполнитьЗначенияСвойств(НоваяСтрокаТЗ, СтрокаОтбораТЗ);
                   Прервать;

               КонецЦикла;
           КонецЦикла;
       Иначе
           КопияТЗ = ТЗ;
       КонецЕсли;

   КонецЕсли;

   Возврат КопияТЗ;

КонецФункции // УдалитьДублиСтрокТаблицыЗначений()
Пример №1 использования и результат:
Процедура ПримерОбработкиТЗ1()

   ТЗ = Новый ТаблицаЗначений;

   // Добавляем колонки в таблицу значений
   КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
   НовСтрока = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);

   ТЗ.Колонки.Добавить("Животное", НовСтрока);
   ТЗ.Колонки.Добавить("Размер", НовСтрока);
   ТЗ.Колонки.Добавить("Цвет", НовСтрока);

   // Добавляем строки в таблицу значений
   Стр = ТЗ.Добавить();
   Стр.Животное = "Слон";
   Стр.Размер = "большой";
   Стр.Цвет = "зеленый";

   Стр = ТЗ.Добавить();
   Стр.Животное = "Слон";
   Стр.Размер = "маленький";
   Стр.Цвет = "желтый";

   Стр = ТЗ.Добавить();
   Стр.Животное = "Слон";
   Стр.Размер = "маленький";
   Стр.Цвет = "красный";

   Стр = ТЗ.Добавить();
   Стр.Животное = "Тигр";
   Стр.Размер = "здоровый";
   Стр.Цвет = "розовый";

   Стр = ТЗ.Добавить();
   Стр.Животное = "Тигр";
   Стр.Размер = "огромный";
   Стр.Цвет = "черный";

   Стр = ТЗ.Добавить();
   Стр.Животное = "Тигр";
   Стр.Размер = "здоровый";
   Стр.Цвет = "фиолетовый";

   УдалениеДублирующихСтрокТЗ(ТЗ, "Животное,Цвет");

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


Пример №2 использования и результат:
Процедура ПримерОбработкиТЗ2()

   ТЗ = Новый ТаблицаЗначений;

   // Добавляем колонки в таблицу значений
   КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
   НовСтрока = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);

   ТЗ.Колонки.Добавить("Животное", НовСтрока);
   ТЗ.Колонки.Добавить("Размер", НовСтрока);
   ТЗ.Колонки.Добавить("Цвет", НовСтрока);

   // Добавляем строки в таблицу значений
   Стр = ТЗ.Добавить();
   Стр.Животное = "Слон";
   Стр.Размер = "большой";
   Стр.Цвет = "зеленый";

   Стр = ТЗ.Добавить();
   Стр.Животное = "Слон";
   Стр.Размер = "маленький";
   Стр.Цвет = "желтый";

   Стр = ТЗ.Добавить();  //дубль
   Стр.Животное = "Слон";
   Стр.Размер = "маленький";
   Стр.Цвет = "желтый";

   Стр = ТЗ.Добавить();
   Стр.Животное = "Тигр";
   Стр.Размер = "здоровый";
   Стр.Цвет = "розовый";

   Стр = ТЗ.Добавить();
   Стр.Животное = "Тигр";
   Стр.Размер = "огромный";
   Стр.Цвет = "черный";

   Стр = ТЗ.Добавить(); //дубль
   Стр.Животное = "Тигр";
   Стр.Размер = "огромный";
   Стр.Цвет = "черный";

   УдалениеДублирующихСтрокТЗ(ТЗ, "Животное,Цвет");

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


Пример №3 использования и результат:
Процедура ПримерОбработкиТЗ3()

  ТЗ = Новый ТаблицаЗначений;

  // Добавляем колонки в таблицу значений
  КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
  НовСтрока = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);

  ТЗ.Колонки.Добавить("Животное", НовСтрока);
  ТЗ.Колонки.Добавить("Размер", НовСтрока);
  ТЗ.Колонки.Добавить("Цвет", НовСтрока);

  // Добавляем строки в таблицу значений
  Стр = ТЗ.Добавить();
  Стр.Животное = "Слон";
  Стр.Размер = "большой";
  Стр.Цвет = "зеленый";

  Стр = ТЗ.Добавить();
  Стр.Животное = "Слон";
  Стр.Размер = "маленький";
  Стр.Цвет = "желтый";

  Стр = ТЗ.Добавить();  //дубль
  Стр.Животное = "Слон";
  Стр.Размер = "маленький";
  Стр.Цвет = "желтый";

  Стр = ТЗ.Добавить();
  Стр.Животное = "Тигр";
  Стр.Размер = "здоровый";
  Стр.Цвет = "розовый";

  Стр = ТЗ.Добавить();
  Стр.Животное = "Тигр";
  Стр.Размер = "маленький";
  Стр.Цвет = "черный";

  Стр = ТЗ.Добавить(); //дубль т.к. размер не учитывается
  Стр.Животное = "Тигр";
  Стр.Размер = "огромный";
  Стр.Цвет = "черный";

  УдалениеДублирующихСтрокТЗ(ТЗ, "Животное,Цвет");

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


1
комментарий
Сергей
10 фев 2024
Не будет работать, если тип колонки в ТЗ строковый неограниченной длинны. Например комментарий в банковской выписке.
____________________
Copyright©, «Программист 1С в г.Минске», 11.10.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому