Разработка и Конфигурация · 9 мин
Как узнать количество записей регистра сведений в 1С
Способы узнать количество записей регистра сведений в 1С: запрос, метод Выбрать(), консоль запросов, СКД. Примеры кода, проверка результата и типичные ошибки.
Количество записей регистра сведений требуется в самых разных ситуациях: при оценке объёма данных перед свёрткой базы, при диагностике медленных запросов, при контроле обменов и при разработке отчётов. В 1С нет встроенной кнопки «показать число записей» в пользовательском интерфейсе, поэтому задачу решают несколькими способами — от консоли запросов до программного кода.
Выбор способа зависит от контекста: администратору обычно достаточно разового запроса, разработчику нужен программный подсчёт внутри алгоритма, а аналитику — данные с группировкой по измерениям. Ниже разобраны все основные варианты с примерами кода, ограничениями и способами проверки результата.
Важно понимать одну особенность: регистр сведений хранит записи в разрезе измерений (и периода, если регистр периодический), поэтому «количество записей» — это всегда количество строк физической таблицы регистра, а не количество уникальных значений какого-либо измерения. Эти величины часто путают, что приводит к неверным выводам.
Способ 1. Запрос с функцией КОЛИЧЕСТВО — основной и самый быстрый
Штатный и наиболее производительный способ — запрос к виртуальной таблице регистра с агрегатной функцией КОЛИЧЕСТВО(*). Запрос выполняется на стороне СУБД, поэтому время отклика мало зависит от числа записей: сервер считает строки по индексам, не передавая сами данные на клиент.
Пример кода для подсчёта всех записей независимого регистра сведений «ШтрихкодыНоменклатуры»:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
КоличествоЗаписей = Выборка.КоличествоЗаписей;
КонецЕсли;
Если нужно количество записей по конкретному отбору — например, по одной организации или виду цен — добавьте секцию ГДЕ. Условие по индексированному измерению практически не замедляет подсчёт, а вот условие по неиндексированному реквизиту заставит СУБД просматривать таблицу целиком.
ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК КоличествоЗаписей ИЗ РегистрСведений.КурсыВалют ГДЕ Валюта = &ВалютаСпособ 2. Консоль запросов и инструменты разработчика без написания кода
Если нужен разовый подсчёт и нет желания писать код, используйте консоль запросов — стандартную обработку, которая есть в составе «Инструментов разработчика» и многих типовых конфигураций (раздел «Администрирование» → «Печатные формы, отчеты и обработки» в ряде решений либо отдельная внешняя обработка).
Порядок действий прост: откройте консоль, наберите запрос вида ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.ИмяРегистра и выполните его. Результат — одна строка с числом. Конструктор запроса позволяет собрать тот же текст мышкой, что удобно для тех, кто не помнит синтаксис.
- 1Откройте консоль запросов в режиме Предприятие
- 2Наберите запрос: ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.ИмяРегистра
- 3При необходимости добавьте отбор через ГДЕ
- 4Нажмите «Выполнить» и посмотрите значение в единственной строке результата
Альтернатива для администраторов — стандартная функция «Все функции» → «Стандартные» → «Управление итогами» и показ структуры базы, но прямого счётчика записей там нет. Поэтому консоль запросов остаётся практически единственным «бескодовым» способом.
Способ 3. Программный перебор через Выбрать() — когда и почему его избегают
Менеджер регистра сведений имеет метод Выбрать(), который возвращает выборку записей. Формально количество можно получить, перебрав выборку и инкрементируя счётчик:
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();
КоличествоЗаписей = НаборЗаписей.Количество();
У этого подхода есть принципиальное ограничение: метод Прочитать() загружает все записи набора в память целиком. Для регистра с сотнями тысяч или миллионами строк это означает длительное ожидание и риск исчерпания памяти сервера или клиента. Использовать перебор допустимо только для заведомо небольших регистров либо когда записи всё равно нужны для дальнейшей обработки.
Подсчёт записей периодического регистра и виртуальных таблиц
Для периодических регистров сведений (например, «Курсы валют», «Цены номенклатуры») важно различать три разных числа: общее количество физических записей, количество записей за период и количество строк в срезе последних. Запрос к основной таблице РегистрСведений.КурсыВалют даст первое число, а запрос к виртуальной таблице СрезПоследних — третье, и они почти всегда отличаются.
// Количество актуальных записей на текущую дату
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК Срез";
Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());
Для подчинённых регистратору регистров сведений физическая таблица содержит поле «Регистратор», и подсчёт можно вести с отбором по нему — это быстрый способ проверить, сколько записей сформировал конкретный документ.
Количество записей с группировкой по измерениям
На практике часто нужно не общее число, а распределение: сколько записей приходится на каждую организацию, валюту или вид цен. Для этого в запрос добавляют группировку:
ВЫБРАТЬ
Организация,
КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
РегистрСведений.ОтветственныеЛицаОрганизаций
СГРУППИРОВАТЬ ПО
Организация
Такой запрос помогает найти аномалии: например, если на одну организацию приходится в тысячи раз больше записей, чем на остальные, это повод проверить корректность обмена или регламентного задания, которое пишет в регистр.
Производительность, права и проверка результата
Запрос с КОЛИЧЕСТВО(*) без отбора — одна из самых дешёвых операций, но на очень больших таблицах в клиент-серверном варианте даже он может выполняться заметное время, если СУБД вынуждена делать полное сканирование. Отбор по измерению, входящему в индекс, ускоряет подсчёт. Учтите также, что при включённом разделении данных или ограничении доступа на уровне записей (RLS) результат будет меньше физического числа строк — запрос вернёт только доступные текущему пользователю записи.
Как проверить результат
КОЛИЧЕСТВО(*) совпадает со счётчиком перебора на небольшой копии базы
Числа расходятся — проверьте отборы и RLS
Запрос без параметров возвращает ожидаемый порядок величины
Число подозрительно мало — возможно, действует отбор по сеансовым данным или разделителям
Срез последних не больше общего числа записей
Срез больше общего количества — ошибка в тексте запроса
Часто задаваемые вопросы
Можно ли узнать количество записей регистра сведений без прав разработчика?
Да, если у вас есть доступ к консоли запросов или к отчёту, который выводит данные регистра с итогами. Право на просмотр данных регистра при этом обязательно: без него запрос вернёт ошибку или пустой результат. В типовых конфигурациях часть сведений доступна через стандартные отчёты и списки, где видно количество строк в списке.
Почему КОЛИЧЕСТВО(*) возвращает меньше записей, чем видно в списке регистра?
Чаще всего причина в действующих ограничениях: RLS, разделители данных в сервисе, отборы в самом запросе или параметрах виртуальной таблицы. Проверьте текст запроса и выполните его под пользователем с полными правами в тестовой копии — там числа должны совпасть с физическим содержимым таблицы.
Как посчитать записи регистра, подчинённого регистратору, по конкретному документу?
Выполните запрос с условием ГДЕ Регистратор = &Регистратор и функцией КОЛИЧЕСТВО(*). Поле «Регистратор» индексировано, поэтому такой подсчёт выполняется быстро даже на больших регистрах. Это удобный способ проверить, сформировал ли документ движения.
Что быстрее: запрос с КОЛИЧЕСТВО(*) или перебор выборки?
Запрос с агрегатной функцией быстрее практически всегда: подсчёт выполняется на стороне СУБД без передачи данных. Перебор выборки требует чтения всех строк и оправдан только тогда, когда сами записи нужны для обработки — тогда счётчик получается «бесплатно» в том же цикле.
Как узнать размер регистра сведений в мегабайтах, а не в записях?
Штатными средствами языка 1С размер таблицы не определяется. В клиент-серверном варианте объём смотрят средствами СУБД: в MS SQL Server — через отчёт «Disk Usage by Table» или запрос к sys.dm_db_partition_stats, в PostgreSQL — функцией pg_total_relation_size(). Для файловой базы ориентиром служит только общий размер файла 1Cv8.1CD.
Влияет ли режим записи регистра (независимый/подчинённый) на подсчёт?
На сам подсчёт — нет: КОЛИЧЕСТВО(*) работает одинаково. Различие в доступных полях: у подчинённого регистра есть поле «Регистратор» и обязательная периодичность, у независимого период есть только если он включён в свойствах. Это влияет лишь на то, какие отборы и группировки можно применить.
Что важно запомнить
Основной способ узнать количество записей регистра сведений — запрос с КОЛИЧЕСТВО(*) в консоли запросов или в коде. Перебор и Прочитать() без отбора опасны на больших таблицах. Для периодических регистров различайте общее число записей и срез последних, а при расхождении чисел проверяйте RLS и разделители данных.