Программирование 1С 8.х для начинающих
- Вы здесь:
- Запрос. Объединить. Без дубликатов
Общие вопросы
Запрос. Объединить. Без дубликатов
- Печать
В запросах есть возможность сворачивать итоговые результаты запросов. Для этого при объединении запросов нужно писать не «Объединить ВСЕ», а просто «Объединить». В конструкторе запросов для этого есть флажок «Без дубликатов»
После слова «Объединить» все таблицы запросов сверху включая таблицу которая идет после этого ключевого слова будут свернуты. В конструкторе это все таблицы сверху включая ту напротив которой стоит флажок.
Посмотрим на примере как это работает.
Будем использовать простой запрос к справочнику Валюты выбирая 2 поля: Ссылка и код.
Сделаем объединение таблицы Валюты 3 раза.
У нас получится результат 9 строк, т.к. в моей базе в справочнике Валюты 3 элемента. Т.е. Запрос выбрал 3 раза все элементы и объединил их ВСЕ, как указано в тексте запроса.
Если мы заменим объединение первых двух запросов на «без дубликатов»
то итогом будет 6 строк, т.к. после получения результата первых запросов программа убрала дубликаты и потом объединила с результатом 3 запроса
Если же заменить объединение последних запросов на «Без дубликатов», то программа уберет дубликаты среди всех результатов запросов
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 Ссылка ИЗ Справочник.Номенклатура как спр где спр.Наименование = Номенклатура.Наименование Упорядочить по Наименование убыв)
И Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)
//Упорядочить по Наименование ИЕРАРХИЯ
;
Выбрать Количество(*) из ВТ_Номенклатура
Так вот количество записей во втором случае получается менее чем в первом.