К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как узнать количество записей регистра сведений в 1С

Способы узнать количество записей регистра сведений в 1С: запрос, метод Выбрать(), консоль запросов, СКД. Примеры кода, проверка результата и типичные ошибки.

Количество записей регистра сведений требуется в самых разных ситуациях: при оценке объёма данных перед свёрткой базы, при диагностике медленных запросов, при контроле обменов и при разработке отчётов. В 1С нет встроенной кнопки «показать число записей» в пользовательском интерфейсе, поэтому задачу решают несколькими способами — от консоли запросов до программного кода.

Выбор способа зависит от контекста: администратору обычно достаточно разового запроса, разработчику нужен программный подсчёт внутри алгоритма, а аналитику — данные с группировкой по измерениям. Ниже разобраны все основные варианты с примерами кода, ограничениями и способами проверки результата.

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

Способ 1. Запрос с функцией КОЛИЧЕСТВО — основной и самый быстрый

Штатный и наиболее производительный способ — запрос к виртуальной таблице регистра с агрегатной функцией КОЛИЧЕСТВО(*). Запрос выполняется на стороне СУБД, поэтому время отклика мало зависит от числа записей: сервер считает строки по индексам, не передавая сами данные на клиент.

Пример кода для подсчёта всех записей независимого регистра сведений «ШтрихкодыНоменклатуры»:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| КОЛИЧЕСТВО(*) КАК КоличествоЗаписей

|ИЗ

| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры";

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

КоличествоЗаписей = Выборка.КоличествоЗаписей;

КонецЕсли;

Если нужно количество записей по конкретному отбору — например, по одной организации или виду цен — добавьте секцию ГДЕ. Условие по индексированному измерению практически не замедляет подсчёт, а вот условие по неиндексированному реквизиту заставит СУБД просматривать таблицу целиком.

bsl
ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК КоличествоЗаписей ИЗ РегистрСведений.КурсыВалют ГДЕ Валюта = &Валюта

Способ 2. Консоль запросов и инструменты разработчика без написания кода

Если нужен разовый подсчёт и нет желания писать код, используйте консоль запросов — стандартную обработку, которая есть в составе «Инструментов разработчика» и многих типовых конфигураций (раздел «Администрирование» → «Печатные формы, отчеты и обработки» в ряде решений либо отдельная внешняя обработка).

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

Порядок действий в консоли запросов
  1. 1
    Откройте консоль запросов в режиме Предприятие
  2. 2
    Наберите запрос: ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.ИмяРегистра
  3. 3
    При необходимости добавьте отбор через ГДЕ
  4. 4
    Нажмите «Выполнить» и посмотрите значение в единственной строке результата

Альтернатива для администраторов — стандартная функция «Все функции» → «Стандартные» → «Управление итогами» и показ структуры базы, но прямого счётчика записей там нет. Поэтому консоль запросов остаётся практически единственным «бескодовым» способом.

Способ 3. Программный перебор через Выбрать() — когда и почему его избегают

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

НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();

НаборЗаписей.Прочитать();

КоличествоЗаписей = НаборЗаписей.Количество();

У этого подхода есть принципиальное ограничение: метод Прочитать() загружает все записи набора в память целиком. Для регистра с сотнями тысяч или миллионами строк это означает длительное ожидание и риск исчерпания памяти сервера или клиента. Использовать перебор допустимо только для заведомо небольших регистров либо когда записи всё равно нужны для дальнейшей обработки.

Подсчёт записей периодического регистра и виртуальных таблиц

Для периодических регистров сведений (например, «Курсы валют», «Цены номенклатуры») важно различать три разных числа: общее количество физических записей, количество записей за период и количество строк в срезе последних. Запрос к основной таблице РегистрСведений.КурсыВалют даст первое число, а запрос к виртуальной таблице СрезПоследних — третье, и они почти всегда отличаются.

// Количество актуальных записей на текущую дату

Запрос.Текст =

"ВЫБРАТЬ

| КОЛИЧЕСТВО(*) КАК КоличествоЗаписей

|ИЗ

| РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК Срез";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

Для подчинённых регистратору регистров сведений физическая таблица содержит поле «Регистратор», и подсчёт можно вести с отбором по нему — это быстрый способ проверить, сколько записей сформировал конкретный документ.

Количество записей с группировкой по измерениям

На практике часто нужно не общее число, а распределение: сколько записей приходится на каждую организацию, валюту или вид цен. Для этого в запрос добавляют группировку:

