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