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

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

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

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

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

Важно понимать ограничения платформы: метод Найти() сравнивает значения по равенству и не работает с частичным совпадением строк или сложными условиями. Если нужен поиск по условию (например, «строка содержит подстроку» или «число больше порога»), придётся перебирать массив вручную и запоминать индекс самостоятельно.

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

Как устроены индексы массива в 1С

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

Обращение к элементу выполняется через квадратные скобки: Массив[0]. Попытка обратиться к индексу за пределами диапазона вызовет ошибку «Индекс находится за границами массива», поэтому перед обращением по вычисленному индексу всегда проверяйте его на допустимость.

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

Массив.Добавить("Апельсин");

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

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

// Индексы: 0 — Апельсин, 1 — Яблоко, 2 — Груша

ПоследнийИндекс = Массив.ВГраница(); // 2

Поиск индекса по значению методом Найти()

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

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

Массив.Добавить("Апельсин");

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

Индекс = Массив.Найти("Яблоко");

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

Сообщить("Значение не найдено");

Иначе

Сообщить("Индекс: " + Индекс); // 1

КонецЕсли;

Сравнение строк выполняется с учётом регистра: Найти("яблоко") не найдёт элемент "Яблоко". Если регистр не важен, приводите обе стороны к одному регистру через НРег() — но тогда Найти() уже не подойдёт, потребуется ручной перебор.

Поиск индекса по условию через цикл

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

ИскомыйИндекс = Неопределено;

Для Сч = 0 По Массив.ВГраница() Цикл

Если СтрНайти(Массив[Сч], "блок") > 0 Тогда

ИскомыйИндекс = Сч;

Прервать;

КонецЕсли;

КонецЦикла;

Команда Прервать останавливает цикл сразу после первого совпадения — это ускоряет обработку больших массивов. Если нужны индексы всех совпадений, уберите Прервать и складывайте найденные индексы в отдельный массив.

Перебор «Для Каждого» и потеря индекса

Цикл Для Каждого Элемент Из Массив Цикл не предоставляет индекс напрямую. Если индекс нужен, заведите переменную-счётчик и увеличивайте её вручную внутри цикла, либо используйте цикл по индексам из примера выше — второй вариант надёжнее и читается проще.

1c
Сч = 0;
Для Каждого Элемент Из Массив Цикл
    Если Элемент = ИскомоеЗначение Тогда
        Сообщить("Индекс: " + Сч);
    КонецЕсли;
    Сч = Сч + 1;
КонецЦикла;

Поиск индекса в массиве структур и объектов

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

// Массив структур с товарами

Для Сч = 0 По Товары.ВГраница() Цикл

Если Товары[Сч].Артикул = "АРТ-100" Тогда

ИндексНайденного = Сч;

Прервать;

КонецЕсли;

КонецЦикла;

Если данные представляют собой таблицу значений, а не массив, используйте методы таблицы: Найти(Значение, Колонка) возвращает строку, а её индекс узнаётся через Таблица.Индекс(Строка). Это часто удобнее ручного перебора и работает быстрее при включённых индексах таблицы значений.

Способы найти индекс

Метод Найти()

Подходит для точного поиска примитивных значений (строка, число, ссылка). Не работает с условиями и регистронезависимым поиском.

Цикл по индексам

Универсальный вариант: любые условия, доступ к соседним элементам. Требует больше кода.

Таблица значений + Индекс()

Оптимально, когда данных много и поиск выполняется часто; требует преобразования массива в таблицу.

Практические сценарии: удаление и замена по индексу

Найденный индекс чаще всего нужен для последующего действия. Удаление выполняется методом Удалить(Индекс), замена — прямым присваиванием Массив[Индекс] = НовоеЗначение. Оба действия безопасны только после проверки, что индекс не равен Неопределено.

Индекс = Массив.Найти(УстаревшееЗначение);

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

Массив.Удалить(Индекс);

КонецЕсли;

