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