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

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

Как найти элемент в массиве в 1С

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

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

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

Массив в 1С индексируется с нуля — первый элемент имеет индекс 0, последний — Количество() - 1. Это частый источник ошибок у тех, кто привык к нумерации строк табличных документов или запросов, где отсчёт идёт с единицы.

Метод Найти(): базовый синтаксис и пример

Метод Найти() выполняет линейный поиск: последовательно сравнивает каждый элемент с искомым значением и останавливается на первом совпадении. Синтаксис простой:

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

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

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

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

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

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

Сообщить("Найдено, индекс: " + Индекс); // выведет 1

Иначе

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

КонецЕсли;

Обратите внимание: метод возвращает именно индекс, а не само значение. Чтобы получить элемент, обратитесь к массиву по найденному индексу: Массив[Индекс]. Если совпадений несколько, вернётся индекс только первого из них — остальные дубликаты метод игнорирует.

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

Самая распространённая ошибка — использование результата Найти() без проверки. Если элемент не найден, переменная содержит Неопределено, и попытка обратиться к Массив[Неопределено] вызовет ошибку исполнения.

Корректный шаблон выглядит так: сначала сравнение с Неопределено, потом работа с индексом. Не используйте проверку вида Если Индекс Тогда — индекс 0 (первый элемент) при приведении к булеву может дать ложное срабатывание, и логика поиска сломается именно на первом элементе массива.

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

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

Значение переменной после Найти()
Норма

Число от 0 до Количество()-1

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

Неопределено — элемент отсутствует

Обращение Массив[Индекс]
Норма

Возвращает ожидаемое значение

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

Ошибка исполнения — индекс не проверен

Тип искомого значения
Норма

Совпадает с типом элементов массива

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

Типы различаются — поиск всегда пуст

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

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

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

Если СтрНайти(Элемент, "молок") > 0 Тогда

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

Прервать;

КонецЕсли;

КонецЦикла;

Если нужен индекс, используйте цикл со счётчиком: Для Инд = 0 По Массив.Количество() - 1 Цикл. Оператор Прервать останавливает перебор после первого совпадения — без него цикл продолжит работу впустую, что на больших массивах замедляет выполнение.

Поиск по нескольким условиям

Для составных условий объединяйте проверки логическими операторами И / ИЛИ. Например, поиск товара по наименованию и цене одновременно — две проверки внутри одного цикла. Если массив содержит структуры, обращайтесь к полям: Элемент.Наименование, Элемент.Цена.

Сравнение способов поиска

Сравнение вариантов

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

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

Цикл Для Каждого

Гибкий поиск по любому условию, включая часть строки и поля структур. Требует больше кода и явного Прервать.

Соответствие вместо массива

Если поиск по ключу выполняется часто, храните данные в Соответствии — доступ по ключу быстрее линейного перебора.

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

Перед добавлением элемента в массив часто нужно исключить дубликаты. Проверка Если Массив.Найти(Значение) = Неопределено Тогда Массив.Добавить(Значение) — рабочий приём, но при больших объёмах замените массив на Соответствие: проверка ключа там выполняется заметно быстрее.
ПЗ
Практическое замечание

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

Типичные ошибки
01
Обращение к Массив[Индекс] без проверки на Неопределено — ошибка исполнения при отсутствии элемента
02
Поиск строки по числу или наоборот — типы не совпадают, метод всегда возвращает Неопределено
03
Проверка Если Индекс Тогда — индекс 0 трактуется как Ложь, первый элемент «теряется»
04
Отсутствие Прервать в цикле — лишние итерации и медленная работа на больших массивах
05
Поиск с учётом регистра при разном регистре данных — «Молоко» и «молоко» считаются разными значениями

Отдельно стоит регистр символов: метод Найти() сравнивает строки с учётом регистра. Если данные приходят из разных источников и регистр не гарантирован, приводите обе стороны к одному виду через НРег() или ВРег() — но тогда придётся использовать цикл, а не встроенный метод.

Частые вопросы о поиске в массиве 1С

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

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

Как найти все вхождения значения, а не только первое?

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

Как найти элемент в массиве структур?

Встроенный метод Найти() сравнивает ссылки на структуры, а не их содержимое, поэтому он не подходит. Перебирайте массив циклом Для Каждого и сравнивайте нужные поля: Если Элемент.Код = ИскомыйКод Тогда.

Что быстрее: массив с Найти() или соответствие?

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

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

Чаще всего причины три: различаются типы (число против строки), разный регистр символов в строках или лишние пробелы в значении. Проверьте типы через ТипЗнч() и очистите строки функцией СокрЛП() перед сравнением.

Как удалить найденный элемент из массива?

Найдите индекс методом Найти(), проверьте его на Неопределено и вызовите Массив.Удалить(Индекс). При удалении внутри цикла перебора удаляйте элементы с конца массива, чтобы не сбить индексацию.

Итог

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

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