Работа с отчетами в платформе 1С:Предприятие 8 неразрывно связана с объектом Табличный документ. Разработчики часто сталкиваются с необходимостью программно определить объем сформированных данных, скрытых от глаз пользователя или находящихся в буфере перед выводом на печать.
Количество строк может потребоваться для валидации данных, условного форматирования или динамического изменения структуры отчета. В этой статье мы разберем основные способы получения этой информации, нюансы работы с областями и методы оптимизации.
Разные версии платформы и типы компоновки данных могут влиять на доступ к свойствам объекта. Поэтому важно понимать, обращаетесь ли вы к макету, уже сформированному документу или результате запроса.
Прямой доступ к свойству КоличествоСтрок
Самый очевидный и часто используемый способ — обращение к свойству объекта. Если у вас есть переменная, содержащая ссылку на ТабличныйДокумент, вы можете мгновенно получить общее число строк.
Обратите внимание, что это свойство возвращает количество строк во всем документе, включая заголовки, колонтитулы и пустые строки, если они были добавлены программно. Это глобальный параметр, который не учитывает структуру областей.
Использование этого метода крайне эффективно в условиях, когда отчет уже сформирован и отображается на экране пользователя. Однако в процессе генерации отчета, когда данные еще записываются в области, значение может быть неактуальным.
Для получения значения используется простой синтаксис, который не требует дополнительных вычислений:
КоличествоСтрокОтчета = ТабДок.КоличествоСтрок;
Помните, что свойство доступно только для чтения. Вы не можете изменить количество строк, присвоив новое значение этому параметру. Для изменения размера документа необходимо использовать методы добавления или удаления строк.
Свойство КоличествоСтрок работает быстрее, чем перебор всех ячеек, так как значение хранится в памяти объекта и не требует пересчета при каждом обращении.
Работа с областями и вложенными структурами
Часто возникает ситуация, когда нужно узнать количество строк не во всем отчете, а только в конкретной области макета. Это особенно актуально при использовании СКД (Системы Компоновки Данных), где данные разбиты на логические блоки.
Область в табличном документе — это именованный диапазон ячеек. Чтобы получить количество строк внутри неё, необходимо сначала получить сам объект области, а затем обратиться к её свойствам.
- 📊 Используйте метод
ПолучитьОбластьдля извлечения нужного диапазона по имени. - 🔍 Свойство
КоличествоСтроку объекта области работает аналогично свойству всего документа. - ⚠️ Учтите, что область может быть пустой, если данные в неё не были записаны в ходе выполнения алгоритма.
Важно различать количество строк в области макета и количество строк в результирующем документе после вывода области. При выводе область может растянуться, если в неё помещается много данных из запроса.
⚠️ Внимание: Если вы обращаетесь к области, которая еще не была выведена в документ (находится в буфере компоновки), свойство может вернуть размер шаблона, а не фактический размер данных.
Пример кода для получения размера конкретной области выглядит следующим образом:
ОбластьДанных = ТабДок.ПолучитьОбласть("ДетальныеЗаписи");
ЧислоСтрок = ОбластьДанных.КоличествоСтрок;
Подсчет строк в открепленных данных
В современных версиях платформы 1С:Предприятие активно используется механизм открепленных данных для оптимизации памяти. Когда табличный документ становится слишком большим, часть данных может быть выгружена во временное хранилище.
В таком состоянии прямое обращение к некоторым свойствам документа может работать медленнее или требовать специальной обработки. Однако свойство количества строк обычно остается доступным и корректным.
Если вы работаете с большими объемами информации, убедитесь, что ваш код учитывает возможность открепления данных. В редких случаях при ручной построчной записи в открепленный документ счетчик может обновляться с задержкой.
Для гарантированного получения актуального числа строк в больших отчетах рекомендуется использовать метод ПолучитьСтроку в цикле только если нужно проанализировать содержимое, но для простого подсчета достаточно стандартного свойства.
Что такое открепление данных?
Открепление данных — это механизм, при котором массив ячеек табличного документа выгружается из оперативной памяти во временное хранилище на диске. Это позволяет работать с отчетами, содержащими миллионы строк, не вызывая переполнения памяти сервера 1С.
Анализ видимых и скрытых строк
Иногда бизнес-логика требует знать количество только видимых строк, игнорируя те, что были скрыты программно или пользователем. Стандартное свойство КоличествоСтрок возвращает общее число, включая скрытые.
Чтобы получить количество видимых строк, необходимо Iterate по всем строкам документа и проверять свойство Высота или специальный флаг видимости. Если высота строки равна 0 или установлен флаг скрытия, такая строка не учитывается.
Этот подход требует больше вычислительных ресурсов, так как предполагает проход по всему массиву строк. Используйте его только тогда, когда точное число видимых записей критически важно для логики программы.
Пример алгоритма подсчета видимых строк:
ВидимыеСтроки = 0;
Для Сч = 1 По ТабДок.КоличествоСтрок Цикл
Если ТабДок.ВысотаСтроки(Сч) > 0 Тогда
ВидимыеСтроки = ВидимыеСтроки + 1;
КонецЕсли;
КонецЦикла;
| Метод получения | Скорость работы | Точность данных | Сложность реализации |
|---|---|---|---|
| Свойство КоличествоСтрок | Мгновенно | Все строки (включая скрытые) | Минимальная |
| Перебор областей | Высокая | Только данные области | Средняя |
| Фильтрация по высоте | Низкая (цикл) | Только видимые строки | Высокая |
| Анализ открепленных данных | Средняя | Зависит от состояния памяти | Высокая |
Для большинства задач достаточно использовать стандартное свойство КоличествоСтрок. Ручной перебор нужен только для специфических задач фильтрации скрытых элементов.
Особенности работы в режиме Предприятия и Конфигуратора
Поведение табличного документа может незначительно отличаться в зависимости от режима запуска. В режиме Предприятия документ отображается пользователю, и все свойства актуализируются автоматически при изменении интерфейса.
В режиме Конфигуратора или при фоновом выполнении заданий на сервере, визуализация отсутствует. Это может влиять на расчет некоторых метрических свойств, зависящих от шрифтов или разрешения экрана, но счетчик строк остается неизменным.
При отладке кода в конфигураторе помните, что вы можете не видеть реального размера отчета, пока не запустите его в режиме 1С:Предприятие. Используйте отладчик для контроля значения переменной счетчика.
Если вы формируете отчет для выгрузки в внешний файл (Excel, PDF), убедитесь, что подсчет строк производится до момента конвертации формата, так как при экспорте структура документа может измениться.
⚠️ Внимание: При работе с внешними отчетами (.erf) доступ к внутренним свойствам табличного документа может быть ограничен правами доступа или особенностями реализации внешней обработки.
☑️ Проверка корректности подсчета строк
Частые ошибки и оптимизация производительности
Одной из распространенных ошибок является попытка пересчитывать количество строк внутри цикла, который сам же и заполняет документ. Это создает избыточную нагрузку на процессор.
Лучшей практикой является ведение собственного счетчика в переменной цикла. Это избавляет систему от необходимости обращаться к свойствам тяжелого объекта ТабличныйДокумент на каждой итерации.
Также стоит избегать частого вызова метода ПолучитьОбласть внутри циклов. Получайте область один раз перед началом обработки данных и используйте этот объект для дальнейшей работы.
Оптимизация кода особенно важна при формировании регламентированных отчетов с тысячами строк. Даже небольшая задержка на каждой строке в сумме может привести к значительному увеличению времени формирования.
Используйте буферизацию данных перед записью в табличный документ, если это позволяет логика вашей задачи. Массовая запись данных работает быстрее, чем построчная, и упрощает контроль количества записей.
Если вы используете СКД, количество строк итоговых данных можно узнать через объект РезультатКомпоновкиДанных до вывода в табличный документ, что часто быстрее.
В чем разница между КоличествоСтрок и ВысотаТаблицы?
КоличествоСтрок возвращает целое число — количество горизонтальных рядов ячеек. ВысотаТаблицы возвращает физический размер в миллиметрах или пикселях. Высота может меняться при изменении шрифта или переносе текста, а количество строк — это структурная характеристика.
Можно ли узнать количество заполненных ячеек в строке?
Да, для этого нужно получить объект строки или перебирать ячейки внутри конкретной строки, проверяя свойство Текст или Пустая. Свойства "КоличествоЗаполненныхЯчеек" у самой строки не существует, это нужно вычислять программно.
Почему КоличествоСтрок возвращает 0 после формирования?
Это может происходить, если вы обращаетесь к свойству до момента фактического вывода данных в документ. Убедитесь, что вызов свойства стоит после команд Вывести или после завершения работы компоновщика данных.
Как получить количество строк в печатной форме?
Печатная форма — это тот же табличный документ. Методы идентичны. Однако, если печатная форма формируется на лету при печати, убедитесь, что вы перехватываете событие после завершения компоновки макета.
Влияет ли группировка в СКД на количество строк?
Да, группировки создают дополнительные служебные строки (заголовки групп, итоги). Свойство КоличествоСтрок учитывает их все. Если нужны только детальные записи, необходимо анализировать тип строки или использовать отбор в настройках компоновки.