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

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

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

Проверка массива на пустоту в 1С: Количество() = 0, ВГраница() = -1, типовые ошибки, примеры кода и сравнение способов для встроенного языка 1С.

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

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

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

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

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

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

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

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

Иначе

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

КонецЕсли;

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

Обратная проверка — «массив не пустой» — записывается как Если Массив.Количество() > 0 Тогда. Её удобно ставить перед циклом обработки, чтобы не выполнять лишние действия, когда данных нет:

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

Для Каждого Строка Из НайденныеСтроки Цикл

// обработка

КонецЦикла;

КонецЕсли;

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

Проверка через метод ВГраница()

Метод ВГраница() возвращает индекс последнего элемента массива. Поскольку индексация в 1С начинается с нуля, для пустого массива метод вернёт -1. Это второй корректный способ проверки:

Если Массив.ВГраница() = -1 Тогда

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

КонецЕсли;

По смыслу ВГраница() = -1 и Количество() = 0 эквивалентны: между ними всегда выполняется равенство ВГраница() = Количество() - 1. Разницы в производительности на практике нет, выбор — вопрос стиля команды.

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

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

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

Наиболее читаемый вариант, рекомендуется для нового кода. Ограничение: падает с ошибкой, если переменная не массив.

ВГраница() = -1

Эквивалентная альтернатива, удобна тем, кто работает с индексами. Менее очевидна при беглом чтении кода.

ТипЗнч() + Количество()

Полная защита, когда переменная может содержать Неопределено или другой тип. Требует двух условий, код длиннее.

Защита от Неопределено и неверного типа

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

Надёжная проверка строится в два этапа — сначала тип, потом размер:

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

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

// работаем с элементами

Иначе

// данных нет или вернулось не массив

КонецЕсли;

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

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

Возврат;

КонецЕсли;

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

Возврат;

КонецЕсли;

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

Типовой пример: функция проверки массива

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

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

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

Возврат Истина;

КонецЕсли;

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

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

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

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

ВызватьИсключение "Ожидался массив, получено: " + ТипЗнч(Значение);

КонецЕсли;

Порядок действий при проверке массива
  1. 1
    Убедитесь, что переменная инициализирована и содержит массив (ТипЗнч() при сомнениях)
  2. 2
    Проверьте размер: Массив.Количество() = 0 или Массив.ВГраница() = -1
  3. 3
    В ветке «пусто» предусмотрите понятное действие: сообщение, возврат, значение по умолчанию
  4. 4
    Проверьте код на тестовых данных: пустой массив, массив с одним элементом, Неопределено
  5. 5
    Убедитесь, что ветка с обходом массива не выполняет лишних действий при пустом результате

Отличие пустого массива от массива с «пустыми» значениями

Пустой массив и массив, заполненный пустыми значениями, — разные вещи. Массив из трёх элементов Неопределено имеет Количество() = 3, и проверка на пустоту вернёт «ложь», хотя полезных данных в нём нет.

Если массив заполняется в цикле условно, перед обработкой имеет смысл проверять сами элементы:

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

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

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

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

Прервать;

КонецЕсли;

КонецЦикла;

Функция ЗначениеЗаполнено() корректно оценивает Неопределено, пустые строки, нулевые даты и пустые ссылки. Но помните: число 0 она считает незаполненным, что не всегда желательно в расчётных алгоритмах — там проверяйте конкретное условие.

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

Массивы в запросах и других объектах

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

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

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

Возврат Новый Массив;

КонецЕсли;

МассивДанных = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка");

Такой приём — возврат пустого массива вместо Неопределено — делает поведение функции предсказуемым. Вызывающий код всегда получает массив и проверяет его одной строкой.

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

Проверка результата и контрольные точки

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

Метод Очистить() удаляет все элементы, и Количество() после него возвращает 0 — то есть массив снова становится «пустым», оставаясь валидным объектом. Это отличается от присвоения переменной Неопределено, после которого обращение к методам уже невозможно.

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

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

Новый массив без добавлений
Норма

Количество() = 0, ВГраница() = -1

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

Любое другое значение — массив заполнялся ранее

Массив после Очистить()
Норма

Количество() = 0, объект остаётся доступен

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

Ошибка при обращении — переменной присвоено Неопределено вместо очистки

Ветка кода при пустом массиве
Норма

Выполняется задуманное действие: сообщение, возврат, значение по умолчанию

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

Код молча продолжает работу или падает с ошибкой индекса

Функция, возвращающая массив
Норма

Во всех ветках возвращается массив, пусть и пустой

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

В части веток возвращается Неопределено без обработки на стороне вызова

Итог

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

Проверка массива на пустоту в 1С — это условие Массив.Количество() = 0 или эквивалентное Массив.ВГраница() = -1. Если переменная может содержать Неопределено, сначала проверяйте тип через ТипЗнч(). Проектируйте функции так, чтобы они всегда возвращали массив, — это упрощает весь вызывающий код.

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

Чем отличается Количество() = 0 от ВГраница() = -1?

Функционально — ничем: оба условия истинны для пустого массива, так как ВГраница() всегда равен Количество() минус один. Разница только в читаемости: сравнение с нулём понимается быстрее, поэтому для нового кода обычно выбирают Количество() = 0.

Можно ли проверить массив через ЗначениеЗаполнено()?

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

Что будет, если обойти пустой массив циклом без проверки?

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

Почему возникает ошибка «Метод объекта не обнаружен: Количество»?

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

Как проверить, что массив содержит хотя бы один заполненный элемент?

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

Работает ли проверка Количество() для структуры или соответствия?

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