ВЫБРАТЬ

Организация,

КОЛИЧЕСТВО(*) КАК КоличествоЗаписей

ИЗ

РегистрСведений.ОтветственныеЛицаОрганизаций

СГРУППИРОВАТЬ ПО

Организация

Такой запрос помогает найти аномалии: например, если на одну организацию приходится в тысячи раз больше записей, чем на остальные, это повод проверить корректность обмена или регламентного задания, которое пишет в регистр.

Производительность, права и проверка результата

Запрос с КОЛИЧЕСТВО(*) без отбора — одна из самых дешёвых операций, но на очень больших таблицах в клиент-серверном варианте даже он может выполняться заметное время, если СУБД вынуждена делать полное сканирование. Отбор по измерению, входящему в индекс, ускоряет подсчёт. Учтите также, что при включённом разделении данных или ограничении доступа на уровне записей (RLS) результат будет меньше физического числа строк — запрос вернёт только доступные текущему пользователю записи.

Контрольные точки

Как проверить результат

Сравнение с перебором
Норма

КОЛИЧЕСТВО(*) совпадает со счётчиком перебора на небольшой копии базы

Тревожный признак

Числа расходятся — проверьте отборы и RLS

Полнота данных
Норма

Запрос без параметров возвращает ожидаемый порядок величины

Тревожный признак

Число подозрительно мало — возможно, действует отбор по сеансовым данным или разделителям

Периодический регистр
Норма

Срез последних не больше общего числа записей

Тревожный признак

Срез больше общего количества — ошибка в тексте запроса

Типичные ошибки
01
Использование Прочитать() без отбора для подсчёта — переполнение памяти на больших регистрах
02
Подсчёт через КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Измерение) вместо КОЛИЧЕСТВО(*) — получают число уникальных значений, а не записей
03
Сравнение количества записей основной таблицы со срезом последних и вывод о «потере данных» — это разные величины
04
Игнорирование RLS и разделителей: пользователь видит меньше записей, чем есть физически, и делает неверный вывод об очистке регистра

Часто задаваемые вопросы

Можно ли узнать количество записей регистра сведений без прав разработчика?

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

Почему КОЛИЧЕСТВО(*) возвращает меньше записей, чем видно в списке регистра?

Чаще всего причина в действующих ограничениях: RLS, разделители данных в сервисе, отборы в самом запросе или параметрах виртуальной таблицы. Проверьте текст запроса и выполните его под пользователем с полными правами в тестовой копии — там числа должны совпасть с физическим содержимым таблицы.

Как посчитать записи регистра, подчинённого регистратору, по конкретному документу?

Выполните запрос с условием ГДЕ Регистратор = &Регистратор и функцией КОЛИЧЕСТВО(*). Поле «Регистратор» индексировано, поэтому такой подсчёт выполняется быстро даже на больших регистрах. Это удобный способ проверить, сформировал ли документ движения.

Что быстрее: запрос с КОЛИЧЕСТВО(*) или перебор выборки?

Запрос с агрегатной функцией быстрее практически всегда: подсчёт выполняется на стороне СУБД без передачи данных. Перебор выборки требует чтения всех строк и оправдан только тогда, когда сами записи нужны для обработки — тогда счётчик получается «бесплатно» в том же цикле.

Как узнать размер регистра сведений в мегабайтах, а не в записях?

Штатными средствами языка 1С размер таблицы не определяется. В клиент-серверном варианте объём смотрят средствами СУБД: в MS SQL Server — через отчёт «Disk Usage by Table» или запрос к sys.dm_db_partition_stats, в PostgreSQL — функцией pg_total_relation_size(). Для файловой базы ориентиром служит только общий размер файла 1Cv8.1CD.

Влияет ли режим записи регистра (независимый/подчинённый) на подсчёт?

На сам подсчёт — нет: КОЛИЧЕСТВО(*) работает одинаково. Различие в доступных полях: у подчинённого регистра есть поле «Регистратор» и обязательная периодичность, у независимого период есть только если он включён в свойствах. Это влияет лишь на то, какие отборы и группировки можно применить.

Итог

Что важно запомнить

Основной способ узнать количество записей регистра сведений — запрос с КОЛИЧЕСТВО(*) в консоли запросов или в коде. Перебор и Прочитать() без отбора опасны на больших таблицах. Для периодических регистров различайте общее число записей и срез последних, а при расхождении чисел проверяйте RLS и разделители данных.