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