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

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

Как проверить, что значение является массивом в 1С

Как проверить, что переменная является массивом в 1С: ТипЗначения, ТипЗнч, сравнение с Тип("Массив"), проверка фиксированного массива и типичные ошибки.

При разработке на встроенном языке 1С регулярно возникает задача: перед обработкой значения убедиться, что оно действительно является массивом. Это особенно важно в универсальных процедурах, обработке результатов запросов, разборе JSON-данных и обмене между подсистемами, где тип параметра заранее не гарантирован.

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

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

Основной способ: ТипЗнч и сравнение с Тип("Массив")

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

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

// Значение — массив, можно обходить элементы

Для Каждого Элемент Из Значение Цикл

// обработка элемента

КонецЦикла;

КонецЕсли;

Функция ТипЗнч() возвращает объект типа «Тип», а функция Тип() по строковому имени возвращает тот же объект для сравнения. Сравнение типов в 1С выполняется по идентичности, поэтому оператор равенства работает корректно.

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

bsl
Функция ЭтоМассив(Значение) Экспорт
	Возврат ТипЗнч(Значение) = Тип("Массив");
КонецФункции

Альтернатива: ОписаниеТипов и метод СодержитТип

Второй подход — сформировать объект ОписаниеТипов и проверить, входит ли тип значения в это описание:

ОписаниеМассива = Новый ОписаниеТипов("Массив");

Если ОписаниеМассива.СодержитТип(ТипЗнч(Значение)) Тогда

// Значение — массив

КонецЕсли;

Этот способ оправдан, когда нужно проверить значение на соответствие сразу нескольким допустимым типам. Например, процедура может принимать либо массив, либо список значений:

Описание = Новый ОписаниеТипов("Массив,СписокЗначений");

Если Описание.СодержитТип(ТипЗнч(Значение)) Тогда

// допустимый тип коллекции

КонецЕсли;

Для одиночной проверки «это массив или нет» метод избыточен: прямое сравнение через ТипЗнч() короче и читается проще. ОписаниеТипов стоит использовать там, где список допустимых типов формируется динамически.

Фиксированный массив — отдельный тип

Частая причина «не срабатывающей» проверки — фиксированный массив. В 1С ФиксированныйМассив — это самостоятельный тип, и сравнение с Тип("Массив") для него вернёт Ложь.

Фиксированные массивы встречаются в результатах некоторых платформенных методов, в параметрах сеанса, в данных, прошедших через сериализацию, и в ряде механизмов БСП. Если код должен принимать обе разновидности, проверяйте оба типа:

ТипЗначения = ТипЗнч(Значение);

Если ТипЗначения = Тип("Массив")

Или ТипЗначения = Тип("ФиксированныйМассив") Тогда

// коллекция-массив, обход через Для Каждого работает

КонецЕсли;

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

Проверка массива в типовых сценариях

Результат чтения JSON

При разборе JSON через ПрочитатьJSON() структура данных зависит от содержимого: объект превращается в Соответствие или Структуру, а JSON-массив — в Массив. Если поле может содержать как одиночное значение, так и список, проверка типа обязательна:

Данные = ПрочитатьJSON(ЧтениеJSON);

Если ТипЗнч(Данные.Получить("Товары")) = Тип("Массив") Тогда

Для Каждого СтрокаТовара Из Данные["Товары"] Цикл

// обработка

КонецЦикла;

КонецЕсли;

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

Если процедура принимает «либо одну ссылку, либо массив ссылок», удобно нормализовать вход: одиночное значение обернуть в массив, а дальше работать единообразно:

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

Временный = Новый Массив;

Временный.Добавить(Параметр);

Параметр = Временный;

КонецЕсли;

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

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

Порядок действий
  1. 1
    Получите тип значения: ТипЗнч(Значение)
  2. 2
    Сравните его с Тип("Массив")
  3. 3
    Если допустим фиксированный массив — добавьте сравнение с Тип("ФиксированныйМассив")
  4. 4
    Проверьте, что массив не пуст: Значение.Количество() > 0
  5. 5
    Только после этого обращайтесь к элементам по индексу или обходите циклом

Чем массив отличается от других коллекций

Проверка «это массив» часто стоит в контексте выбора между несколькими типами коллекций. Краткое сопоставление помогает правильно построить ветвление:

ТипИмя для Тип()Ключевое отличие
МассивМассивИзменяемый, доступ по числовому индексу
ФиксированныйМассивФиксированныйМассивТолько чтение, нельзя добавлять элементы
СписокЗначенийСписокЗначенийЭлементы с представлением и пометкой
СтруктураСтруктураДоступ по именованным ключам
СоответствиеСоответствиеКлючи произвольного типа
ТаблицаЗначенийТаблицаЗначенийСтроки с колонками, не массив

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

Сравнение вариантов

ТипЗнч(З) = Тип("Массив")

Основной способ для одиночной проверки. Простой и читаемый, но не покрывает ФиксированныйМассив

ОписаниеТипов.СодержитТип()

Подходит для проверки по списку допустимых типов. Избыточен для одной проверки

Попытка-обход-Исключение

Допустим как крайняя мера в универсальном коде, но скрывает ошибки и затрудняет отладку

Типичные ошибки при проверке

Первая распространённая ошибка — попытка проверить тип через строковое представление, например сравнивая результат Строка(ТипЗнч(Значение)) с текстом «Массив». Такой подход хрупок: строковое представление типа не является гарантированным интерфейсом и может отличаться в разных контекстах.

Вторая ошибка — забыть про фиксированный массив и потерять валидные данные в универсальной обработке. Третья — после проверки типа сразу обратиться к Значение[0] без проверки Количество(): пустой массив — это валидный массив, но обращение к первому элементу вызовет ошибку индекса.

Типичные ошибки
01
Сравнение только с Тип("Массив") — фиксированный массив не проходит проверку и данные теряются
02
Обращение к Значение[0] без проверки Количество() — ошибка индекса на пустом массиве
03
Сравнение типов через строковое представление — нестабильный и нечитаемый код
04
Проверка ВГраница() до проверки типа — падение на значениях, не являющихся коллекциями

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

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

Для быстрой диагностики в рабочем коде полезно логировать фактический тип при несоответствии ожиданию:

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

ЗаписьЖурналаРегистрации("ОбработкаДанных",

УровеньЖурналаРегистрации.Предупреждение,,,

"Ожидался Массив, получен тип: " + Строка(ТипЗнч(Значение)));

КонецЕсли;

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

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

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

Тип в отладчике
Норма

Отображается «Массив» или «Фиксированный массив»

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

Другой тип — значение не является массивом

Количество элементов
Норма

Количество() >= 0, обход циклом работает

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

Ошибка при вызове Количество() — тип не коллекция

Обход Для Каждого
Норма

Цикл выполняется без исключений

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

Ошибка итератора — проверьте фактический тип

Итог

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

Проверка «это массив» в 1С выполняется через ТипЗнч(Значение) = Тип("Массив"). Не забывайте про отдельный тип ФиксированныйМассив, проверяйте количество элементов перед обращением по индексу и избегайте сравнения типов по строковому представлению.

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

Почему ТипЗнч(Значение) = Тип("Массив") возвращает Ложь, хотя данные выглядят как список?

Скорее всего, значение имеет тип ФиксированныйМассив, СписокЗначений или колонка таблицы значений. Посмотрите фактический тип в отладчике через ТипЗнч() и добавьте сравнение с нужным типом.

Можно ли проверить массив через Попытка/Исключение?

Технически да: обернуть обход в Попытку и перехватить ошибку. Но это антипаттерн — исключения медленнее обычного сравнения типов и маскируют реальные ошибки внутри цикла. Используйте ТипЗнч().

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

После проверки типа вызовите метод Количество(): Если Значение.Количество() > 0 Тогда ... Обращение к элементу по индексу без этой проверки на пустом массиве вызовет ошибку.

Чем ФиксированныйМассив отличается от Массива?

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

Работает ли проверка типа на клиенте и на сервере одинаково?

Да, функции ТипЗнч() и Тип() доступны во всех контекстах встроенного языка — тонкий клиент, толстый клиент, веб-клиент, сервер. Синтаксис проверки идентичен.

Как проверить тип элементов внутри массива?

Массив в 1С не типизирован — элементы могут быть разных типов. Проверяйте каждый элемент в цикле через ТипЗнч(Элемент) перед использованием, если состав не гарантирован.