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