1С 8.3 Удаление дублирующих строк в Таблице значений
Данные > Примеры кода 1С > 1С 8.3 Таблица значений
Перейти в раздел примеры кода 1С 8.3:
Данная функция принимает таблицу значений (с любой структурой), а возвращает обработанную таблицу с удаленными одинаковыми строками. В параметр КолонкиТЗ можно передать колонки (через запятую), по которым нужно выполнять проверку и удаление строк-дублей. Если параметр пустой, то метод сворачивает ТЗ по всем колонкам.
Удаление строк-дублей в Таблице значений в 1С 8.3:
Функция УдалениеДублирующихСтрокТЗ(ТЗ, КолонкиТЗ = "") Экспорт
Если ПустаяСтрока(КолонкиТЗ) Тогда // свертка ТЗ по всем колонкам
Для Каждого ТЗКолонка Из ТЗ.Колонки Цикл
КолонкиТЗ = КолонкиТЗ + ?(ПустаяСтрока(КолонкиТЗ), "", ",") + ТЗКолонка.Имя;
КонецЦикла;
КопияТЗ = ТЗ.Скопировать();
КопияТЗ.Свернуть(КолонкиТЗ);
Иначе
КолонкиЗапроса = "ТЗ." + СтрЗаменить(КолонкиТЗ, ",", ",ТЗ.");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| " + КолонкиЗапроса + "
|ПОМЕСТИТЬ ВТ_ТЗ
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + СтрЗаменить(КолонкиЗапроса, "ТЗ.", "ВТ_ТЗ.") + "
|ИЗ
| ВТ_ТЗ КАК ВТ_ТЗ
|";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ТаблицаЗапроса = РезультатЗапроса.Выгрузить();
КопияТЗ = ТЗ.СкопироватьКолонки();
Для Каждого СтрокаТЗ Из ТаблицаЗапроса Цикл
ОтборСтруктура = Новый Структура(КолонкиТЗ);
ЗаполнитьЗначенияСвойств(ОтборСтруктура, СтрокаТЗ);
ОтборТЗ = ТЗ.НайтиСтроки(ОтборСтруктура);
Для Каждого СтрокаОтбораТЗ Из ОтборТЗ Цикл
НоваяСтрокаТЗ = КопияТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаТЗ, СтрокаОтбораТЗ);
Прервать;
КонецЦикла;
КонецЦикла;
Иначе
КопияТЗ = ТЗ;
КонецЕсли;
КонецЕсли;
Возврат КопияТЗ;
КонецФункции // УдалитьДублиСтрокТаблицыЗначений()
Если ПустаяСтрока(КолонкиТЗ) Тогда // свертка ТЗ по всем колонкам
Для Каждого ТЗКолонка Из ТЗ.Колонки Цикл
КолонкиТЗ = КолонкиТЗ + ?(ПустаяСтрока(КолонкиТЗ), "", ",") + ТЗКолонка.Имя;
КонецЦикла;
КопияТЗ = ТЗ.Скопировать();
КопияТЗ.Свернуть(КолонкиТЗ);
Иначе
КолонкиЗапроса = "ТЗ." + СтрЗаменить(КолонкиТЗ, ",", ",ТЗ.");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| " + КолонкиЗапроса + "
|ПОМЕСТИТЬ ВТ_ТЗ
|ИЗ
| &ТЗ КАК ТЗ
|;
|
|//////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + СтрЗаменить(КолонкиЗапроса, "ТЗ.", "ВТ_ТЗ.") + "
|ИЗ
| ВТ_ТЗ КАК ВТ_ТЗ
|";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ТаблицаЗапроса = РезультатЗапроса.Выгрузить();
КопияТЗ = ТЗ.СкопироватьКолонки();
Для Каждого СтрокаТЗ Из ТаблицаЗапроса Цикл
ОтборСтруктура = Новый Структура(КолонкиТЗ);
ЗаполнитьЗначенияСвойств(ОтборСтруктура, СтрокаТЗ);
ОтборТЗ = ТЗ.НайтиСтроки(ОтборСтруктура);
Для Каждого СтрокаОтбораТЗ Из ОтборТЗ Цикл
НоваяСтрокаТЗ = КопияТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаТЗ, СтрокаОтбораТЗ);
Прервать;
КонецЦикла;
КонецЦикла;
Иначе
КопияТЗ = ТЗ;
КонецЕсли;
КонецЕсли;
Возврат КопияТЗ;
КонецФункции // УдалитьДублиСтрокТаблицыЗначений()
Пример №1 использования и результат:
Процедура ПримерОбработкиТЗ1()
ТЗ = Новый ТаблицаЗначений;
// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
НовСтрока = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
ТЗ.Колонки.Добавить("Животное", НовСтрока);
ТЗ.Колонки.Добавить("Размер", НовСтрока);
ТЗ.Колонки.Добавить("Цвет", НовСтрока);
// Добавляем строки в таблицу значений
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "большой";
Стр.Цвет = "зеленый";
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "красный";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "здоровый";
Стр.Цвет = "розовый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "огромный";
Стр.Цвет = "черный";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "здоровый";
Стр.Цвет = "фиолетовый";
УдалениеДублирующихСтрокТЗ(ТЗ, "Животное,Цвет");
КонецПроцедуры
ТЗ = Новый ТаблицаЗначений;
// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
НовСтрока = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
ТЗ.Колонки.Добавить("Животное", НовСтрока);
ТЗ.Колонки.Добавить("Размер", НовСтрока);
ТЗ.Колонки.Добавить("Цвет", НовСтрока);
// Добавляем строки в таблицу значений
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "большой";
Стр.Цвет = "зеленый";
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "красный";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "здоровый";
Стр.Цвет = "розовый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "огромный";
Стр.Цвет = "черный";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "здоровый";
Стр.Цвет = "фиолетовый";
УдалениеДублирующихСтрокТЗ(ТЗ, "Животное,Цвет");
КонецПроцедуры
Пример №2 использования и результат:
Процедура ПримерОбработкиТЗ2()
ТЗ = Новый ТаблицаЗначений;
// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
НовСтрока = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
ТЗ.Колонки.Добавить("Животное", НовСтрока);
ТЗ.Колонки.Добавить("Размер", НовСтрока);
ТЗ.Колонки.Добавить("Цвет", НовСтрока);
// Добавляем строки в таблицу значений
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "большой";
Стр.Цвет = "зеленый";
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить(); //дубль
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "здоровый";
Стр.Цвет = "розовый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "огромный";
Стр.Цвет = "черный";
Стр = ТЗ.Добавить(); //дубль
Стр.Животное = "Тигр";
Стр.Размер = "огромный";
Стр.Цвет = "черный";
УдалениеДублирующихСтрокТЗ(ТЗ, "Животное,Цвет");
КонецПроцедуры
ТЗ = Новый ТаблицаЗначений;
// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
НовСтрока = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
ТЗ.Колонки.Добавить("Животное", НовСтрока);
ТЗ.Колонки.Добавить("Размер", НовСтрока);
ТЗ.Колонки.Добавить("Цвет", НовСтрока);
// Добавляем строки в таблицу значений
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "большой";
Стр.Цвет = "зеленый";
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить(); //дубль
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "здоровый";
Стр.Цвет = "розовый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "огромный";
Стр.Цвет = "черный";
Стр = ТЗ.Добавить(); //дубль
Стр.Животное = "Тигр";
Стр.Размер = "огромный";
Стр.Цвет = "черный";
УдалениеДублирующихСтрокТЗ(ТЗ, "Животное,Цвет");
КонецПроцедуры
Пример №3 использования и результат:
Процедура ПримерОбработкиТЗ3()
ТЗ = Новый ТаблицаЗначений;
// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
НовСтрока = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
ТЗ.Колонки.Добавить("Животное", НовСтрока);
ТЗ.Колонки.Добавить("Размер", НовСтрока);
ТЗ.Колонки.Добавить("Цвет", НовСтрока);
// Добавляем строки в таблицу значений
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "большой";
Стр.Цвет = "зеленый";
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить(); //дубль
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "здоровый";
Стр.Цвет = "розовый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "маленький";
Стр.Цвет = "черный";
Стр = ТЗ.Добавить(); //дубль т.к. размер не учитывается
Стр.Животное = "Тигр";
Стр.Размер = "огромный";
Стр.Цвет = "черный";
УдалениеДублирующихСтрокТЗ(ТЗ, "Животное,Цвет");
КонецПроцедуры
ТЗ = Новый ТаблицаЗначений;
// Добавляем колонки в таблицу значений
КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
НовСтрока = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);
ТЗ.Колонки.Добавить("Животное", НовСтрока);
ТЗ.Колонки.Добавить("Размер", НовСтрока);
ТЗ.Колонки.Добавить("Цвет", НовСтрока);
// Добавляем строки в таблицу значений
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "большой";
Стр.Цвет = "зеленый";
Стр = ТЗ.Добавить();
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить(); //дубль
Стр.Животное = "Слон";
Стр.Размер = "маленький";
Стр.Цвет = "желтый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "здоровый";
Стр.Цвет = "розовый";
Стр = ТЗ.Добавить();
Стр.Животное = "Тигр";
Стр.Размер = "маленький";
Стр.Цвет = "черный";
Стр = ТЗ.Добавить(); //дубль т.к. размер не учитывается
Стр.Животное = "Тигр";
Стр.Размер = "огромный";
Стр.Цвет = "черный";
УдалениеДублирующихСтрокТЗ(ТЗ, "Животное,Цвет");
КонецПроцедуры
1
комментарий
Сергей
10 фев 2024
Не будет работать, если тип колонки в ТЗ строковый неограниченной длинны. Например комментарий в банковской выписке.
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник