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