В современных информационных системах часто возникает необходимость узнать, сколько записей возвращает запрос к определённой части данных (табличной части документа, справочника, регистра и т.п.). Эта информация нужна для:
- оценки нагрузки на систему;
- построения отчётов и панелей мониторинга;
- оптимизации производительности (кеширование, пагинация);
- принятия решений о необходимости агрегирования данных.
В данной статье мы подробно рассмотрим, как определить количество записей, возвращаемых запросом к «части» данных, на примерах платформы 1С:Предприятие 8 и популярных СУБД (PostgreSQL, Oracle, MS SQL Server).
Что понимается под «запрос в часть»?
Под «частью» обычно подразумевается:
- табличная часть документа (например, Товары в документе РеализацияТоваровУслуг);
- регистр накопления/бухгалтерии с измерениями и ресурсами;
- справочник с иерархией или дополнительными реквизитами;
- любая выборка, ограниченная условиями (WHERE) и/или группировкой (GROUP BY).
Запрос к такой части может возвращать как отдельные строки, так и агрегированные результаты (суммы, средние, количество). Наша задача – выяснить, сколько строк (или групп) попадает в результат без избыточного переноса всех данных в клиентское приложение.
Подсчёт количества записей в 1С:Предприятие
Язык запросов 1С
В 1С существует собственный язык запросов, который позволяет выполнять выборки из таблиц, регистров и справочников. Для подсчёта количества записей используется агрегатная функция КОЛИЧЕСТВО.
Пример: количество строк в табличной части документа
ВЫБРАТЬ Документ.Ссылка КАК Документ, КОЛИЧЕСТВО(Документ.Товары.НомерСтроки) КАК КолвоТоваров ИЗ Документ.РеализацияТоваровУслуг КАК Документ ГДЕ Документ.Дата = &Дата СГРУППИРОВАТЬ ПО Документ.Ссылка
В этом запросе:
- Мы выбираем каждый документ РеализацияТоваровУслуг за указанную дату;
- Функция КОЛИЧЕСТВО считает количество строк в табличной части Товары;
- Результат – набор пар «документ – количество его товарных строк».
Подсчёт без группировки (общее количество)
Если нужно узнать общее количество строк во всех документах за период, достаточно убрать измерения из ГРУППИРОВАТЬ ПО:
ВЫБРАТЬ КОЛИЧЕСТВО(Документ.Товары.НомерСтроки) КАК ОбщееКолвоТоваров ИЗ Документ.РеализацияТоваровУслуг КАК Документ ГДЕ Документ.Дата Между &ДатаНачало И &ДатаКонец
Использование временных таблиц для сложных расчётов
Когда требуется сначала отфильтровать данные, а потом посчитать количество, удобно воспользоваться временной таблицей:
ВЫБРАТЬ Товар.Ссылка КАК Товар, Товар.Количество КАК Колво ПОМЕСТИТЬ ВТ_Товары ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товар ГДЕ Товар.Количество > 0 ВЫБРАТЬ КОЛИЧЕСТВО КАК КолвоПоложительныхСтрок ИЗ ВТ_Товары
Такой подход позволяет избежать повторного вычисления сложных условий и улучшает читаемость кода.
Подсчёт количества записей в SQL‑базах данных
Принцип подсчёта одинаков для большинства СУБД: используется функция COUNT. Ниже приведены примеры для трёх популярных систем.
PostgreSQL
-- Количество строк в табличной части (предположим, есть отдельная таблица order_items) SELECT COUNT() AS cnt FROM order_items WHERE order_id IN ( SELECT id FROM orders WHERE order_date = CURRENT_DATE );
Для получения количества по каждому заказу:
SELECT o.id AS order_id, COUNT(oi.) AS items_cnt FROM orders o LEFT JOIN order_items oi ON oi.order_id = o.id WHERE o.order_date = CURRENT_DATE GROUP BY o.id;
Oracle
SELECT COUNT() AS cnt FROM order_items oi JOIN orders o ON oi.order_id = o.id WHERE o.order_date = TRUNC(SYSDATE);
MS SQL Server
SELECT COUNT_BIG() AS cnt -- COUNT_BIG возвращает bigint, удобно для больших объёмов FROM order_items oi JOIN orders o ON oi.order_id = o.id WHERE o.order_date = CAST(GETDATE AS date);
Во всех примерах ключевой момент – использование COUNT(*) (или COUNT(поле)) в сочетании с необходимыми условиями фильтрации и группировки.
Оптимизация и кэширование запросов на подсчёт
Частый подсчёт большого количества записей может стать узким местом. Рассмотрим несколько приёмов повышения производительности.
Индексы по условиям фильтрации
Создайте индекс по полям, участвующим в WHERE (например, order_date, document_id). Это позволит СУБД быстро отобрать нужные строки перед подсчётом.
Материализованные представления / агрегатные таблицы
Если запрос на подсчёт выполняется очень часто (например, дашборд с количеством заказов за день), целесообразно создать материализованное представление, которое обновляется по расписанию или по триггеру при изменении исходных данных.
Кеширование на уровне приложения
В 1С можно использовать регистр накопления или справочник для хранения уже посчитанных значений (например, количество товаров в документе на момент его проведения). При изменении документа значение пересчитывается один раз и сохраняется.
Использование оконных функций (SQL)
Когда нужно одновременно получить детализацию и общее количество, удобно применить COUNT OVER :
SELECT oi., COUNT() OVER AS total_items FROM order_items oi JOIN orders o ON oi.order_id = o.id WHERE o.order_date = CURRENT_DATE;
Каждая строка получит поле total_items – общее число строк в результате, без необходимости выполнять отдельный запрос.
Частотность запросов и мониторинг
Знание о том, сколько раз выполняется запрос к части данных, помогает планировать нагрузку и выявлять «горячие» точки.
- Частотность запросов – количество выполнений конкретного запроса за единицу времени (обычно за месяц).
- В системах мониторинга (например, pg_stat_statements в PostgreSQL, AWR в Oracle, DMV в SQL Server) можно собрать статистику по времени выполнения, количеству строк и числу вызовов.
- На основе этой информации решают: кешировать результат, создавать индекс, переходить к материализованному представлению или менять логику приложения.
Пример простого запроса к статистике PostgreSQL:
SELECT query, calls, total_time, rows FROM pg_stat_statements WHERE query LIKE '%COUNT%order_items%' ORDER BY total_time DESC LIMIT 10;
Аналогичные представления существуют в Oracle (V$SQL) и MS SQL Server (sys.dm_exec_query_stats).
Лучшие практики
- Всегда считать на уровне СУБД – не вытягивайте все записи в клиент, а используйте
COUNT. - Делайте выборку только нужных полей – если нужны только количества, не включайте в
SELECTбольшие BLOB‑поля или тексты. - Проверяйте план выполнения (EXPLAIN в PostgreSQL, EXPLAIN PLAN в Oracle, SHOWPLAN в SQL Server) – убедитесь, что используется индекс и нет полного сканирования таблицы.
- Используйте параметризованные запросы – это позволяет кэшировать планы выполнения и снижает нагрузку на парсер.
- Регулярно обновляйте статистику (ANALYZE в PostgreSQL, DBMS_STATS в Oracle, UPDATE STATISTICS в SQL Server) – оптимизатор будет принимать правильные решения о выборе индексов.
- При больших объёмах данных рассмотрите партиционирование – подсчёт по отдельному партиону может быть значительно быстрее.
Определение количества записей, возвращаемых запросом к части данных, – фундаментальная операция, которая встречается в почти всех бизнес‑логиках: от формирования отчётов до принятия решений о масштабировании системы. В платформе 1С:Предприятие это делается функцией КОЛИЧЕСТВО в языке запросов, а в классических СУБД – через агрегатную функцию COUNT. Правильное построение запроса, использование индексов, материализованных представлений и мониторинг частотности позволяют добиться высокой производительности даже при работе с десятками миллионов строк.
Надеемся, представленные примеры и рекомендации помогут вам эффективно считать записи в нужных частях данных и строить быстрые, надёжные решения.