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