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

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

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

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

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

Для получения размера массива встроенный язык предоставляет метод Количество(). Он работает одинаково в тонком, толстом и веб-клиенте, а также на сервере, и доступен во всех актуальных версиях платформы. Важно понимать, что индексация массива в 1С начинается с нуля, поэтому индекс последнего элемента всегда на единицу меньше количества элементов.

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

Базовый способ: метод Количество()

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

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

МассивТоваров.Добавить("Номенклатура 1");

МассивТоваров.Добавить("Номенклатура 2");

МассивТоваров.Добавить("Номенклатура 3");

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

// Размер = 3

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

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

Количество элементов и верхняя граница: в чем разница

Наряду с Количество() у массива есть метод ВГраница(), который возвращает максимально допустимый индекс. Поскольку индексация идет с нуля, выполняется соотношение: ВГраница() = Количество() - 1. Для массива из трех элементов Количество() вернет 3, а ВГраница() — 2.

Для пустого массива поведение методов различается: Количество() вернет 0, а ВГраница() вернет -1. Это корректное поведение, и его удобно использовать как признак пустого массива при обходе по индексам.

МетодЧто возвращаетМассив из 3 элементовПустой массив
Количество()Число элементов30
ВГраница()Максимальный индекс2-1

Выбор метода зависит от задачи: для проверки «есть ли хотя бы один элемент» логичнее Количество(), для цикла по индексам — ВГраница(), потому что он сразу дает последний допустимый индекс.

Использование в циклах: три рабочих шаблона

Цикл «Для каждого» — предпочтительный вариант

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

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

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

КонецЦикла;

Цикл по индексам через ВГраница()

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

Для Инд = 0 По МассивТоваров.ВГраница() Цикл

МассивТоваров[Инд] = СокрЛП(МассивТоваров[Инд]);

КонецЦикла;

Цикл через Количество() с вычитанием единицы

Допустимый, но более громоздкий вариант. Ошибка здесь возникает, если забыть вычесть единицу: Массив[Массив.Количество()] — это обращение за границу массива.

КоличествоЭлементов = МассивТоваров.Количество();

Для Инд = 0 По КоличествоЭлементов - 1 Цикл

Сообщить(МассивТоваров[Инд]);

КонецЦикла;

Типичные ошибки
01
Цикл «Для Инд = 0 По Массив.Количество()» без вычитания единицы — обращение к несуществующему элементу и ошибка «Индекс находится за границами массива».
02
Вызов Количество() у переменной со значением Неопределено — исключение «Метод объекта не обнаружен»; сначала проверяйте тип через ТипЗнч().
03
Удаление элементов в прямом цикле по индексам — размер массива меняется на ходу, часть элементов пропускается; удаляйте в обратном порядке или собирайте новый массив.
04
Считать, что ВГраница() возвращает количество элементов — для пустого массива это -1, а не 0.

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

Стандартная проверка перед обработкой массива выглядит так:

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

Возврат; // нечего обрабатывать

КонецЕсли;

Такая проверка обязательна, если массив формируется динамически: результатом запроса, разбором строки, отбором по условию. Обращение к элементу пустого массива, например МассивТоваров[0], приведет к ошибке выполнения.

Если переменная может содержать не массив, а Неопределено, проверку нужно делать в два этапа: сначала тип, потом размер.

Если ТипЗнч(Результат) = Тип("Массив")

И Результат.Количество() > 0 Тогда

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

КонецЕсли;

Количество элементов вложенных и многомерных структур

Встроенного многомерного массива в 1С нет: многомерность эмулируется массивом массивов. Метод Количество() у внешнего массива вернет число вложенных массивов, а размер каждого внутреннего нужно получать отдельно.

ТаблицаДанных = Новый Массив; // массив массивов

Строка1 = Новый Массив;

Строка1.Добавить("А");

Строка1.Добавить("Б");

ТаблицаДанных.Добавить(Строка1);

ЧислоСтрок = ТаблицаДанных.Количество(); // 1

ЧислоКолонок = ТаблицаДанных[0].Количество(); // 2

Если требуется общее количество всех элементов во всех вложенных массивах, напишите функцию с обходом и суммированием. Готового метода для этого в платформе нет.

Практические сценарии использования

Размер массива чаще всего нужен в следующих задачах: контроль, что запрос вернул данные; ограничение числа обрабатываемых элементов (например, взять первые N); формирование сообщений пользователю вида «Найдено записей: 12»; проверка соответствия двух массивов по длине перед попарной обработкой.

Если МассивКлючей.Количество() <> МассивЗначений.Количество() Тогда

ВызватьИсключение "Размеры массивов не совпадают";

КонецЕсли;

Для сообщений пользователю не забывайте о склонении числительных: платформа предоставляет функцию ЧислоПрописью() и шаблоны строк с параметрами, но для корректных форм «1 элемент / 2 элемента / 5 элементов» потребуется отдельная обработка или функция из типовых общих модулей.

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

Производительность и ограничения

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

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

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

Как выбрать подход

Нужно просто узнать размер или проверить на пустотуИспользуйте Массив.Количество()
Нужен обход по индексам с изменением элементовЦикл Для Инд = 0 По Массив.ВГраница()
Нужно удалить часть элементовОбратный цикл по индексам или сборка нового массива
Данные еще в базе и нужен только их размерПосчитайте в запросе через КОЛИЧЕСТВО() вместо выгрузки в массив
Итог

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

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

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

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

Количество() возвращает число элементов массива, ВГраница() — максимальный допустимый индекс, который на единицу меньше. Для пустого массива Количество() дает 0, а ВГраница() — -1, что удобно использовать как признак пустой коллекции в циклах.

Как узнать количество строк таблицы значений?

Тем же методом: ТаблицаЗначений.Количество() вернет число строк. Для подсчета колонок используйте ТаблицаЗначений.Колонки.Количество().

Почему возникает ошибка «Индекс находится за границами массива»?

Чаще всего цикл построен как «По Массив.Количество()» без вычитания единицы: последняя итерация обращается к индексу, которого не существует. Замените верхнюю границу на ВГраница() или используйте обход «Для каждого».

Можно ли вызвать Количество() у результата запроса?

У самого результата запроса — нет. Сначала проверьте его через Результат.Пустой(), либо выгрузите данные: Выборка.Количество() для выборки или Результат.Выгрузить().Количество() для таблицы значений.

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

Встроенного метода фильтрации нет. Организуйте обход «Для каждого» с переменной-счетчиком, увеличивая ее при выполнении условия. Если данные берутся из базы, эффективнее посчитать нужные записи запросом с отбором.

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

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