Разработка и Конфигурация · 11 мин
Как посчитать количество записей регистра сведений в 1С
Способы посчитать количество записей регистра сведений в 1С: запрос с КОЛИЧЕСТВО, ВыбратьКоличество, консоль запросов. Примеры кода, отборы, типичные ошибки.
Задача узнать, сколько записей содержится в регистре сведений, возникает постоянно: при диагностике размера базы, при проверке корректности обмена, перед очисткой устаревших данных, при оценке производительности запросов. В 1С есть несколько рабочих способов получить это число — через встроенный язык, через запрос и через штатные инструменты конфигуратора и предприятия.
Выбор способа зависит от контекста. Если число нужно внутри алгоритма — используют запрос с функцией КОЛИЧЕСТВО или метод ВыбратьКоличество менеджера регистра. Если нужно просто посмотреть объём таблицы администратору — достаточно консоли запросов или стандартных отчётов по структуре базы. Ниже разобраны все варианты с примерами кода и ограничениями каждого.
Важно понимать различие: регистр сведений хранит одну физическую таблицу, и подсчёт её записей — операция над всей таблицей. На больших объёмах (миллионы строк) неосторожный подсчёт может занять заметное время и создать нагрузку на СУБД, поэтому способ стоит выбирать с учётом размера регистра.
Способ 1. Подсчёт через запрос с функцией КОЛИЧЕСТВО
Универсальный и самый гибкий способ — запрос к таблице регистра с агрегатной функцией. Он работает везде: в модуле, в консоли запросов, в СКД. Текст запроса минимален:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют";
Результат = Запрос.Выполнить().Выбрать();
Результат.Следующий();
Количество = Результат.КоличествоЗаписей;
Функция КОЛИЧЕСТВО(*) считает все строки таблицы. Если вместо звёздочки указать конкретное поле, например КОЛИЧЕСТВО(КурсыВалют.Валюта), будут посчитаны только строки, где это поле заполнено (не NULL). Для регистров сведений с обязательными измерениями разницы обычно нет, но при подсчёте по необязательным реквизитам результат может отличаться от полного числа строк.
Дополнительно полезен вариант КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КурсыВалют.Валюта) — он покажет, сколько уникальных значений измерения реально присутствует в регистре. Это удобно, когда нужно понять не объём таблицы, а «насыщенность» данных: например, по скольким валютам вообще есть курсы.
Запрос = Новый Запрос("ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК КоличествоЗаписей ИЗ РегистрСведений.КурсыВалют");
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Сообщить("Записей: " + Выборка.КоличествоЗаписей);Способ 2. Метод ВыбратьКоличество менеджера регистра
У объекта РегистрСведенийМенеджер есть штатный метод ВыбратьКоличество(), который возвращает число записей без написания текста запроса:
Количество = РегистрыСведений.КурсыВалют.ВыбратьКоличество();
Метод принимает необязательные параметры отбора и периода, поэтому для периодических регистров можно посчитать записи за интервал дат, а для регистров с измерениями — по конкретным значениям. Это удобно, когда код должен быть коротким и читаемым.
Ограничение способа — меньшая гибкость по сравнению с запросом: сложные условия (по нескольким полям, с соединениями, с группировкой) через параметры отбора не выразить. Как только условие выходит за рамки простого равенства измерению, переходите на запрос.
Сравнение способов подсчёта
Подходит для любых условий, группировок и соединений. Требует написания текста запроса, работает в консоли запросов.
Одна строка кода, простые отборы по измерениям и периоду. Не подходит для сложных условий.
Разовая проверка администратором без изменения кода конфигурации. Требует установленной обработки и прав.
Только когда нужна не цифра, а сами записи. Для подсчёта избыточен и медленен на больших таблицах.
Подсчёт с отбором по измерениям и периоду
На практике редко нужно общее число — чаще требуется количество записей по конкретному объекту или за период. В запросе это решается секцией ГДЕ:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта = &Валюта
| И КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("Валюта", Валюта);
Запрос.УстановитьПараметр("НачалоПериода", НачалоГода(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("КонецПериода", ТекущаяДатаСеанса());
Для независимых регистров сведений отбор накладывается напрямую на таблицу. Для подчинённых регистратору регистров сведений в отборе участвует поле Регистратор — тогда удобно считать записи по конкретному документу или по типу регистратора.
Обратите внимание на виртуальные таблицы: СрезПервых и СрезПоследних периодического регистра — это не физические таблицы, а вычисляемые выборки. Подсчёт записей в срезе покажет количество актуальных комбинаций измерений, а не общее число строк в регистре. Это разные цифры, и путать их — частая причина «несоответствия» данных.
Подсчёт без программирования: консоль запросов и штатные средства
Если нужно просто посмотреть объём регистра, писать код в конфигурации не обязательно. Самый доступный путь — консоль запросов (типовая обработка или входящая в состав инструментов разработчика): откройте её в режиме предприятия, вставьте текст запроса с КОЛИЧЕСТВО(*) и выполните. Результат появится сразу, без изменения конфигурации.
В типовых конфигурациях также встречаются встроенные механизмы оценки объёма данных: обработки анализа размера таблиц информационной базы, отчёты по структуре хранения. В клиент-серверном варианте администратор может посмотреть размер таблицы непосредственно средствами СУБД (SQL Server Management Studio, pgAdmin для PostgreSQL) — там видно и число строк, и занимаемое место.
При работе через СУБД учитывайте, что физические имена таблиц не совпадают с именами метаданных. Соответствие смотрите через функцию ПолучитьСтруктуруХраненияБазыДанных() в конфигураторе — она покажет, какая SQL-таблица отвечает за нужный регистр.
- 1Откройте консоль запросов в режиме предприятия
- 2Введите текст: ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК КоличествоЗаписей ИЗ РегистрСведений.ИмяРегистра
- 3При необходимости добавьте отбор через ГДЕ и параметры
- 4Выполните запрос и посмотрите значение в поле КоличествоЗаписей
- 5Сверьте результат с ожиданиями: для периодического регистра уточните, считали ли вы таблицу или срез
Производительность и ограничения на больших регистрах
Подсчёт КОЛИЧЕСТВО(*) — это, по сути, сканирование таблицы или индекса на стороне СУБД. На регистре в несколько тысяч записей операция мгновенна, на таблице в десятки миллионов строк может занять секунды и заметнее. В клиент-серверной базе под нагрузкой частые тяжёлые подсчёты способны влиять на работу пользователей.
Практические правила: не вызывайте подсчёт в цикле и в обработчиках, которые срабатывают массово (например, при записи каждого элемента); если число нужно регулярно, кэшируйте его или вычисляйте по расписанию регламентным заданием; для отборов используйте индексированные поля — измерения регистра индексируются по умолчанию, а отбор по неиндексированному реквизиту заставит СУБД сканировать всю таблицу.
Файловый вариант базы добавляет своё ограничение: одновременные тяжёлые запросы там обрабатываются хуже, и длительный подсчёт может блокировать работу других сеансов. На файловых базах большие регистры лучше анализировать вне рабочего времени.
Типичные ошибки и как проверить результат
Наиболее частые промахи при подсчёте записей регистра сведений связаны не с синтаксисом, а с неверной постановкой задачи.
Проверить адекватность результата можно несколькими способами. Во-первых, выполните тот же запрос без группировки с выбором первых строк — убедитесь, что таблица вообще содержит данные и вы обращаетесь к нужному регистру. Во-вторых, посчитайте количество с группировкой по измерению и сравните сумму по группам с общим числом — они обязаны совпасть.
Для периодического регистра полезна контрольная проверка: количество записей в срезе последних не может превышать общее число строк таблицы (за исключением экзотических случаев с дублями ключей, которых платформа не допускает). Если срез «больше» таблицы — вы сравниваете разные объекты.
Как проверить результат
Возвращается одна строка с числом
Ошибка о несуществующей таблице — проверьте имя регистра
Равна общему КОЛИЧЕСТВО(*)
Сумма меньше — есть NULL в поле группировки или неверный отбор
Секунды даже на крупном регистре
Десятки секунд и более — проверьте индексы и отборы
Срез не больше числа строк таблицы
Срез больше — вы считаете разные объекты
FAQ
Чем ВыбратьКоличество отличается от запроса с КОЛИЧЕСТВО()?
Метод ВыбратьКоличество — это компактная обёртка для простого подсчёта с отбором по измерениям и периоду. Запрос с КОЛИЧЕСТВО() гибче: позволяет сложные условия, соединения, группировки и подсчёт различных значений. По скорости на простых задачах они сопоставимы.
Как посчитать записи регистра сведений по конкретному регистратору?
Для подчинённого регистратора регистра сведений добавьте в запрос условие ГДЕ Регистратор = &Документ и передайте ссылку на документ параметром. Поле Регистратор индексировано, поэтому такой подсчёт выполняется быстро даже на больших таблицах.
Почему КОЛИЧЕСТВО(Поле) вернуло меньше, чем КОЛИЧЕСТВО()?
Функция КОЛИЧЕСТВО по конкретному полю игнорирует строки, где это поле равно NULL. КОЛИЧЕСТВО() считает все строки без исключений. Если нужен полный объём таблицы — используйте вариант со звёздочкой.
Можно ли узнать количество записей без прав на изменение конфигурации?
Да. Достаточно права на чтение регистра: откройте консоль запросов в режиме предприятия и выполните запрос с КОЛИЧЕСТВО(*). Изменять конфигурацию для этого не требуется, нужен лишь доступ к самой обработке консоли.
Как посчитать количество уникальных значений измерения в регистре?
Используйте конструкцию КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ИмяИзмерения) в запросе к таблице регистра. Она вернёт число уникальных значений, а не строк. Для нескольких измерений сгруппируйте запрос по ним и посчитайте количество строк результата.
Опасно ли выполнять подсчёт на рабочей базе?
Сам по себе запрос на чтение безопасен и ничего не изменяет. Риск только в нагрузке: на очень больших регистрах без подходящих индексов сканирование таблицы может занять время и замедлить другие сеансы. Для разовой проверки выбирайте нерабочее время или сначала оцените объём на копии базы.
Что важно запомнить
Для подсчёта записей регистра сведений используйте запрос с КОЛИЧЕСТВО(*) или метод ВыбратьКоличество(); отборы добавляйте через ГДЕ по индексированным измерениям. Не путайте число строк таблицы с количеством записей в срезе последних и не выполняйте тяжёлые подсчёты в циклах на рабочей базе.