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

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

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

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

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

Базовый синтаксис доступа к элементу выглядит так: Значение = Массив[Индекс];. В квадратных скобках указывается либо число, либо переменная с числовым значением. Возвращаемое значение может быть любого типа — строкой, числом, ссылкой на документ, структурой и даже другим массивом, потому что массив в 1С не типизирован.

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

Базовый синтаксис: обращение к элементу по индексу

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

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

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

Массив.Добавить("Февраль");

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

ПервыйЭлемент = Массив[0]; // "Январь"

ВторойЭлемент = Массив[1]; // "Февраль"

ПоследнийЭлемент = Массив[Массив.Количество() - 1]; // "Март"

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

Обратите внимание на приём получения последнего элемента: поскольку индексация с нуля, индекс последнего элемента всегда равен Количество() - 1. Попытка обратиться к Массив[Массив.Количество()] вызовет ошибку времени выполнения.

Безопасное получение значения: проверка границ массива

Самая частая ошибка при работе с массивами — обращение по несуществующему индексу. Она возникает, когда массив пуст, когда индекс вычислен неправильно или когда данные пришли из внешнего источника и их объём неизвестен заранее.

Перед прямым обращением по индексу проверяйте количество элементов методом Количество(). Для пустого массива любое обращение по индексу недопустимо.

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

ПервыйЭлемент = Массив[0];

Иначе

ПервыйЭлемент = Неопределено;

КонецЕсли;

// Проверка произвольного индекса

Индекс = 5;

Если Индекс >= 0 И Индекс < Массив.Количество() Тогда

Значение = Массив[Индекс];

КонецЕсли;

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

Перебор элементов в цикле

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

Цикл «Для Каждого» — когда индекс не нужен

Конструкция Для Каждого Элемент Из Массив Цикл последовательно помещает каждый элемент в переменную. Это самый читаемый и безопасный способ: выход за границы массива здесь невозможен в принципе.

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

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

КонецЦикла;

Цикл со счётчиком — когда нужен индекс

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

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

Массив[Инд] = СокрЛП(Массив[Инд]); // изменение элемента по индексу

КонецЦикла;

Учтите важное ограничение цикла «Для Каждого»: переменная цикла содержит копию значения (для примитивных типов), поэтому присваивание Элемент = НовоеЗначение не изменит элемент массива. Для модификации используйте только цикл со счётчиком и обращение по индексу.

Сравнение способов обхода

Для Каждого ... Из

Подходит для чтения всех элементов. Безопасен, короткий, но не даёт индекс и не позволяет менять примитивные значения по месту.

Цикл со счётчиком 0..Количество()-1

Подходит, когда нужен индекс или изменение элементов. Требует аккуратности с границами и медленнее читается.

Методы Найти() и ВГраница()

Найти(Значение) возвращает индекс элемента или Неопределено; ВГраница() — максимальный допустимый индекс. Удобны для точечных операций без цикла.

Поиск элемента и получение значения по условию

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

Индекс = Массив.Найти("Февраль");

Если Индекс <> Неопределено Тогда

Значение = Массив[Индекс]; // "Февраль"

Иначе

Сообщить("Элемент не найден");

КонецЕсли;

Метод Найти() сравнивает значения на точное равенство, включая тип: строка "5" не будет равна числу 5. Если нужен поиск по сложному условию (например, по части строки или по свойству объекта), перебирайте массив в цикле и проверяйте условие вручную.

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

Порядок безопасного получения значения
  1. 1
    Убедитесь, что переменная инициализирована как массив (Новый Массив или результат функции, возвращающей массив)
  2. 2
    Проверьте Массив.Количество() > 0 для пустоты или Индекс < Массив.Количество() для конкретной позиции
  3. 3
    Получите значение через Массив[Индекс] или переберите элементы циклом Для Каждого
  4. 4
    Проверьте тип полученного значения перед дальнейшими операциями (ТипЗнч), если массив содержит разнородные данные
  5. 5
    При поиске по значению используйте Массив.Найти() и обязательно обрабатывайте результат Неопределено

Многомерные массивы и вложенные структуры

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

Таблица = Новый Массив;

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

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

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

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

Значение = Таблица[0][1]; // 100

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

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

Типичные ошибки и как их избежать

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

Вторая группа ошибок связана с неинициализированной переменной: если функция в какой-то ветке не вернула массив, переменная содержит Неопределено, и обращение Переменная[0] вызовет исключение. Защитный приём — проверка ТипЗнч(Переменная) = Тип("Массив") перед работой.

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

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

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

После получения значения убедитесь, что оно соответствует ожиданиям. В отладчике конфигуратора установите точку останова на строке обращения к массиву и посмотрите содержимое через «Вычислить выражение»: Массив.Количество(), Массив.ВГраница() и само значение Массив[Индекс].

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

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

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

Размер массива перед обращением
Норма

Количество() больше требуемого индекса

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

Количество() = 0 или меньше индекса — обращение вызовет ошибку

Результат метода Найти()
Норма

Возвращено число — индекс найденного элемента

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

Возвращено Неопределено — элемент отсутствует, обращаться по результату нельзя

Тип полученного значения
Норма

ТипЗнч() соответствует ожидаемому типу

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

Значение Неопределено или другого типа — данные сформированы некорректно

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

С какого индекса начинается массив в 1С?

С нуля. Первый элемент — Массив[0], последний — Массив[Массив.Количество() - 1]. Это отличается от строк табличных частей в некоторых контекстах восприятия, поэтому путаница «с 0 или с 1» — самая частая причина ошибок у начинающих.

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

Используйте Массив[Массив.ВГраница()] или Массив[Массив.Количество() - 1]. Оба варианта эквивалентны. Обязательно проверьте, что массив не пуст, иначе обращение вызовет ошибку.

Что вернёт обращение по несуществующему индексу?

Не значение, а ошибку времени выполнения «Индекс находится за границами массива», которая прервёт выполнение кода, если не обработана через Попытка/Исключение. Молчаливого возврата Неопределено, как в некоторых языках, в 1С нет.

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

Сравните индекс с границами: Если Индекс >= 0 И Индекс < Массив.Количество() Тогда ... КонецЕсли. Для поиска по значению используйте Массив.Найти(Значение) и проверяйте результат на Неопределено.

Можно ли изменить элемент массива в цикле «Для Каждого»?

Напрямую — нет: переменная цикла содержит копию значения для примитивных типов. Если элемент — объект (структура, таблица значений), его свойства менять можно. Для замены самого значения используйте цикл со счётчиком и присваивание через Массив[Инд].

Чем массив отличается от списка значений при получении элемента?

Массив возвращает значение напрямую по индексу: Массив[0]. Список значений хранит элементы как объекты, поэтому значение извлекается через Список[0].Значение или метод Список.Получить(0).Значение. Путаница этих подходов даёт ошибку обращения к свойству.

Итог

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

Значение элемента массива в 1С получают по индексу: Массив[Индекс], нумерация с нуля. Всегда проверяйте Количество() перед обращением, для обхода используйте «Для Каждого», для поиска — Найти() с проверкой на Неопределено, а элементы меняйте только через цикл со счётчиком.