Перейти к содержимому

Как убрать дубли в запросе 1с

  • автор:

Программирование 1С 8.х для начинающих

  • Вы здесь:  
  • Запрос. Объединить. Без дубликатов

Общие вопросы

Запрос. Объединить. Без дубликатов

  •  Печать 
  • E-mail

В запросах есть возможность сворачивать итоговые результаты запросов. Для этого при объединении запросов нужно писать не «Объединить ВСЕ», а просто «Объединить». В конструкторе запросов для этого есть флажок «Без дубликатов»

Запрос 1с без дубликатов

После слова «Объединить» все таблицы запросов сверху включая таблицу которая идет после этого ключевого слова будут свернуты. В конструкторе это все таблицы сверху включая ту напротив которой стоит флажок.

Посмотрим на примере как это работает.

Будем использовать простой запрос к справочнику Валюты выбирая 2 поля: Ссылка и код.

Сделаем объединение таблицы Валюты 3 раза.

У нас получится результат 9 строк, т.к. в моей базе в справочнике Валюты 3 элемента. Т.е. Запрос выбрал 3 раза все элементы и объединил их ВСЕ, как указано в тексте запроса.

Запрос. Объединить все

Если мы заменим объединение первых двух запросов на «без дубликатов»

то итогом будет 6 строк, т.к. после получения результата первых запросов программа убрала дубликаты и потом объединила с результатом 3 запроса

Запрос.Свертка1

Если же заменить объединение последних запросов на «Без дубликатов», то программа уберет дубликаты среди всех результатов запросов

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

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

Функция УдалениеДублирующихСтрокТЗ ( ТЗ , КолонкиТЗ = «» ) Экспорт

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как убрать дубли в запросе 1с

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

  • Как запросить все строки со значениями всех столбцов из таблицы
  • Как запросить все строки со значениями определенных столбцов
  • Как использовать в запросах псевдонимы для столбцов и таблиц
  • Как добавить в результат запроса столбец с определенным значением
  • Как убрать дубликаты из результата запроса
  • Как ограничить количество строк в результате запроса
  • Как отобрать из таблицы только те строки, на чтение которых у пользователя есть права
  • Скачать и выполнить эти примеры на компьютере

Основы запросов в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Владимир Милькин

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Как избавиться от дублей в запросе?

Имеем справочник из которого необходимо выбрать все элементы без дублей. Критерием дублей будем считать наименование элементов. В результате запроса надо получить два поля наименование и ссылку на элемент справочника.
Например содержимое справочника может быть:
Иванов Ссылка01
Петров Ссылка02
петров Ссылка03
сидоров Ссылка04
сидоров Ссылка05
В результате запроса хотим получить:
Иванов Ссылка01
Петров Ссылка02
Сидоров Ссылка04
Проблема в том, что запрос

Выбрать Наименование
ИЗ Справочник.Сотрудники
Сгруппировать по Наименование
Имеющие Количество (*) > 1

вернет три записи но без ссылки на сами элементы.
Проблема в том что Поле Ссылка уникально в пределах справочника и
при включении поля в состав выбираемых полей возвращаются все записи.

Выбрать Наименование, МИНИМУМ(Ссылка)
ИЗ Справочник.Сотрудники
Сгруппировать по Наименование

какой вопрос, такой ответ

(11) благодарю за развитие мысли.
В итоге получилось два решения результаты которых почему-то отличаются. Быть может у кого будут идеи?
Вариант1:
ВЫБРАТЬ Ссылка, Наименование
ПОМЕСТИТЬ ВТ_Номенклатура
ИЗ
Справочник.Номенклатура
ГДЕ
Ссылка в ИЕРАРХИИ (&ГруппаНоменклатуры)
;
ВЫБРАТЬ Наименование
ПОМЕСТИТЬ ВТ_ДублиНаименований
ИЗ
ВТ_Номенклатура
СГРУППИРОВАТЬ ПО Наименование
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1
;
ВЫБРАТЬ МАКСИМУМ(Ссылка)
ПОМЕСТИТЬ ВТ_СсылкиБезДублей
ИЗ ВТ_Номенклатура
СГРУППИРОВАТЬ ПО Наименование
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1
;
ВЫБРАТЬ Ссылка
ПОМЕСТИТЬ ВТ_РЕЗУЛЬТАТ
ИЗ ВТ_Номенклатура
ГДЕ НЕ Наименование В (ВЫБРАТЬ * ИЗ ВТ_ДублиНаименований)
ОБЪЕДИНИТЬ
ВЫБРАТЬ *
ИЗ ВТ_СсылкиБезДублей
;
ВЫБРАТЬ Количество(*) из ВТ_РЕЗУЛЬТАТ

Вариант2:
Выбрать Ссылка
Поместить ВТ_Номенклатура
ИЗ Справочник.Номенклатура как Номенклатура
ГДЕ Ссылка В (Выбрать первые 1 Ссылка ИЗ Справочник.Номенклатура как спр где спр.Наименование = Номенклатура.Наименование Упорядочить по Наименование убыв)
И Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)
//Упорядочить по Наименование ИЕРАРХИЯ
;
Выбрать Количество(*) из ВТ_Номенклатура

Так вот количество записей во втором случае получается менее чем в первом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *