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