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