Подсчет количества записей в запросе к части данных в 1С и SQL

Узнайте, как точно подсчитать записи запроса без тормозов: лайфхаки для отчетов, пагинации и оптимизации нагрузки на 1С.

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

В современных информационных системах часто возникает необходимость узнать, сколько записей возвращает запрос к определённой части данных (табличной части документа, справочника, регистра и т.п.). Эта информация нужна для:

  • оценки нагрузки на систему;
  • построения отчётов и панелей мониторинга;
  • оптимизации производительности (кеширование, пагинация);
  • принятия решений о необходимости агрегирования данных.

В данной статье мы подробно рассмотрим, как определить количество записей, возвращаемых запросом к «части» данных, на примерах платформы 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).


Лучшие практики

  1. Всегда считать на уровне СУБД – не вытягивайте все записи в клиент, а используйте COUNT.
  2. Делайте выборку только нужных полей – если нужны только количества, не включайте в SELECT большие BLOB‑поля или тексты.
  3. Проверяйте план выполнения (EXPLAIN в PostgreSQL, EXPLAIN PLAN в Oracle, SHOWPLAN в SQL Server) – убедитесь, что используется индекс и нет полного сканирования таблицы.
  4. Используйте параметризованные запросы – это позволяет кэшировать планы выполнения и снижает нагрузку на парсер.
  5. Регулярно обновляйте статистику (ANALYZE в PostgreSQL, DBMS_STATS в Oracle, UPDATE STATISTICS в SQL Server) – оптимизатор будет принимать правильные решения о выборе индексов.
  6. При больших объёмах данных рассмотрите партиционирование – подсчёт по отдельному партиону может быть значительно быстрее.

Определение количества записей, возвращаемых запросом к части данных, – фундаментальная операция, которая встречается в почти всех бизнес‑логиках: от формирования отчётов до принятия решений о масштабировании системы. В платформе 1С:Предприятие это делается функцией КОЛИЧЕСТВО в языке запросов, а в классических СУБД – через агрегатную функцию COUNT. Правильное построение запроса, использование индексов, материализованных представлений и мониторинг частотности позволяют добиться высокой производительности даже при работе с десятками миллионов строк.

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