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

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

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

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

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

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

Основной способ: метод Количество()

Стандартный и единственно корректный способ проверки — вызов метода Количество(). Он возвращает число элементов в списке, и сравнение результата с нулём даёт однозначный ответ.

Список = Новый СписокЗначений;

Если Список.Количество() = 0 Тогда

Сообщить("Список пуст");

Иначе

Сообщить("Элементов: " + Список.Количество());

КонецЕсли;

Такой подход работает одинаково в толстом, тонком и веб-клиенте, на сервере и в мобильной платформе. Метод не обращается к базе данных, поэтому проверка выполняется мгновенно и безопасна для производительности даже в циклах.

bsl
Если СписокЗначений.Количество() = 0 Тогда
    Возврат; // обрабатывать нечего
КонецЕсли;

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

Частая ошибка новичков — конструкция вида Если Список = Неопределено Тогда. Переменная типа СписокЗначений содержит ссылку на объект, а не значение-перечисление. После оператора Новый СписокЗначений объект уже создан, даже если в него ничего не добавляли.

Сравнение с Неопределено имеет смысл только если переменная вообще не инициализирована — например, функция может вернуть либо список, либо Неопределено как признак отсутствия данных. В этом случае правильная проверка состоит из двух шагов: сначала на Неопределено, затем на количество элементов.

Функция ПолучитьСписокТоваров(Отбор)

Если Отбор.Пустой Тогда

Возврат Неопределено; // признак "отбор не задан"

КонецЕсли;

Список = Новый СписокЗначений;

// ... заполнение

Возврат Список;

КонецФункции;

// Проверка результата:

Результат = ПолучитьСписокТоваров(Отбор);

Если Результат = Неопределено Тогда

Сообщить("Отбор не задан");

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

Сообщить("По отбору ничего не найдено");

КонецЕсли;

Проверка смежных коллекций: массив, таблица значений, соответствие

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

Тип коллекцииПроверка на пустотуКомментарий
СписокЗначенийСписок.Количество() = 0Универсальный способ
МассивМассив.Количество() = 0Аналогично списку
ТаблицаЗначенийТаблица.Количество() = 0Считает строки
Структура / СоответствиеСтруктура.Количество() = 0Считает пары ключ-значение
Строка (список через запятую)ПустаяСтрока(Стр)Для строковых представлений

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

Проверка списка, заполненного «пустыми» элементами

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

В такой ситуации нужен обход с проверкой каждого значения:

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

Для Каждого Элемент Из Список Цикл

Если ЗначениеЗаполнено(Элемент.Значение) Тогда

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

Прервать;

КонецЕсли;

КонецЦикла;

Если Не ЕстьЗаполненные Тогда

Сообщить("Список не содержит заполненных значений");

КонецЕсли;

Функция ЗначениеЗаполнено() универсальна: она корректно обрабатывает пустые ссылки, Неопределено, пустые строки, нулевые даты и числа. Именно её стоит использовать вместо цепочки сравнений с конкретными «пустыми» значениями.

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

Проверка динамического списка и списка в форме

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

Для динамического списка корректный подход — выполнить тот же запрос с группировкой КОЛИЧЕСТВО(*) или проверить результат выборки через Выборка.Следующий(): если первый же вызов вернул Ложь, данных нет. Пытаться сосчитать строки динамического списка программным обходом не стоит — это медленно и ненадёжно.

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

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ Справочник.Номенклатура КАК Т";

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

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

Сообщить("Данные отсутствуют");

КонецЕсли;

Обратите внимание на метод Пустой() у результата запроса — это самый быстрый способ узнать, вернул ли запрос хотя бы одну строку, без построения выборки.

Маршрут решения

Как выбрать способ проверки

Переменная типа СписокЗначений, Массив или ТаблицаЗначенийИспользуйте Количество() = 0
Функция может вернуть Неопределено вместо спискаСначала проверьте на Неопределено, затем Количество()
Результат запросаИспользуйте метод Пустой() результата запроса
Строка со значениями через разделительИспользуйте ПустаяСтрока()
Список с элементами, но значения могут быть не заполненыОбойдите элементы и проверьте ЗначениеЗаполнено()

Практический порядок действий

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

Порядок проверки списка
  1. 1
    Убедитесь, что переменная инициализирована: при необходимости проверьте на Неопределено
  2. 2
    Вызовите Количество() и сравните с нулём
  3. 3
    Если элементы есть, но могут быть пустыми — обойдите список и проверьте каждое значение через ЗначениеЗаполнено()
  4. 4
    Протестируйте код на трёх случаях: пустой список, список с пустыми значениями, заполненный список

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

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

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

Пустой список
Норма

Условие Количество() = 0 срабатывает, обработка пропускается

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

Код пытается обойти несуществующие элементы

Список с пустыми значениями
Норма

ЗначениеЗаполнено() возвращает Ложь для каждого элемента

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

Пустые значения записываются в документ или регистр

Переменная = Неопределено
Норма

Проверка на Неопределено выполняется до вызова методов

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

Ошибка выполнения «Метод объекта не обнаружен»

Итоги

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

Итог

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

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

Частые вопросы

Чем отличаются Неопределено и пустой список значений?

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

Можно ли проверить список через ПустаяСтрока()?

Нет. ПустаяСтрока() работает только со строковым типом. Для СписокЗначений она всегда вернёт Ложь или вызовет ошибку приведения типов, поэтому используйте Количество() = 0.

Как проверить, есть ли в списке конкретное значение?

Используйте метод НайтиПоЗначению(): он возвращает элемент списка или Неопределено, если значение не найдено. Проверка вида Список.НайтиПоЗначению(Искомое) = Неопределено означает отсутствие значения.

Как узнать, что результат запроса пустой?

У результата запроса есть метод Пустой(): Запрос.Выполнить().Пустой() вернёт Истина, если запрос не вернул ни одной строки. Это быстрее, чем создавать выборку и проверять её.

Работает ли Количество() для динамического списка на форме?

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

Что вернёт ЗначениеЗаполнено() для пустой ссылки?

Для пустой ссылки на справочник или документ функция вернёт Ложь, для заполненной — Истина. Это удобно при проверке элементов списка, где значения могут быть не выбраны пользователем.