Как правильно посчитать количество записей в разрезе номенклатуры в запросе 1С?

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

При разработке отчетов или обработок на платформе 1С часто возникает задача: нужно не просто получить остатки или обороты по количественным ресурсам, а посчитать именно количество фактов (записей), которые соответствуют определенной Номенклатуре. Рассмотрим, как правильно построить такой запрос, чтобы избежать ошибок с дублированием данных и получить корректный результат.

Понимание проблемы агрегации данных

Частая ошибка при работе с агрегатными функциями — это попытка подсчитать количество, передавая в функцию КОЛИЧЕСТВО() конкретное поле (например, Номенклатура). В такой ситуации движок запросов 1С пытается проанализировать заполненность этого поля в рамках группы. Если вы группируете по Номенклатуре, логика запроса может привести к неожиданным результатам, таким как повторный вывод наименований или неверный подсчет.

Для универсального и точного подсчета количества строк в группе всегда используйте КОЛИЧЕСТВО(*). Звездочка указывает платформе, что нужно подсчитать общее количество записей в сгруппированном наборе данных, независимо от того, какие именно поля заполнены.

Реализация решения: Группировка по номенклатуре

Чтобы получить отчет, где каждой номенклатуре соответствует числовое значение (количество записей за период), выполним следующие шаги:

  1. Выберем поле Номенклатура из нашего источника данных.
  2. Применим агрегатную функцию КОЛИЧЕСТВО(*) для подсчета строк.
  3. Укажем обязательную конструкцию СГРУППИРОВАТЬ ПО, чтобы платформа свернула все записи с одинаковой номенклатурой в одну строку.

Рассмотрим пример кода для регистра накопления:


ВЫБРАТЬ
    Регистр.Номенклатура КАК Номенклатура,
    КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
    РегистрНакопления.ВашРегистр КАК Регистр
СГРУППИРОВАТЬ ПО
    Регистр.Номенклатура

Почему это работает лучше?

Когда вы используете КОЛИЧЕСТВО(*), вы исключаете влияние значений полей на результат подсчета. Это позволяет избежать конфликтов типов и лишних дублей, которые часто возникают при использовании конструкции РАЗЛИЧНЫЕ или при передаче поля в агрегатную функцию. Важно понимать, что в 1С СГРУППИРОВАТЬ ПО является ключевым инструментом для схлопывания детальных записей в итоговые строки.

Работа с периодом

Если данные находятся в регистре и вам нужно ограничить выборку по времени, рекомендуется использовать виртуальные таблицы. Это значительно повышает производительность системы.


ВЫБРАТЬ
    РегистрОбороты.Номенклатура КАК Номенклатура,
    КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
    РегистрНакопления.ВашРегистр.Обороты(&НачалоПериода, &КонецПериода) КАК РегистрОбороты
СГРУППИРОВАТЬ ПО
    РегистрОбороты.Номенклатура

Практические советы

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

← На главную