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

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

Как найти строку в 1С: все способы поиска

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

Задача «найти строку» в 1С возникает в разных контекстах: пользователю нужно найти запись в списке документов или справочнике, а разработчику — строку в таблице значений, табличной части документа или фрагмент текста в модуле конфигурации. Способы поиска принципиально различаются, и выбор неправильного инструмента приводит либо к медленной работе, либо к тому, что нужная запись просто не находится.

В пользовательском режиме поиск выполняется через строку поиска в динамических списках, полнотекстовый поиск по данным и стандартные команды «Найти» в табличных документах. В режиме разработчика используются методы встроенного языка: Найти(), НайтиСтроки(), НайтиПоНаименованию(), а также запросы с условием ГДЕ и оператором ПОДОБНО.

Ниже разобраны все основные сценарии: от простого поиска в списке до программного поиска строк в таблицах значений и текста в модулях конфигурации, с примерами кода и типичными ошибками.

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

Самый частый сценарий — найти запись в открытом списке справочника или документов. В управляемых формах для этого есть строка поиска: нажмите Ctrl+F или кликните в поле поиска над списком, введите фрагмент текста и нажмите Enter. Платформа выполнит поиск по отображаемым колонкам и подсветит найденные значения.

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

Когда точное место записи неизвестно и искать нужно по всей базе — по контрагентам, номенклатуре, номерам документов — применяется полнотекстовый поиск (кнопка с лупой в панели инструментов или через меню «Операции» → «Полнотекстовый поиск данных»). Он работает только если администратор включил и настроил индексацию полнотекстового поиска.

Поиск строки в табличной части документа кодом

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

// Поиск первой строки с конкретной номенклатурой

СтрокаТовара = Объект.Товары.Найти(Номенклатура, "Номенклатура");

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

Сообщить("Товар в табличной части не найден");

Иначе

Сообщить("Найдена строка № " + СтрокаТовара.НомерСтроки);

КонецЕсли;

// Поиск всех строк с нулевым количеством

Отбор = Новый Структура("Количество", 0);

НайденныеСтроки = Объект.Товары.НайтиСтроки(Отбор);

Для Каждого Строка Из НайденныеСтроки Цикл

Сообщить("Пустое количество в строке " + Строка.НомерСтроки);

КонецЦикла;

Отбор можно задавать по нескольким полям одновременно: Новый Структура("Номенклатура, Склад", Товар, ОсновнойСклад). Условия объединяются по «И» — строка попадёт в результат, только если совпадут все значения.

Типичные ошибки
01
Не проверять результат Найти() на Неопределено — обращение к полям пустого результата вызывает ошибку выполнения
02
Указывать в структуре отбора имя колонки, которой нет в табличной части — получите исключение
03
Искать в цикле перебором всех строк вместо НайтиСтроки() — код длиннее и медленнее читается

Поиск строки в таблице значений

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

ТЗ = ПолучитьТаблицуОстатков();

Отбор = Новый Структура;

Отбор.Вставить("Склад", СкладОтгрузки);

Отбор.Вставить("Номенклатура", ТекущийТовар);

Результат = ТЗ.НайтиСтроки(Отбор);

Если Результат.Количество() > 0 Тогда

Остаток = Результат[0].Количество;

КонецЕсли;

Если поиск по таблице выполняется многократно внутри цикла и таблица большая, стоит создать индекс по колонкам отбора методом ТЗ.Индексы.Добавить("Номенклатура"). Без индекса каждый вызов НайтиСтроки() перебирает всю таблицу, что на десятках тысяч строк заметно замедляет обработку.

Альтернатива — свернуть таблицу или выгрузить её в запрос через временную таблицу, если условия поиска сложные и включают сравнения «больше/меньше», которые структурой отбора не выразить.

Поиск элемента справочника по наименованию или коду

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

СсылкаКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

Если СсылкаКонтрагент.Пустая() Тогда

Сообщить("Контрагент не найден");

КонецЕсли;

// Поиск по реквизиту, например по ИНН

СсылкаПоИНН = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7701234567");

Учтите: НайтиПоНаименованию() по умолчанию ищет точное совпадение — «ООО Ромашка» и «ООО «Ромашка»» с точки зрения поиска это разные строки. Для поиска по части наименования используйте запрос с оператором ПОДОБНО. Также методы поиска по умолчанию не находят помеченные на удаление элементы — если нужно учитывать и их, это придётся обрабатывать отдельно через запрос.

Поиск по наименованию ненадёжен для обменов и загрузок: пользователи переименовывают элементы. Для сопоставления данных между системами используйте код, ИНН, артикул или GUID — значения, которые не редактируются вручную.
ПЗ
Практическое замечание

