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

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

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

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

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

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

Важно понимать разницу между «таблица не создана», «таблица создана, но пуста» и «таблица заполнена строками с пустыми значениями». Это три разных состояния, и универсальная проверка должна учитывать все три, иначе логика обработки данных будет работать нестабильно.

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

Метод Количество() возвращает число строк таблицы значений. Если таблица пуста, метод вернёт 0. Это стандартный и самый читаемый способ проверки:

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

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

Возврат;

КонецЕсли;

Обратная проверка — убедиться, что данные есть, — записывается аналогично:

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

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

// обработка строки

КонецЦикла;

КонецЕсли;

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

bsl
Если ТаблицаЗначений.Количество() = 0 Тогда
    ВызватьИсключение "Нет данных для формирования отчета";
КонецЕсли;

Защита от обращения к неинициализированной переменной

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

Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Тогда

Возврат;

КонецЕсли;

Если Результат.Количество() = 0 Тогда

Возврат;

КонецЕсли;

Компактный вариант той же логики — одна составная проверка. Она покрывает и отсутствие таблицы, и её пустоту:

Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений")

Или Результат.Количество() = 0 Тогда

// данных нет

Возврат;

КонецЕсли;

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

Если таблица уже помещается в запрос как источник данных, проверку на пустоту можно выполнить средствами запроса. Это удобно, когда дальше всё равно планируется выборка с отбором или группировкой:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЕСТЬNULL(КОЛИЧЕСТВО(*), 0) КАК ЧислоСтрок

|ПОМЕСТИТЬ ВТ_Таблица

|ИЗ &Таблица КАК Таблица

|;

|ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК ЧислоСтрок ИЗ ВТ_Таблица";

Запрос.УстановитьПараметр("Таблица", ТаблицаЗначений);

Выборка = Запрос.Выполнить().Выбрать();

Выборка.Следующий();

Если Выборка.ЧислоСтрок = 0 Тогда

// таблица пуста

КонецЕсли;

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

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

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

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

Возврат;

КонецЕсли;

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

Обратите внимание: у результата запроса есть собственный метод Пустой(), который возвращает Истина, если выборка не содержит записей. Использовать его до выгрузки — быстрее и нагляднее, чем выгружать пустой результат и считать строки.

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

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

Универсальный способ для уже существующей таблицы. Требует предварительной проверки типа переменной.

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

Применяется до выгрузки результата запроса. Самый быстрый вариант, если таблица ещё не создана.

Найти() / НайтиСтроки()

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

Проверка наличия конкретных строк через Найти() и НайтиСтроки()

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

НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомыйКод, "Код");

Если НайденнаяСтрока = Неопределено Тогда

// строки с таким кодом в таблице нет

КонецЕсли;

Метод НайтиСтроки() возвращает массив строк по структуре отбора. Проверка на пустоту результата — через размер массива:

Отбор = Новый Структура("Склад, Пометка", СкладОтгрузки, Истина);

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

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

// подходящих строк нет

КонецЕсли;

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

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

Тонкости: пустые строки и незаполненные колонки

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

Для таких случаев проверку строят по содержимому. Например, суммируют ключевую колонку или ищут хотя бы одну заполненную строку:

ЕстьДанные = Ложь;

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

Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда

ЕстьДанные = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Альтернатива без цикла — метод Итог() для числовой колонки: если сумма по колонке «Количество» равна нулю, скорее всего, содержательных данных нет. Но этот признак косвенный: нулевые количества могут быть допустимы в вашей задаче, поэтому ориентируйтесь на прикладную логику, а не только на арифметику.

Типичные ошибки при проверке таблицы на пустоту

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

Вторая ошибка — обращение к первой строке без проверки: ТаблицаЗначений[0].Номенклатура. На пустой таблице это даёт ошибку обращения за границу коллекции. Любое обращение к строке по индексу должно идти после проверки Количество().

Третья ошибка — проверка результата запроса через Выбрать() и Следующий() там, где достаточно Пустой(). Лишняя выборка не вредит, но усложняет код. Обратная ошибка — вызов Пустой() у таблицы значений: у этого объекта такого метода нет, он есть только у результата запроса.

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

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

Чтобы убедиться, что проверка работает правильно, протестируйте её на трёх наборах данных: заведомо пустой таблице, таблице с одной строкой и таблице с несколькими строками. В отладчике конфигуратора удобно смотреть содержимое таблицы через «Вычислить выражение» — достаточно ввести имя переменной и раскрыть объект.

Полезный приём при отладке — временно вывести число строк в журнал регистрации или сообщением:

Сообщить("Строк в таблице: " + ТаблицаЗначений.Количество());

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

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

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

Количество() на пустой таблице
Норма

Возвращает 0, срабатывает ветка обработки пустых данных

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

Ошибка выполнения — значит, переменная не таблица значений

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

Количество() = 1, обработка продолжается

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

Ветка пустых данных срабатывает ошибочно — проверьте логику условия

Результат запроса без записей
Норма

РезультатЗапроса.Пустой() возвращает Истина

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

Пустой() возвращает Ложь, но строк нет — проверьте, не выгружена ли таблица из другого запроса

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

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

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

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

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

Что вернёт Количество(), если таблица не создана?

Если переменная содержит Неопределено, вызов метода завершится ошибкой «Метод объекта не обнаружен». Поэтому при сомнениях в типе сначала выполняйте проверку ТипЗнч(Переменная) = Тип("ТаблицаЗначений").

Как проверить, есть ли в таблице строки с заполненным конкретным полем?

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

Нужна ли проверка на пустоту перед циклом «Для Каждого»?

Для безопасности — нет: цикл по пустой таблице просто не выполнится. Проверка нужна для логики: сообщить пользователю об отсутствии данных, прервать формирование документа или выбрать другую ветку алгоритма.

Работает ли проверка одинаково в толстом и тонком клиенте?

Да, методы Количество(), Найти() и НайтиСтроки() доступны на клиенте и на сервере. Ограничение касается только запросов: объект Запрос можно создавать только на сервере, поэтому проверка через РезультатЗапроса.Пустой() выполняется в серверном коде.

Итог

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

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