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

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

Как проверить, пустой ли массив в 1С

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

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

Проверка на пустоту в 1С сводится к вызову метода Количество() и сравнению результата с нулём. Однако на практике есть нюансы: переменная может быть не массивом, а значением Неопределено, массив может содержать «пустые» элементы, а функция может вернуть Null из запроса. Ниже разобраны все рабочие способы проверки, их ограничения и типичные ошибки.

Базовый способ: метод Количество()

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

Массив = Новый Массив;

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

Сообщить("Массив пустой");

Иначе

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

КонецЕсли;

Обратная проверка — «массив заполнен» — записывается через <> 0 или > 0:

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

// безопасно обращаемся к элементам

ПервыйЭлемент = Массив[0];

КонецЕсли;

Такая проверка обязательна перед любым обращением по индексу: Массив[0] у пустого массива вызовет исключение. Цикл Для Каждого по пустому массиву просто не выполнится ни разу — это безопасно, но если логика требует отдельной реакции на пустой результат (например, сообщить пользователю, что ничего не найдено), проверка нужна явно.

1c
Если Массив.Количество() = 0 Тогда
    Сообщить("Массив пустой");
КонецЕсли;

Проверка с защитой от Неопределено и других типов

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

Результат = НайтиДокументы(Период);

Если ТипЗнч(Результат) = Тип("Массив") Тогда

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

Сообщить("Документы не найдены");

КонецЕсли;

Иначе

Сообщить("Функция не вернула массив");

КонецЕсли;

Универсальную проверку удобно оформить отдельной функцией в общем модуле, чтобы не дублировать код по конфигурации:

Функция МассивПустой(Значение) Экспорт

Если ТипЗнч(Значение) <> Тип("Массив") Тогда

Возврат Истина; // не массив — считаем «пустым»

КонецЕсли;

Возврат Значение.Количество() = 0;

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

Решение о том, считать ли не-массив «пустым», зависит от логики прикладного кода. В некоторых случаях корректнее вызвать исключение, потому что получение Неопределено вместо массива — это нарушение контракта функции, а не штатная ситуация.

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

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

Результат запроса

Метод Выгрузить() результата запроса возвращает таблицу значений, а не массив. У таблицы значений тоже есть метод Количество(), поэтому приём тот же. Но у самого результата запроса есть более удобный метод Пустой():

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

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

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

Возврат;

КонецЕсли;

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

Выгрузка колонки в массив

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

МассивСсылок = ТаблицаДокументов.ВыгрузитьКолонку("Ссылка");

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

Возврат; // обрабатывать нечего

КонецЕсли;

Методы поиска

Метод НайтиСтроки() таблицы значений и табличной части всегда возвращает массив — пустой, если ничего не найдено. Здесь проверка Количество() = 0 безопасна без дополнительной проверки типа:

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

Новый Структура("Номенклатура", ИскомыйТовар));

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

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

КонецЕсли;

Массив с «пустыми» элементами — это не пустой массив

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

Массив = Новый Массив;

Массив.Добавить(Неопределено);

Массив.Добавить("");

Сообщить(Массив.Количество()); // 2 — массив НЕ пустой

Если по логике задачи такие элементы не должны учитываться, их нужно отфильтровать перед проверкой. Удобно собрать новый массив только из значимых элементов:

ЗначимыеЭлементы = Новый Массив;

Для Каждого Элемент Из ИсходныйМассив Цикл

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

ЗначимыеЭлементы.Добавить(Элемент);

КонецЕсли;

КонецЦикла;

Если ЗначимыеЭлементы.Количество() = 0 Тогда

Сообщить("Нет ни одного заполненного элемента");

КонецЕсли;

Функция ЗначениеЗаполнено() возвращает Ложь для Неопределено, Null, пустых строк, пустых ссылок, нулевых дат и пустых массивов. Учтите, что число 0 она считает заполненным значением — если ноль в вашей задаче «пустое» значение, проверяйте его отдельно.

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

Сравнение способов проверки

Разные приёмы проверки отличаются по надёжности и области применения. Сопоставление поможет выбрать подходящий вариант.

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

Как выбрать действие

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

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

Убедиться, что проверка работает правильно, можно в отладчике конфигуратора. Поставьте точку останова на строке с условием и посмотрите значение переменной в табло: для массива отображается количество элементов, а командой Вычислить выражение можно выполнить Массив.Количество() и увидеть фактическое число.

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

Сообщить("Тип: " + ТипЗнч(Результат)

+ ", количество: "

+ ?(ТипЗнч(Результат) = Тип("Массив"),

Результат.Количество(), "н/д"));

Такой вывод сразу показывает, что именно пришло в переменную: массив с нулём элементов, Неопределено или значение другого типа. Это ускоряет поиск причины, когда условие «не срабатывает» — в большинстве случаев оказывается, что переменная содержит не то, что ожидал разработчик.

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

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

Значение в отладчике
Норма

Тип «Массив», указано количество элементов

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

Неопределено или другой тип — проверка Количество() упадёт

Выполнение условия Количество() = 0
Норма

Ветка «пусто» срабатывает только при нуле элементов

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

Ветка срабатывает при заполненном массиве — ищите ошибку в логике заполнения

Обращение к элементам после проверки
Норма

Код работает без исключений

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

Ошибка «Индекс за границами массива» — проверка пропущена или неверна

Границы применения и смежные типы

Описанные приёмы работают одинаково в толстом, тонком и веб-клиенте, на сервере и в внешних обработках — тип «Массив» доступен везде. Отличий между управляемым и обычным приложением в этой части нет.

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

Итог

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

Пустоту массива проверяют через Массив.Количество() = 0. Если переменная может оказаться Неопределено, сначала проверяйте тип через ТипЗнч(). Для результата запроса используйте метод Пустой(). Помните: массив с пустыми элементами не считается пустым — такие значения фильтруют через ЗначениеЗаполнено().

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

Можно ли сравнить массив с Неопределено для проверки на пустоту?

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

Что вернёт Цикл «Для Каждого» по пустому массиву — будет ли ошибка?

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

Как проверить, что функция вернула именно пустой массив, а не Неопределено?

Комбинированным условием: ТипЗнч(Результат) = Тип("Массив") И Результат.Количество() = 0. Если ТипЗнч вернёт другой тип — значит, функция вернула Неопределено или что-то ещё, и это нужно обработать отдельно.

Есть ли у массива метод Пустой(), как у результата запроса?

Нет, у типа «Массив» такого метода нет. Используйте сравнение Количество() = 0. Метод Пустой() существует только у результата запроса.

Как проверить на пустоту фиксированный массив?

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

Что быстрее: Количество() = 0 или обход массива с флагом?

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