Как с помощью запроса 1С получить записи с уникальными значениями определенного поля?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе разработки на платформе 1С возникает задача отобрать данные, основываясь на уникальности значений в конкретной колонке. Например, нам нужно получить только те товары, цена которых является неповторимой во всем справочнике. Давайте разберем, как реализовать такую задачу максимально эффективно, используя возможности языка запросов 1С.

Решение задачи через вложенный запрос

Самый простой и наглядный способ решения данной задачи — использование вложенного запроса в условии ГДЕ. Суть метода заключается в том, чтобы сначала выявить «проблемные» значения (те, которые дублируются), а затем исключить их из основной выборки.

Давайте выполним задачу по шагам:

  1. Сначала сформируем запрос, который найдет все цены, встречающиеся более одного раза. Для этого мы сгруппируем данные по полю Цена и применим условие ИМЕЮЩИЕ с функцией КОЛИЧЕСТВО.
  2. Затем, используя конструкцию НЕ В, отсеем все записи из исходной таблицы, цена которых попала в список дублей.

Посмотрим, как это выглядит в коде:


ВЫБРАТЬ
    ТвояТаблица.Наименование КАК Наименование,
    ТвояТаблица.Цена КАК Цена
ИЗ
    Справочник.Номенклатура КАК ТвояТаблица
ГДЕ
    НЕ ТвояТаблица.Цена В (
        ВЫБРАТЬ
            ВТ.Цена
        ИЗ
            Справочник.Номенклатура КАК ВТ
        СГРУППИРОВАТЬ ПО
            ВТ.Цена
        ИМЕЮЩИЕ
            КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ.Наименование) > 1
    )

В данном примере мы используем КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Наименование), чтобы убедиться, что мы считаем именно уникальные элементы справочника, а не просто записи в базе данных, что делает код более надежным.

Оптимизация запроса с помощью временных таблиц

Если ваша таблица содержит тысячи или миллионы записей, использование вложенных запросов в условии ГДЕ может привести к снижению производительности, так как СУБД будет выполнять внутренний запрос для каждой строки. В таких случаях лучше использовать временные таблицы.

Разберем алгоритм работы с временными таблицами:

  1. Создание таблицы: Первым делом мы выгружаем агрегированные данные во временную таблицу. Для этого используем инструкцию ПОМЕСТИТЬ.
  2. Индексация: Если данных очень много, обязательно добавьте индекс по полю, которое участвует в соединении (в нашем случае это Цена). Это позволит оптимизатору запросов работать значительно быстрее.
  3. Соединение: После создания временной таблицы мы выполняем основной запрос, соединяя его с нашей временной структурой через ЛЕВОЕ СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ, выбирая только те записи, где количество вхождений равно единице.

Преимущество этого подхода заключается в том, что временная таблица материализуется в базе данных, и СУБД может построить более эффективный план выполнения запроса.

Важные рекомендации при работе с запросами

При написании подобных запросов всегда учитывайте специфику ваших данных:

Надеемся, что этот разбор помог вам разобраться в логике поиска уникальных значений. Теперь вы знаете как минимум два способа решения этой задачи и понимаете, когда какой из них лучше применить!

← На главную