К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как проверить, пустая ли таблица значений в 1С

Способы проверить, пустая ли таблица значений в 1С: Количество() = 0, НайтиСтроки, обход строк, проверка после запроса. Примеры кода и типичные ошибки.

Проверка на пустоту — одна из самых частых операций при работе с таблицей значений в 1С. Она нужна перед обходом строк, перед выгрузкой в документ, перед формированием отчёта или передачей данных в другую процедуру. Если пропустить эту проверку, код может отработать с пустыми данными: создать документ без строк, вывести пустой отчёт или упасть с ошибкой при обращении к несуществующей первой строке.

У объекта «ТаблицаЗначений» нет отдельного метода вида «Пустая()», поэтому начинающие разработчики часто ищут его в синтакс-помощнике и не находят. Проверка выполняется через свойство количества строк или через косвенные признаки — в зависимости от того, что именно нужно узнать: есть ли вообще строки, есть ли строки, удовлетворяющие условию, или заполнены ли данные в колонках.

Ниже разобраны рабочие способы проверки с примерами кода, отличия для управляемых и обычных форм, проверка результата запроса и типичные ошибки, которые приводят к ложным срабатываниям.

Базовая проверка через Количество()

Основной и самый быстрый способ — метод Количество(). Он возвращает число строк в таблице, и если строк нет, результат равен нулю. Эта проверка работает в любом контексте: на сервере, на клиенте, в толстом и тонком клиенте, во внешних обработках.

Если ТаблицаТоваров.Количество() = 0 Тогда

Сообщить("Таблица не содержит строк, обработка прервана.");

Возврат;

КонецЕсли;

Такой код обычно ставят в самом начале процедуры, чтобы сразу прервать выполнение при отсутствии данных. Это защищает от ошибок вида «обращение к строке по индексу, выходящему за границы», которые возникают при попытке взять ТаблицаТоваров[0] из пустой таблицы.

Обратная проверка — «таблица не пустая» — записывается через сравнение с нулём или просто условием на больше нуля:

Если ТаблицаТоваров.Количество() > 0 Тогда

// есть строки, можно обходить

КонецЕсли;

Проверка таблицы, полученной из запроса

Когда таблица значений получается выгрузкой результата запроса, есть два варианта проверки. Первый — проверить сам результат запроса до выгрузки через метод Пустой(). Это экономит ресурсы: если данных нет, выгрузка в таблицу значений вообще не выполняется.

РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Пустой() Тогда

Сообщить("По условиям отбора данных не найдено.");

Возврат;

КонецЕсли;

ТаблицаДанных = РезультатЗапроса.Выгрузить();

Второй вариант — выгрузить и проверить уже таблицу через Количество(). Он уместен, когда таблица нужна в любом случае, например для передачи в другую процедуру, которая сама решает, что делать с пустыми данными.

Учтите, что Пустой() у результата запроса и Количество() = 0 у выгруженной таблицы дают одинаковый смысл, но первый вариант быстрее, потому что не создаёт лишний объект в памяти. На больших выборках разница заметна.

Сравнение вариантов

ТЗ.Количество() = 0

Универсальный способ для любой таблицы значений. Работает везде, но требует, чтобы таблица уже существовала.

РезультатЗапроса.Пустой()

Оптимально до выгрузки: не создаёт таблицу, если данных нет. Применимо только к результату запроса.

НайтиСтроки(Отбор).Количество() = 0

Проверяет не пустоту таблицы, а отсутствие строк по условию. Таблица при этом может быть заполнена.

Проверка наличия строк по условию

Частая задача — узнать не «пустая ли таблица вообще», а «есть ли в ней нужные строки». Например, есть ли товары с нулевым остатком или строки с незаполненной ценой. Для этого используется метод НайтиСтроки(), который возвращает массив найденных строк.

Отбор = Новый Структура("Цена", 0);

НайденныеСтроки = ТаблицаТоваров.НайтиСтроки(Отбор);

Если НайденныеСтроки.Количество() = 0 Тогда

Сообщить("Строк с нулевой ценой не найдено.");

КонецЕсли;

Важно понимать разницу: таблица может содержать сотни строк, но ни одной, удовлетворяющей отбору. Проверка Количество() = 0 по всей таблице здесь ничего не даст — нужен именно поиск по структуре отбора.

Если требуется проверить наличие хотя бы одной строки с заполненным значением в конкретной колонке, а отбор через структуру не подходит (например, условие «не равно»), придётся использовать обход циклом с флагом:

ЕстьЗаполненные = Ложь;

Для Каждого СтрокаТЗ Из ТаблицаТоваров Цикл

Если ЗначениеЗаполнено(СтрокаТЗ.Поставщик) Тогда

ЕстьЗаполненные = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Оператор Прервать важен: как только первая подходящая строка найдена, цикл останавливается и не тратит время на остальные строки.

Порядок действий при проверке
  1. 1
    Определите, что проверяете: отсутствие строк вообще или отсутствие строк по условию
  2. 2
    Для общей проверки используйте ТЗ.Количество() = 0
  3. 3
    Для таблицы из запроса сначала проверьте РезультатЗапроса.Пустой() до выгрузки
  4. 4
    Для условия используйте НайтиСтроки() и проверьте размер массива
  5. 5
    После проверки убедитесь, что дальнейший код не обращается к строкам пустой таблицы

Проверка таблицы в форме и табличной части документа

Реквизит формы типа «ТаблицаЗначений»

В управляемой форме таблица значений часто хранится как реквизит формы. Проверка выполняется так же — через Количество(), но обращение идёт к реквизиту формы:

Если Объект.Товары.Количество() = 0 Тогда

// табличная часть документа пуста