Учтите: после удаления элемента индексы всех последующих элементов сдвигаются на единицу. Если удаляете несколько элементов в цикле, перебирайте массив с конца (от ВГраница() к 0 с шагом -1), иначе пропустите элементы или выйдете за границы.

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

Быстрый способ убедиться, что индекс найден верно, — вывести и индекс, и значение по этому индексу. Если Массив[Индекс] совпадает с искомым значением, поиск сработал корректно.

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

И Массив[Индекс] = ИскомоеЗначение Тогда

Сообщить("ОК: индекс " + Индекс);

КонецЕсли;

В конфигураторе используйте точку останова и табло (Shift+F9): вычислите выражение Массив.Найти("значение") и сразу проверьте содержимое массива. Это помогает отловить проблемы с регистром строк, лишними пробелами и невидимыми символами, из-за которых поиск «не находит» очевидно существующее значение.

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

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

Возвращаемое значение Найти()
Норма

Число от 0 до ВГраница()

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

Неопределено — значение не найдено или отличается регистр/пробелы

Значение по найденному индексу
Норма

Массив[Индекс] равно искомому

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

Значение другое — найден не тот элемент

Поведение при пустом массиве
Норма

Найти() вернул Неопределено, ошибок нет

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

Ошибка обращения по индексу — нет проверки результата

Типичные ошибки при работе с индексами

Большинство проблем связано с невнимательностью к типу возвращаемого значения и к нумерации с нуля. Разработчики с опытом других языков иногда ожидают, что «не найдено» вернёт -1, и строят логику на этой проверке — в 1С она не сработает.

Типичные ошибки
01
Проверка «Индекс = -1» вместо «Индекс = Неопределено» — ветка «не найдено» никогда не выполнится.
02
Поиск строки без учёта регистра: «яблоко» не найдёт «Яблоко» — нужен НРег() и ручной перебор.
03
Обращение Массив[Массив.Количество()] — выход за границу, последний индекс равен Количество()-1.
04
Удаление элементов в прямом цикле — после сдвига индексов часть элементов пропускается.
05
Поиск структуры через Найти() — структуры сравниваются по ссылке, совпадения по содержимому не будет.

Ещё одна неочевидная ловушка — лишние пробелы и неразрывные пробелы в строках, загруженных из файлов или запросов. Перед поиском применяйте СокрЛП() к сравниваемым значениям, если данные приходят из внешних источников.

Итог

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

Индекс значения ищется методом Массив.Найти(Значение): результат — число от нуля или Неопределено. Для поиска по условию используйте цикл от 0 до ВГраница() с Прервать. Всегда проверяйте результат на Неопределено перед обращением по индексу или удалением.

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

Что возвращает метод Найти(), если значения нет в массиве?

Метод возвращает значение Неопределено. Проверяйте результат конструкцией «Если Индекс = Неопределено Тогда», а не сравнением с -1 или 0 — индекс 0 означает первый элемент, то есть успешный поиск.

Как найти индекс строки без учёта регистра?

Метод Найти() сравнивает строки с учётом регистра, поэтому переберите массив циклом и сравнивайте «Если НРег(Массив[Сч]) = НРег(Искомое) Тогда». Найденный Сч и будет индексом.

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

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

Можно ли найти индексы всех совпадающих элементов?

Метод Найти() возвращает только первое совпадение. Для всех совпадений переберите массив циклом по индексам без команды Прервать и добавляйте каждый подходящий индекс в отдельный массив результатов.

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

Сначала найдите строку методом Таблица.Найти(Значение, "ИмяКолонки"), затем получите её позицию методом Таблица.Индекс(НайденнаяСтрока). Если строка не найдена, Найти() вернёт Неопределено — проверьте это перед вызовом Индекс().

Почему Найти() не находит структуру, которая точно есть в массиве?

Структуры сравниваются по ссылке, а не по содержимому: два объекта с одинаковыми полями — разные значения. Ищите перебором, сравнивая конкретное свойство, например «Если Массив[Сч].Код = ИскомыйКод Тогда».