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

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

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

Как получить последний элемент массива в 1С: через индекс ВГраница(), цикл Для Каждого, безопасная проверка пустого массива. Примеры кода и типичные ошибки.

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

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

Ниже разобраны все рабочие способы: базовый через ВГраница(), безопасный с проверкой на пустоту, через цикл Для Каждого, а также типичные ошибки и способы проверки результата.

Базовый способ: обращение по индексу через ВГраница()

Метод ВГраница() возвращает максимально допустимый индекс массива. Поскольку индексация начинается с нуля, верхняя граница всегда на единицу меньше количества элементов. Для массива из пяти элементов ВГраница() вернёт 4.

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

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

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

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

Последний = Массив[Массив.ВГраница()];

// Последний = "Третий"

Эквивалентный вариант — вычислить индекс через Количество():

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

Оба варианта дают одинаковый результат. Форма с ВГраница() читается лучше и явно выражает намерение — взять верхнюю границу, поэтому в типовом коде чаще встречается именно она. Разницы в производительности между ними практически нет.

Безопасное получение с проверкой на пустой массив

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

Поэтому в прикладном коде обращение к последнему элементу всегда оборачивают проверкой:

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

Последний = Массив[Массив.ВГраница()];

Иначе

Последний = Неопределено;

КонецЕсли;

Для повторяющегося сценария удобно оформить функцию в общем модуле:

Функция ПоследнийЭлементМассива(Массив) Экспорт

Если Массив = Неопределено Или Массив.Количество() = 0 Тогда

Возврат Неопределено;

КонецЕсли;

Возврат Массив[Массив.ВГраница()];

КонецФункции

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

Получение последнего элемента через цикл Для Каждого

Иногда индекс недоступен или неудобен — например, вы работаете с коллекцией, где нет прямого обращения по индексу, но нужен именно последний обработанный элемент. В этом случае переменную цикла можно использовать после его завершения: в ней останется последнее значение.

Последний = Неопределено;

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

Последний = Элемент;

КонецЦикла;

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

Похожие задачи: последние N элементов и удаление последнего

Взять несколько последних элементов

Если нужен не один элемент, а «хвост» массива, используют цикл с вычисленным начальным индексом:

КоличествоНужных = 3;

НачальныйИндекс = Макс(Массив.Количество() - КоличествоНужных, 0);

Для Индекс = НачальныйИндекс По Массив.ВГраница() Цикл

// обработка Массив[Индекс]

КонецЦикла;

Функция Макс() здесь защищает от ситуации, когда элементов в массиве меньше, чем запрошено: тогда обработаются все имеющиеся.

Удалить последний элемент

Для удаления последнего элемента есть метод Удалить() с указанием индекса:

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

Массив.Удалить(Массив.ВГраница());

КонецЕсли;

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

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

Сравнение способов получения последнего элемента

СпособКогда применятьОграничение
Массив[Массив.ВГраница()]Стандартный случай, массив гарантированно непустойИсключение на пустом массиве
Проверка Количество() + ВГраница()Универсальный безопасный вариантЧуть больше кода
Цикл Для КаждогоКоллекции без доступа по индексуПолный перебор, медленнее
Функция-обёртка в общем модулеМногократное использование в проектеТребует изменения конфигурации
Типичные ошибки
01
Обращение по индексу без проверки пустоты — исключение «Индекс за границами массива»
02
Использование Количество() вместо Количество() - 1 — выход за верхнюю границу на единицу
03
Перебор всего массива циклом ради последнего элемента — лишняя нагрузка на больших данных
04
Хранение массива в реквизите без инициализации — Неопределено вместо массива и ошибка при вызове ВГраница()

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

Убедиться, что получен именно последний элемент, проще всего в отладчике: поставьте точку останова после присваивания и посмотрите значение переменной в табло. Дополнительно полезно вывести Массив.Количество() — если оно равно нулю, переменная должна содержать Неопределено, а не значение.

Для быстрой проверки вне отладчика используют Сообщить() или запись в журнал регистрации:

Сообщить("Всего: " + Массив.Количество() + ", последний: " + Последний);

Если элементы массива — объекты сложных типов (структуры, ссылки), проверяйте ключевое поле элемента, а не строковое представление объекта целиком.

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

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

Количество элементов
Норма

Количество() > 0, элемент получен

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

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

Значение переменной после присваивания
Норма

Содержит значение последнего элемента

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

Неопределено при непустом массиве — ошибка в индексе

Индекс в выражении
Норма

ВГраница() или Количество() - 1

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

Количество() без вычитания единицы

Часто задаваемые вопросы

Что вернёт ВГраница() для пустого массива?

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

Можно ли получить последний элемент без индекса?

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

Чем ВГраница() отличается от Количество()?

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

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

Структура и соответствие не гарантируют порядок обхода, поэтому понятие «последний элемент» для них не определено. Если порядок важен, используйте массив или список значений.

Работает ли способ с таблицей значений?

Да, похожим образом: Таблица[Таблица.Количество() - 1] вернёт последнюю строку. У таблицы значений нет метода ВГраница(), поэтому индекс вычисляют через Количество() с вычитанием единицы и той же проверкой на пустоту.

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

В языке запросов нет прямой операции «последний элемент». Обычно выбирают первую строку с сортировкой по убыванию ключевого поля (например, даты или номера) и ограничением ПЕРВЫЕ 1.

Итог

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

Последний элемент массива получают по индексу Массив[Массив.ВГраница()]. Перед обращением проверяйте Массив.Количество() > 0, иначе пустой массив вызовет исключение. Для повторяющихся случаев оформите функцию-обёртку в общем модуле.