КонецЕсли;

Для табличной части документа это стандартный приём перед проведением. Многие типовые конфигурации не позволяют провести документ без строк — именно такой проверкой это и реализовано.

Элемент формы «Таблица»

Если нужно проверить данные, отображаемые в элементе формы, обращайтесь не к элементу, а к данным, которые он отображает — реквизиту формы. Элемент формы — это только визуальное представление. Проверка Элементы.ТаблицаФормы на пустоту бессмысленна: элемент существует всегда, даже когда данные пустые.

Типичные ошибки
01
Попытка обратиться к ТЗ[0] до проверки Количество() — приводит к ошибке «Индекс находится за границами массива»
02
Проверка таблицы на Неопределено вместо проверки количества строк: созданная таблица без строк — это не Неопределено, а объект с нулём строк
03
Проверка элемента формы вместо реквизита с данными — элемент существует всегда, проверять нужно данные
04
Использование НайтиСтроки() с пустой структурой отбора — вернёт все строки, что не отвечает на вопрос о пустоте по условию

Когда таблица «не пустая», но данных в ней нет

Отдельный сценарий — таблица содержит строки, но все значения в них пустые. Такое бывает после программного добавления строк без заполнения, после копирования структуры или при ошибках в логике загрузки. Проверка Количество() = 0 здесь вернёт Ложь, хотя фактически полезных данных нет.

Для диагностики такой ситуации используют обход с проверкой ключевых колонок через ЗначениеЗаполнено(). Если ни в одной строке ключевая колонка не заполнена — таблицу можно считать фактически пустой и обработать соответствующим образом.

Ещё один тонкий момент — таблица может вообще не быть создана. Если переменная объявлена, но в неё не присвоено значение Новый ТаблицаЗначений, обращение к Количество() вызовет ошибку. Поэтому в процедурах, принимающих таблицу параметром, полезна защитная проверка:

Если ТаблицаДанных = Неопределено

Или ТаблицаДанных.Количество() = 0 Тогда

Возврат;

КонецЕсли;

Порядок условий важен: сначала проверка на Неопределено, потом на количество. Платформа вычисляет условия слева направо с оптимизацией, и если первое условие истинно, второе не вычисляется — ошибки не будет.

Проверка результата и отладка

В отладчике быстро оценить заполненность таблицы можно через команду «Вычислить выражение» (Ctrl+F9): введите ТЗ.Количество() и получите число строк. Для просмотра содержимого используйте «Показать значение в отдельном окне» — таблица откроется в виде списка, где видно и строки, и значения колонок.

Признак корректно работающей проверки — код после неё никогда не обращается к строкам, если их нет. Если после добавления проверки ошибка «индекс за границами» продолжает возникать, значит, обращение к строке происходит где-то ещё: ищите все места с обращением по индексу или методом Найти(), который при отсутствии результата возвращает Неопределено.

Контрольные точки

Как проверить результат

Вызов ТЗ.Количество() в отладчике
Норма

Возвращает число без ошибки

Тревожный признак

Ошибка «Переменная не определена» — таблица не создана

Поведение кода при пустой таблице
Норма

Выполняется ветка «нет данных», обработка завершается корректно

Тревожный признак

Ошибка обращения к строке по индексу

Результат НайтиСтроки()
Норма

Массив, размер которого соответствует ожиданиям

Тревожный признак

Ошибка «Колонка не найдена» — в отборе указано несуществующее имя колонки

Часто задаваемые вопросы

Есть ли у таблицы значений метод Пустая()?

Нет, такого метода у объекта «ТаблицаЗначений» не существует. Проверка выполняется через сравнение Количество() с нулём. Метод Пустой() есть у результата запроса, и его часто путают с методом таблицы значений.

Чем отличается проверка таблицы значений от проверки результата запроса?

Результат запроса — промежуточный объект, у него есть метод Пустой(), и проверять его лучше до выгрузки. Таблица значений — материализованные данные в памяти, у неё проверяется Количество(). Если запрос ничего не вернул, выгруженная таблица будет существовать, но с нулём строк.

Как проверить, что таблица содержит хотя бы одну строку с непустым значением?

Через обход циклом с ЗначениеЗаполнено() по нужной колонке и оператором Прервать при первом найденном значении. Если значения известны заранее, можно использовать Найти() или НайтиСтроки() со структурой отбора.

Почему Найти() вернул Неопределено, хотя таблица не пустая?

Метод Найти() ищет строку по конкретному значению в колонке. Неопределено означает, что строки с таким значением нет, а не что таблица пустая. Это разные проверки: сначала при необходимости проверяйте Количество(), затем результат поиска на Неопределено.

Нужно ли проверять таблицу на Неопределено перед Количество()?

Если таблица создаётся в том же коде строкой «ТЗ = Новый ТаблицаЗначений», проверка не нужна. Если таблица приходит параметром или из функции, которая может вернуть Неопределено, защитная проверка обязательна — иначе обращение к Количество() вызовет ошибку.

Как проверить пустоту табличной части документа перед проведением?

Через Объект.ИмяТабличнойЧасти.Количество() = 0 в процедуре ОбработкаПроверкиЗаполнения. При пустой табличной части устанавливают Отказ = Истина и выводят сообщение пользователю, чтобы документ нельзя было провести без строк.

Итог

Что важно запомнить

Пустоту таблицы значений проверяют через ТЗ.Количество() = 0 — отдельного метода «Пустая()» нет. Результат запроса проверяйте методом Пустой() до выгрузки. Для поиска строк по условию используйте НайтиСтроки() и размер массива. Всегда ставьте проверку перед обращением к строкам по индексу, а таблицу, полученную извне, дополнительно проверяйте на Неопределено.