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