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

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

Как узнать количество строк в таблице 1С

Способы узнать количество строк в таблице 1С: метод Количество() для табличной части и таблицы значений, запрос с КОЛИЧЕСТВО, динамический список и типичные ошибки.

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

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

Ниже разобраны все основные сценарии: от простейшего вызова Количество() до подсчёта через запрос с группировками и особенностей динамических списков. Отдельно рассмотрены типичные ошибки, из-за которых подсчёт даёт неверный результат или замедляет работу базы.

Количество строк в табличной части документа или справочника

Табличная часть — самый частый случай. Чтобы узнать число строк, вызывается метод Количество() у коллекции строк табличной части. Пример для документа «Реализация товаров и услуг»:

ЧислоСтрок = Объект.Товары.Количество();

Если ЧислоСтрок = 0 Тогда

Сообщить("Табличная часть ""Товары"" не заполнена");

КонецЕсли;

Такой код работает и в модуле объекта, и в модуле формы, и во внешней обработке — везде, где есть ссылка на объект или заполненный объект данных. Метод возвращает целое число и выполняется мгновенно, потому что строки табличной части уже загружены в память вместе с объектом.

Важно понимать: если работа идёт со ссылкой, а не с объектом, табличная часть недоступна напрямую. Конструкция СсылкаНаДокумент.Товары.Количество() вызовет обращение к базе и чтение всего объекта целиком. При массовой обработке тысяч документов это заметно медленнее, чем один запрос по выборке ссылок — об этом ниже.

Количество строк в таблице значений и дереве значений

Таблица значений — универсальная коллекция в памяти, результат многих обработок и выгрузок запросов. Число строк получается тем же методом Количество():

ТЗ = Запрос.Выполнить().Выгрузить();

ВсегоСтрок = ТЗ.Количество();

Если нужно посчитать не все строки, а только удовлетворяющие условию, сначала выполняется отбор через НайтиСтроки() или Скопировать() с параметром отбора, а затем считается размер полученной коллекции:

Отбор = Новый Структура("Склад", СкладОсновной);

Найденные = ТЗ.НайтиСтроки(Отбор);

СтрокПоСкладу = Найденные.Количество();

У дерева значений метод Количество() возвращает число строк только верхнего уровня. Чтобы посчитать строки с учётом иерархии, нужно рекурсивно обходить коллекцию Строки каждого элемента и суммировать Строки.Количество() на каждом уровне. Это частая причина ошибок: разработчик видит «3 строки», хотя внутри ветвей их десятки.

1c
Функция ПосчитатьВсеСтрокиДерева(Строки)
    Итог = Строки.Количество();
    Для Каждого Стр Из Строки Цикл
        Итог = Итог + ПосчитатьВсеСтрокиДерева(Стр.Строки);
    КонецЦикла;
    Возврат Итог;
КонецФункции

Подсчёт строк запросом: КОЛИЧЕСТВО и его особенности

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

ВЫБРАТЬ

КОЛИЧЕСТВО(*) КАК ЧислоСтрок

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

ГДЕ

Товары.Ссылка = &Ссылка

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

Если запрос возвращает не одну строку с итогом, а детальные записи, и число строк результата нужно знать до обхода, используется выборка с методом Количество(): Выборка = Запрос.Выполнить().Выбрать(); Всего = Выборка.Количество();. Учтите, что для этого платформа может выполнить дополнительное обращение к результату, поэтому на очень больших выборках предпочтительнее отдельный запрос с КОЛИЧЕСТВО.

Сравнение способов подсчёта

Количество() у коллекции

Мгновенно, но требует, чтобы данные уже были в памяти. Не подходит для массового подсчёта по ссылкам.

Запрос с КОЛИЧЕСТВО(*)

Оптимален для данных в базе: одно обращение, минимум трафика. Требует написания текста запроса.

Выборка.Количество()

Удобно, когда выборка уже получена для обхода. На больших результатах может стоить лишнего обращения к СУБД.

Количество строк в динамическом списке и таблице формы

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

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

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

Проверка результата и типичные ошибки

После получения числа строк полезно убедиться, что оно соответствует ожиданиям. Простейший способ — вывести значение через Сообщить() или посмотреть в отладчике, поставив точку останова на строке с вызовом Количество(). В конфигураторе значение переменной видно в табло при пошаговом выполнении.

Для проверки корректности запроса с КОЛИЧЕСТВО удобно выполнить тот же запрос в консоли запросов и сверить число с фактическим количеством строк, выведенным без группировки. Расхождение почти всегда означает различие в отборах или соединениях, которые размножают строки.

Типичные ошибки
01
Использование КОЛИЧЕСТВО(Поле) вместо КОЛИЧЕСТВО(*) — строки со значением NULL в поле не учитываются, итог занижен.
02
Подсчёт строк у дерева значений только верхнего уровня — вложенные строки игнорируются.
03
Обращение к табличной части через ссылку в цикле — каждый вызов читает объект из базы, обработка замедляется в разы.
04
Попытка получить количество строк динамического списка несуществующим методом — ошибка исполнения или неверный результат.
05
Соединение таблиц в запросе перед КОЛИЧЕСТВО — дублирование строк из-за связи один-ко-многим завышает итог.
Контрольные точки

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

Число строк табличной части
Норма

Совпадает с числом видимых строк на форме документа

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

Меньше ожидаемого — возможен отбор или работа с копией объекта

Результат КОЛИЧЕСТВО(*) в запросе
Норма

Равен числу строк того же запроса без группировки в консоли запросов

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

Больше — в запросе есть соединение, размножающее строки

Количество у дерева значений
Норма

Сумма с учётом всех уровней иерархии

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

Посчитан только верхний уровень

Частые вопросы о подсчёте строк в 1С

Как посчитать строки табличной части с условием, например только с ненулевым количеством?

Получите массив строк через НайтиСтроки() с отбором по структуре и возьмите Количество() у массива. Если условие сложное (неравенство, сравнение), пройдите по строкам циклом со счётчиком или используйте запрос к табличной части с предложением ГДЕ.

Почему КОЛИЧЕСТВО(Номенклатура) вернуло меньше строк, чем есть на самом деле?

Функция КОЛИЧЕСТВО с указанием поля игнорирует строки, где это поле равно NULL. Такое бывает при соединениях таблиц, когда часть полей не заполнена. Для подсчёта всех строк независимо от значений полей используйте КОЛИЧЕСТВО(*).

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

Да. У выборки из результата запроса есть метод Количество(): Выборка = Запрос.Выполнить().Выбрать(); затем Выборка.Количество(). Альтернатива — отдельный запрос с КОЛИЧЕСТВО(*), что эффективнее на больших объёмах.

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

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

Считает ли Количество() строки, помеченные на удаление в табличной части?

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

Что быстрее: обойти таблицу значений циклом со счётчиком или вызвать Количество()?

Метод Количество() возвращает готовое значение мгновенно, тогда как цикл с инкрементом счётчика перебирает каждую строку. Для простого подсчёта всегда используйте Количество(); цикл оправдан, только если по ходу обхода выполняются другие действия со строками.

Итог

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

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