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

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

Как посчитать количество элементов в массиве 1С

Как узнать количество элементов массива в 1С: метод Количество(), проверка на пустоту, перебор через цикл, отличия от списка значений и таблицы значений, типичные ошибки.

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

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

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

Базовый синтаксис метода Количество()

Метод вызывается у переменной, содержащей массив, и не принимает параметров. Результат — целое число от нуля и выше. Пример:

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

МойМассив.Добавить("Первый");

МойМассив.Добавить("Второй");

Размер = МойМассив.Количество(); // 2

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

Для многомерных массивов метод возвращает размер по первому измерению. Чтобы узнать размер вложенного массива, нужно обратиться к конкретному элементу: МойМассив[0].Количество().

Проверка массива на пустоту

Самая частая задача — убедиться, что в массиве есть данные, прежде чем запускать обработку. Каноническая проверка выглядит так:

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

// данных нет, обработку пропускаем

Возврат;

КонецЕсли;

Такая проверка особенно важна, когда массив формируется динамически — например, результатом отбора строк табличной части или разбором строки через СтрРазделить. Если входные данные пустые, массив окажется пустым, и попытка обратиться к МойМассив[0] завершится ошибкой выполнения.

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

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

// безопасная обработка

КонецЕсли;

Перебор элементов с использованием размера массива

Классический цикл по индексам строится от нуля до Количество() - 1:

Для Индекс = 0 По МойМассив.Количество() - 1 Цикл

Сообщить(МойМассив[Индекс]);

КонецЦикла;

Если внутри цикла элементы не удаляются, удобнее цикл Для Каждого — он короче и исключает ошибку с границами:

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

Сообщить(Элемент);

КонецЦикла;

Цикл по индексам оправдан в двух ситуациях: когда нужен сам номер элемента (например, для вывода нумерованного списка) и когда элементы удаляются в процессе обхода. При удалении перебор ведут в обратном порядке, чтобы сдвиг индексов не ломал логику:

Для Индекс = 0 По МойМассив.Количество() - 1 Цикл

ТекущийИндекс = МойМассив.Количество() - 1 - Индекс;

Если НужноУдалить(МойМассив[ТекущийИндекс]) Тогда

МойМассив.Удалить(ТекущийИндекс);

КонецЕсли;

КонецЦикла;

Безопасный обход массива
  1. 1
    Убедитесь, что переменная содержит массив (ТипЗнч при необходимости)
  2. 2
    Проверьте, что Количество() больше нуля
  3. 3
    Выберите цикл: Для Каждого — для чтения, по индексам — когда нужен номер или удаление
  4. 4
    При удалении элементов перебирайте массив с конца
  5. 5
    После цикла при необходимости проверьте итоговый размер массива

Отличия от других коллекций 1С

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

КоллекцияМетодОсобенности
МассивКоличество()Индексация с нуля, фиксированный порядок
Список значенийКоличество()Элементы имеют представление и пометку
Таблица значенийКоличество()Считает строки; колонки считаются отдельно через Колонки.Количество()
СоответствиеКоличество()Считает пары «ключ-значение», обращение по ключу
СтруктураКоличество()Считает ключи, порядок не гарантирован
СтрокаСтрДлина()Отдельный метод, Количество() у строки нет

Обратите внимание на последнюю строку: для подсчёта символов в строке используется функция СтрДлина(), а не метод. Попытка вызвать Строка.Количество() приведёт к ошибке «Метод объекта не обнаружен».

Подсчёт элементов по условию

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

Счётчик = 0;

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

Если Элемент = ИскомоеЗначение Тогда

Счётчик = Счётчик + 1;

КонецЕсли;

КонецЦикла;

Для массива структур условие проверяют по свойству: Если Элемент.Статус = "Активен" Тогда. Такой подход универсален и не требует создания промежуточных коллекций.

Альтернатива — метод Найти(Значение), который возвращает индекс первого вхождения или Неопределено. Он отвечает на вопрос «есть ли значение», но не считает количество вхождений, поэтому для подсчёта повторов всё равно нужен цикл.

Маршрут решения

Как выбрать способ подсчёта

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

Типичные ошибки и ограничения

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

Вторая группа ошибок связана с изменением массива во время перебора. Если удалять элементы в прямом цикле Для Каждого или в восходящем цикле по индексам, часть элементов будет пропущена, а границы цикла станут некорректными. Удаление выполняют только в обратном порядке.

Третья группа — ожидание, что Количество() у массива, созданного как Новый Массив(5), вернёт число заполненных элементов. Метод вернёт 5 независимо от того, записывались ли значения. Если важна «наполненность», её отслеживают отдельным счётчиком при добавлении.

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

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

Проверить корректность подсчёта проще всего через вывод значения: Сообщить("Элементов: " + МойМассив.Количество()) — или через окно «Вычислить выражение» в конфигураторе при остановке на точке останова. В отладчике видно и само содержимое массива, что позволяет сверить размер с фактическими данными.

Полезный приём — выводить размер массива на входе и на выходе процедуры, если логика сложная. Расхождение ожидаемого и фактического числа элементов сразу указывает на этап, где элементы теряются или добавляются лишний раз.

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

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

Размер массива в отладчике
Норма

Количество() совпадает с числом видимых элементов

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

Размер больше числа осмысленных значений — массив создан с фиксированной ёмкостью

Обращение к последнему элементу
Норма

Используется индекс Количество() - 1

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

Используется индекс Количество() — будет ошибка

Поведение при пустом массиве
Норма

Обработка корректно пропускается условием

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

Код падает с ошибкой обращения по индексу

Результат после удалений
Норма

Итоговый размер уменьшился на число удалённых элементов

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

Размер не изменился или элементы удалены не те — перебор шёл в прямом порядке

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

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

Метод ВГраница() возвращает индекс последнего элемента, то есть Количество() - 1. Для пустого массива ВГраница() вернёт -1. Используйте ВГраница() в циклах — код читается яснее: Для И = 0 По МойМассив.ВГраница() Цикл.

Работает ли Количество() на тонком клиенте?

Да. Массив — сериализуемый тип, доступный и на клиенте, и на сервере. Метод Количество() выполняется локально в любом контексте и не требует серверного вызова.

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

Метод Количество() у внешнего массива возвращает число строк (размер первого измерения). Размер каждой вложенной строки получают отдельно: МойМассив[0].Количество(). Общее число элементов при необходимости суммируют в цикле по всем вложенным массивам.

Можно ли узнать количество без цикла, если нужен отбор по условию?

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

Что вернёт Количество() для массива из СтрРазделить по пустой строке?

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

Итог

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

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