Поиск строки запросом с оператором ПОДОБНО

Когда нужно найти записи по фрагменту текста, а не по точному совпадению, применяется запрос с оператором ПОДОБНО и символом подстановки % (любая последовательность символов).

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка,

| Номенклатура.Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Наименование ПОДОБНО &Фрагмент";

Запрос.УстановитьПараметр("Фрагмент", "%кабель%");

Результат = Запрос.Выполнить().Выгрузить();

Оператор ПОДОБНО в запросах 1С регистронезависим на большинстве СУБД, но поведение может зависеть от настроек базы данных. Подстановка % в начале шаблона (как в примере) не позволяет СУБД использовать индекс по полю, поэтому на больших таблицах такой запрос выполняется медленно. Для регулярного поиска по подстроке в крупных базах лучше подходит полнотекстовый поиск.

Поиск строки в тексте модулей конфигуратора

Разработчику часто нужно найти строку кода — вызов процедуры, имя переменной, фрагмент запроса — по всем модулям конфигурации. В конфигураторе для этого служит глобальный поиск: меню «Правка» → «Глобальный поиск по текстам» или сочетание Ctrl+Shift+F.

В диалоге поиска можно ограничить область: искать во всей конфигурации, только в открытых модулях или в выбранных объектах. Доступны опции «Учитывать регистр», «Слово целиком» и поиск по регулярным выражениям — последний полезен, когда нужно найти все вызовы с разными параметрами, например Сообщить\(.*.

Результаты выводятся списком с указанием объекта, модуля и номера строки; двойной клик открывает модуль на нужной строке. Для поиска внутри одного открытого модуля достаточно обычного Ctrl+F с переходом по вхождениям через F3.

Как найти строку кода во всей конфигурации
  1. 1
    Откройте конфигуратор и нажмите Ctrl+Shift+F
  2. 2
    Введите искомый текст и при необходимости включите «Слово целиком»
  3. 3
    Выберите область поиска: вся конфигурация или выбранные объекты
  4. 4
    Нажмите «Искать» и откройте нужное вхождение двойным кликом
  5. 5
    Проверьте контекст найденной строки перед внесением изменений

Как проверить, что поиск сработал правильно

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

Дополнительно стоит убедиться, что найдена именно та строка: выведите ключевые поля результата в сообщение или журнал при отладке. В запросах с ПОДОБНО проверяйте, не вернулось ли лишних записей из-за слишком короткого фрагмента — поиск по «%а%» найдёт почти всё.

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

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

Результат Найти()
Норма

Возвращена строка, поля доступны для чтения

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

Неопределено — строка не найдена, обращение к полям вызовет ошибку

Результат НайтиПоНаименованию()
Норма

Ссылка не пустая, элемент открывается

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

Пустая ссылка — элемент с таким наименованием отсутствует или помечен на удаление

Запрос с ПОДОБНО
Норма

Возвращены только релевантные записи за приемлемое время

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

Тысячи лишних строк или долгое выполнение — уточните шаблон

Часто задаваемые вопросы

Чем отличается Найти() от НайтиСтроки()?

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

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

Чаще всего причины три: в наименовании есть лишние пробелы или отличается регистр кавычек, элемент помечен на удаление, либо поиск идёт не в той группе (при указании параметра родителя). Попробуйте найти элемент запросом с ПОДОБНО по фрагменту наименования.

Как найти строку по части текста в таблице значений?

Структура отбора в НайтиСтроки() поддерживает только точное равенство. Для поиска по подстроке переберите таблицу циклом с функцией СтрНайти(Строка.Поле, Фрагмент) > 0 либо выгрузите таблицу в запрос и используйте ПОДОБНО.

Как найти строку в табличном документе (печатной форме)?

У табличного документа есть метод НайтиТекст(СтрокаПоиска, НачальнаяОбласть, ИскатьПоСтрокам, ИскатьВперед), который возвращает область ячейки с найденным текстом. В пользовательском режиме в открытой печатной форме работает обычный Ctrl+F.

Чувствителен ли поиск в 1С к регистру букв?

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

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

Добавьте индекс по колонкам отбора методом Индексы.Добавить(), если поиск выполняется многократно. Для однократного поиска индекс не нужен — его создание само занимает время. При очень больших объёмах перенесите обработку в запрос к базе данных.

Итог

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

В списках используйте Ctrl+F и полнотекстовый поиск, в коде — Найти() и НайтиСтроки() для таблиц, НайтиПоНаименованию() и НайтиПоРеквизиту() для справочников, запрос с ПОДОБНО — для поиска по фрагменту. Всегда проверяйте результат на пустое значение перед использованием, а тяжёлые запросы сначала тестируйте на копии базы.