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