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