Разработка и Конфигурация · 11 мин
Как найти строку в 1С: все способы поиска
Как найти строку в 1С: поиск в табличной части, динамическом списке, конфигураторе и запросе. Примеры кода, типичные ошибки и ответы на частые вопросы.
Задача «найти строку» в 1С возникает в разных контекстах: пользователю нужно найти запись в списке документов или справочнике, а разработчику — строку в таблице значений, табличной части документа или фрагмент текста в модуле конфигурации. Способы поиска принципиально различаются, и выбор неправильного инструмента приводит либо к медленной работе, либо к тому, что нужная запись просто не находится.
В пользовательском режиме поиск выполняется через строку поиска в динамических списках, полнотекстовый поиск по данным и стандартные команды «Найти» в табличных документах. В режиме разработчика используются методы встроенного языка: Найти(), НайтиСтроки(), НайтиПоНаименованию(), а также запросы с условием ГДЕ и оператором ПОДОБНО.
Ниже разобраны все основные сценарии: от простого поиска в списке до программного поиска строк в таблицах значений и текста в модулях конфигурации, с примерами кода и типичными ошибками.
Поиск строки в списке в пользовательском режиме
Самый частый сценарий — найти запись в открытом списке справочника или документов. В управляемых формах для этого есть строка поиска: нажмите Ctrl+F или кликните в поле поиска над списком, введите фрагмент текста и нажмите Enter. Платформа выполнит поиск по отображаемым колонкам и подсветит найденные значения.
Если список большой, эффективнее использовать кнопку «Найти» в меню «Ещё» — она открывает диалог с выбором полей поиска и вариантами сравнения (содержит, начинается с, равно). Для поиска по конкретной колонке удобно отсортировать список по ней и использовать быстрый поиск вводом первых символов.
Когда точное место записи неизвестно и искать нужно по всей базе — по контрагентам, номенклатуре, номерам документов — применяется полнотекстовый поиск (кнопка с лупой в панели инструментов или через меню «Операции» → «Полнотекстовый поиск данных»). Он работает только если администратор включил и настроил индексацию полнотекстового поиска.
Поиск строки в табличной части документа кодом
Табличная часть документа — это коллекция строк, и для поиска в ней используются методы Найти() и НайтиСтроки(). Метод Найти() возвращает первую найденную строку или Неопределено, если совпадений нет. Метод НайтиСтроки() возвращает массив всех строк, удовлетворяющих отбору.
// Поиск первой строки с конкретной номенклатурой
СтрокаТовара = Объект.Товары.Найти(Номенклатура, "Номенклатура");
Если СтрокаТовара = Неопределено Тогда
Сообщить("Товар в табличной части не найден");
Иначе
Сообщить("Найдена строка № " + СтрокаТовара.НомерСтроки);
КонецЕсли;
// Поиск всех строк с нулевым количеством
Отбор = Новый Структура("Количество", 0);
НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого Строка Из НайденныеСтроки Цикл
Сообщить("Пустое количество в строке " + Строка.НомерСтроки);
КонецЦикла;
Отбор можно задавать по нескольким полям одновременно: Новый Структура("Номенклатура, Склад", Товар, ОсновнойСклад). Условия объединяются по «И» — строка попадёт в результат, только если совпадут все значения.
Поиск строки в таблице значений
Таблица значений — универсальная коллекция, и методы поиска у неё те же: Найти() и НайтиСтроки(). Дополнительно доступен метод НайтиСтроки() с отбором и сортировка перед поиском, если нужно получить строки в определённом порядке.
ТЗ = ПолучитьТаблицуОстатков();
Отбор = Новый Структура;
Отбор.Вставить("Склад", СкладОтгрузки);
Отбор.Вставить("Номенклатура", ТекущийТовар);
Результат = ТЗ.НайтиСтроки(Отбор);
Если Результат.Количество() > 0 Тогда
Остаток = Результат[0].Количество;
КонецЕсли;
Если поиск по таблице выполняется многократно внутри цикла и таблица большая, стоит создать индекс по колонкам отбора методом ТЗ.Индексы.Добавить("Номенклатура"). Без индекса каждый вызов НайтиСтроки() перебирает всю таблицу, что на десятках тысяч строк заметно замедляет обработку.
Альтернатива — свернуть таблицу или выгрузить её в запрос через временную таблицу, если условия поиска сложные и включают сравнения «больше/меньше», которые структурой отбора не выразить.
Поиск элемента справочника по наименованию или коду
Для поиска конкретного элемента справочника программным способом используются методы менеджера справочника: НайтиПоНаименованию(), НайтиПоКоду() и НайтиПоРеквизиту(). Все они возвращают ссылку на элемент или пустую ссылку, если ничего не найдено.
СсылкаКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если СсылкаКонтрагент.Пустая() Тогда
Сообщить("Контрагент не найден");
КонецЕсли;
// Поиск по реквизиту, например по ИНН
СсылкаПоИНН = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7701234567");
Учтите: НайтиПоНаименованию() по умолчанию ищет точное совпадение — «ООО Ромашка» и «ООО «Ромашка»» с точки зрения поиска это разные строки. Для поиска по части наименования используйте запрос с оператором ПОДОБНО. Также методы поиска по умолчанию не находят помеченные на удаление элементы — если нужно учитывать и их, это придётся обрабатывать отдельно через запрос.
Поиск по наименованию ненадёжен для обменов и загрузок: пользователи переименовывают элементы. Для сопоставления данных между системами используйте код, ИНН, артикул или GUID — значения, которые не редактируются вручную.
Поиск строки запросом с оператором ПОДОБНО
Когда нужно найти записи по фрагменту текста, а не по точному совпадению, применяется запрос с оператором ПОДОБНО и символом подстановки % (любая последовательность символов).
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Фрагмент";
Запрос.УстановитьПараметр("Фрагмент", "%кабель%");
Результат = Запрос.Выполнить().Выгрузить();
Оператор ПОДОБНО в запросах 1С регистронезависим на большинстве СУБД, но поведение может зависеть от настроек базы данных. Подстановка % в начале шаблона (как в примере) не позволяет СУБД использовать индекс по полю, поэтому на больших таблицах такой запрос выполняется медленно. Для регулярного поиска по подстроке в крупных базах лучше подходит полнотекстовый поиск.
Поиск строки в тексте модулей конфигуратора
Разработчику часто нужно найти строку кода — вызов процедуры, имя переменной, фрагмент запроса — по всем модулям конфигурации. В конфигураторе для этого служит глобальный поиск: меню «Правка» → «Глобальный поиск по текстам» или сочетание Ctrl+Shift+F.
В диалоге поиска можно ограничить область: искать во всей конфигурации, только в открытых модулях или в выбранных объектах. Доступны опции «Учитывать регистр», «Слово целиком» и поиск по регулярным выражениям — последний полезен, когда нужно найти все вызовы с разными параметрами, например Сообщить\(.*.
Результаты выводятся списком с указанием объекта, модуля и номера строки; двойной клик открывает модуль на нужной строке. Для поиска внутри одного открытого модуля достаточно обычного Ctrl+F с переходом по вхождениям через F3.
- 1Откройте конфигуратор и нажмите Ctrl+Shift+F
- 2Введите искомый текст и при необходимости включите «Слово целиком»
- 3Выберите область поиска: вся конфигурация или выбранные объекты
- 4Нажмите «Искать» и откройте нужное вхождение двойным кликом
- 5Проверьте контекст найденной строки перед внесением изменений
Как проверить, что поиск сработал правильно
После любого программного поиска результат нужно проверить до использования. Для Найти() — сравнение с Неопределено, для ссылочных методов — проверка Ссылка.Пустая(), для НайтиСтроки() — проверка Количество() > 0. Пропуск этой проверки — самая частая причина ошибок «Поле объекта не обнаружено» в рабочих базах.
Дополнительно стоит убедиться, что найдена именно та строка: выведите ключевые поля результата в сообщение или журнал при отладке. В запросах с ПОДОБНО проверяйте, не вернулось ли лишних записей из-за слишком короткого фрагмента — поиск по «%а%» найдёт почти всё.
Как проверить результат
Возвращена строка, поля доступны для чтения
Неопределено — строка не найдена, обращение к полям вызовет ошибку
Ссылка не пустая, элемент открывается
Пустая ссылка — элемент с таким наименованием отсутствует или помечен на удаление
Возвращены только релевантные записи за приемлемое время
Тысячи лишних строк или долгое выполнение — уточните шаблон
Часто задаваемые вопросы
Чем отличается Найти() от НайтиСтроки()?
Найти() возвращает одну первую подходящую строку или Неопределено, а НайтиСтроки() — массив всех строк, удовлетворяющих отбору. Если совпадений может быть несколько и все они важны, используйте НайтиСтроки(), иначе рискуете обработать только часть данных.
Почему НайтиПоНаименованию() не находит элемент, который точно есть?
Чаще всего причины три: в наименовании есть лишние пробелы или отличается регистр кавычек, элемент помечен на удаление, либо поиск идёт не в той группе (при указании параметра родителя). Попробуйте найти элемент запросом с ПОДОБНО по фрагменту наименования.
Как найти строку по части текста в таблице значений?
Структура отбора в НайтиСтроки() поддерживает только точное равенство. Для поиска по подстроке переберите таблицу циклом с функцией СтрНайти(Строка.Поле, Фрагмент) > 0 либо выгрузите таблицу в запрос и используйте ПОДОБНО.
Как найти строку в табличном документе (печатной форме)?
У табличного документа есть метод НайтиТекст(СтрокаПоиска, НачальнаяОбласть, ИскатьПоСтрокам, ИскатьВперед), который возвращает область ячейки с найденным текстом. В пользовательском режиме в открытой печатной форме работает обычный Ctrl+F.
Чувствителен ли поиск в 1С к регистру букв?
Оператор ПОДОБНО в запросах и полнотекстовый поиск обычно регистронезависимы, а функция СтрНайти() в коде — регистрозависима. Если нужен поиск без учёта регистра в коде, приведите обе строки к одному регистру функциями ВРег() или НРег() перед сравнением.
Как ускорить поиск строк в большой таблице значений?
Добавьте индекс по колонкам отбора методом Индексы.Добавить(), если поиск выполняется многократно. Для однократного поиска индекс не нужен — его создание само занимает время. При очень больших объёмах перенесите обработку в запрос к базе данных.
Что важно запомнить
В списках используйте Ctrl+F и полнотекстовый поиск, в коде — Найти() и НайтиСтроки() для таблиц, НайтиПоНаименованию() и НайтиПоРеквизиту() для справочников, запрос с ПОДОБНО — для поиска по фрагменту. Всегда проверяйте результат на пустое значение перед использованием, а тяжёлые запросы сначала тестируйте на копии базы.