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