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