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