Часто в процессе разработки на платформе 1С возникает задача отобрать данные, основываясь на уникальности значений в конкретной колонке. Например, нам нужно получить только те товары, цена которых является неповторимой во всем справочнике. Давайте разберем, как реализовать такую задачу максимально эффективно, используя возможности языка запросов 1С.
Самый простой и наглядный способ решения данной задачи — использование вложенного запроса в условии ГДЕ. Суть метода заключается в том, чтобы сначала выявить «проблемные» значения (те, которые дублируются), а затем исключить их из основной выборки.
Давайте выполним задачу по шагам:
Цена и применим условие ИМЕЮЩИЕ с функцией КОЛИЧЕСТВО.НЕ В, отсеем все записи из исходной таблицы, цена которых попала в список дублей.Посмотрим, как это выглядит в коде:
ВЫБРАТЬ
ТвояТаблица.Наименование КАК Наименование,
ТвояТаблица.Цена КАК Цена
ИЗ
Справочник.Номенклатура КАК ТвояТаблица
ГДЕ
НЕ ТвояТаблица.Цена В (
ВЫБРАТЬ
ВТ.Цена
ИЗ
Справочник.Номенклатура КАК ВТ
СГРУППИРОВАТЬ ПО
ВТ.Цена
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ.Наименование) > 1
)
В данном примере мы используем КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Наименование), чтобы убедиться, что мы считаем именно уникальные элементы справочника, а не просто записи в базе данных, что делает код более надежным.
Если ваша таблица содержит тысячи или миллионы записей, использование вложенных запросов в условии ГДЕ может привести к снижению производительности, так как СУБД будет выполнять внутренний запрос для каждой строки. В таких случаях лучше использовать временные таблицы.
Разберем алгоритм работы с временными таблицами:
ПОМЕСТИТЬ.Цена). Это позволит оптимизатору запросов работать значительно быстрее.ЛЕВОЕ СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ, выбирая только те записи, где количество вхождений равно единице.Преимущество этого подхода заключается в том, что временная таблица материализуется в базе данных, и СУБД может построить более эффективный план выполнения запроса.
При написании подобных запросов всегда учитывайте специфику ваших данных:
КОЛИЧЕСТВО(*) и КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...). Если в справочнике возможны дубли имен, использование РАЗЛИЧНЫЕ поможет получить корректный результат.СГРУППИРОВАТЬ ПО.Надеемся, что этот разбор помог вам разобраться в логике поиска уникальных значений. Теперь вы знаете как минимум два способа решения этой задачи и понимаете, когда какой из них лучше применить!