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