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