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

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

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

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

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

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

Ниже разобраны способы получения количества строк в разных контекстах: в модуле объекта, в модуле формы, в запросе и при работе с данными через COM. Также приведены типичные ошибки, из-за которых код возвращает не то значение или падает с ошибкой.

Базовый способ: метод Количество()

Табличная часть объекта в 1С представляет собой коллекцию строк, и у любой такой коллекции есть метод Количество(). Он возвращает число типа «Число» — количество строк, фактически присутствующих в табличной части на момент вызова.

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

Сообщить("В табличной части " + КоличествоСтрок + " строк(и)");

Тот же метод работает для таблиц значений, созданных программно, и для данных формы типа «ТаблицаЗначений»:

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

// ... добавление строк

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

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

Получение количества строк в модуле объекта и формы

В модуле объекта документа доступ к табличной части выполняется напрямую по имени, без обращения через Объект:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Если Товары.Количество() = 0 Тогда

Отказ = Истина;

Возврат;

КонецЕсли;

КонецПроцедуры

В модуле формы обращение идёт через реквизит формы, обычно Объект:

&НаКлиенте

Процедура ПроверитьЗаполнение(Команда)

Если Объект.Товары.Количество() = 0 Тогда

ПоказатьПредупреждение(, "Табличная часть пуста");

КонецЕсли;

КонецПроцедуры

Тонкий клиент и веб-клиент

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

Количество строк у ссылки и через запрос

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

Первый вариант — получить объект методом ПолучитьОбъект(). Это работает, но вычитывает из базы весь документ целиком, что нерационально, если нужно только число строк:

ДокументОбъект = Ссылка.ПолучитьОбъект();

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

Второй вариант — запрос. Он легче по ресурсам и предпочтителен при массовой обработке:

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

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

"ВЫБРАТЬ

| КОЛИЧЕСТВО(Товары.НомерСтроки) КАК КоличествоСтрок

|ИЗ

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

|ГДЕ

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

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

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

Иначе

КоличествоСтрок = 0;

КонецЕсли;

Сравнение вариантов

ПолучитьОбъект() + Количество()

Простой код, но вычитывает весь документ из базы. Подходит для разовых операций, нежелателен в циклах по сотням документов.

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

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

Количество() в форме

Работает только с открытыми данными формы, не подходит для проверки данных в базе без открытия документа.

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

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

Если Объект.Товары.Количество() = 0 Тогда

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

КонецЕсли;

Такая проверка типична для обработчика ОбработкаПроверкиЗаполнения в модуле объекта, где по условиям учёта документ без строк проводиться не должен:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если Товары.Количество() = 0 Тогда

Сообщить("Документ не содержит ни одной строки товаров");

Отказ = Истина;

КонецЕсли;

КонецПроцедуры

Обратите внимание: количество строк не равно количеству заполненных строк. Если пользователь добавил три пустые строки, Количество() вернёт 3. Для содержательной проверки нужно дополнительно анализировать заполненность ключевых реквизитов каждой строки.

Типичные ошибки
01
Сравнение табличной части с Неопределено вместо проверки Количество() = 0 — коллекция всегда существует, даже когда пуста, поэтому такая проверка никогда не сработает.
02
Подсчёт строк циклом со счётчиком там, где достаточно Количество() — лишний код и потеря читаемости.
03
Обращение к табличной части через ссылку без ПолучитьОбъект() — ошибка исполнения или пустой результат.
04
Смешение понятий: Количество() считает строки, а Итог("Количество") суммирует значения реквизита — это разные величины.

Количество строк и итоги: чем Количество() отличается от Итог()

Начинающие разработчики иногда путают метод Количество() с методом Итог(). Разница принципиальна: Количество() возвращает число строк коллекции, а Итог("ИмяРеквизита") — сумму значений числового реквизита по всем строкам.

ЧислоПозиций = Объект.Товары.Количество();        // сколько строк

ВсегоЕдиниц = Объект.Товары.Итог("Количество"); // сумма колонки "Количество"

СуммаДокумента = Объект.Товары.Итог("Сумма"); // сумма колонки "Сумма"

Пример: в документе две строки, в каждой указано количество 5. Тогда Количество() вернёт 2, а Итог("Количество") вернёт 10. Выбирайте метод в зависимости от того, что именно требуется логике — число позиций или суммарное значение.

Практический сценарий: пошаговая проверка перед проведением

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

Порядок действий
  1. 1
    Откройте модуль объекта документа в конфигураторе.
  2. 2
    Найдите или создайте процедуру ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты).
  3. 3
    Добавьте условие: Если Товары.Количество() = 0 Тогда — с выводом сообщения и установкой Отказ = Истина.
  4. 4
    Сохраните конфигурацию и обновите конфигурацию базы данных.
  5. 5
    Проверьте в режиме предприятия: попытка провести пустой документ должна завершаться отказом с вашим сообщением.

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

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

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

Вызов Количество() на форме
Норма

Возвращает число, равное видимому числу строк в таблице

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

Ошибка «Поле объекта не обнаружено» — неверное имя табличной части

Проверка через запрос
Норма

КОЛИЧЕСТВО возвращает 0 или число строк, запрос выполняется без ошибок

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

Пустой результат выборки — значит, документа с такой ссылкой нет или он помечен на удаление

Проверка заполнения при проведении
Норма

Пустой документ не проводится, выводится ваше сообщение

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

Документ проводится — процедура не вызывается или Отказ не установлен

Ограничения и особые случаи

У табличных частей, отображаемых на форме с отбором или отображением иерархии, метод Количество() всё равно возвращает полное число строк коллекции, а не число видимых строк. Если нужен подсчёт именно отображаемых строк, потребуется обход с учётом условий отбора.

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

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

Частые вопросы

Чем отличается Количество() от Итог("Количество")?

Количество() возвращает число строк табличной части, а Итог("Количество") — сумму значений реквизита «Количество» по всем строкам. Для документа с двумя строками по 5 единиц первый метод даст 2, второй — 10.

Почему Ссылка.Товары.Количество() не работает?

У объекта типа «Ссылка» табличные части недоступны напрямую — ссылка содержит только идентификатор и реквизиты шапки. Либо получите объект методом ПолучитьОбъект(), либо подсчитайте строки запросом к табличной части документа.

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

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

Можно ли узнать количество строк без открытия документа?

Да, через запрос к таблице табличной части с функцией КОЛИЧЕСТВО и отбором по ссылке. Это быстрее и безопаснее по ресурсам, чем ПолучитьОбъект(), особенно при пакетной обработке.

Считает ли Количество() незаполненные строки?

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

Работает ли Количество() на тонком клиенте?

Да, метод доступен в клиентском контексте формы и не вызывает обращения к серверу, так как данные табличной части уже находятся на клиенте. Его можно свободно использовать в клиентских обработчиках команд и событий.

Итог

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

Метод Количество() — универсальный способ узнать число строк табличной части, таблицы значений или данных формы. Для ссылки без открытого объекта используйте запрос с КОЛИЧЕСТВО, а не ПолучитьОбъект() в цикле. Не путайте Количество() с Итог(): первый считает строки, второй суммирует значения реквизита.