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