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