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