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