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