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

В этой статье разберём все доступные способы поиска по части строки — от базовых инструментов для пользователей до продвинутых техник для разработчиков. Особое внимание уделим нюансам производительности: почему некоторые методы тормозят на больших базах, как ускорить поиск с помощью индексов, и когда лучше отказаться от полнотекстового поиска в пользу альтернативных решений. Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3 (включая 8.3.23).

1. Стандартный поиск через фильтры (для пользователей)

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

Чтобы активировать поиск по фрагменту:

  • 🔍 Откройте нужный справочник (например, Контрагенты или Номенклатура).
  • 📝 В строке фильтра (обычно вверху таблицы) введите часть искомого текста, например ООО Рос.
  • ⚡ Нажмите Enter или кликните на значок лупы. Система покажет все записи, содержащие этот фрагмент.

Важно: по умолчанию ищет совпадения в начале строки. Чтобы найти фрагмент в середине или конце поля, используйте символ подстановки %:

  • 📌 %ООО% — найдёт все записи, где ООО встречается в любом месте.
  • 📌 Рос% — найдёт записи, начинающиеся на Рос (например, Роснефть, Россети).
⚠️ Внимание: В некоторых конфигурациях (например, 1С:Бухгалтерия 3.0) символ % может не работать в ручном фильтре. В этом случае переходите к методу с оператором ПОДОБНО (раздел 2).
📊 Какой способ поиска вы используете чаще?
Ручные фильтры
Запросы с ПОДОБНО
Программный обход
Регулярные выражения

2. Оператор ПОДОБНО в языке запросов

Для более гибкого поиска используйте язык запросов 1С с оператором ПОДОБНО (аналог LIKE в SQL). Этот метод подходит, когда нужно:

  • 📋 Искать по нескольким полям одновременно.
  • 🔄 Комбинировать условия (например, ПОДОБНО + дата + статус).
  • 📊 Встраивать поиск в отчёты или обработки.

Базовый синтаксис:

ВЫБРАТЬ

Наименование,

ИНН

ИЗ

Справочник.Контрагенты

ГДЕ

Наименование ПОДОБНО "%ООО%"

Особенности работы с ПОДОБНО:

  • 🔹 % — заменяет любую последовательность символов (включая пустую).
  • 🔹 _ (подчёркивание) — заменяет ровно один символ.
  • 🔹 Регистр не учитывается (поиск по ооо и ООО даст одинаковый результат).
Пример условия Что найдёт Что не найдёт
ПОДОБНО "А%" Альфа, Аэрофлот ТрансАзия, Бетта
ПОДОБНО "%а%" Роснефть (есть "а" в середине) Газпром (если искать по кириллице)
ПОДОБНО "С_м" Самолёт, Сом Стром (три символа между "С" и "м")
⚠️ Внимание: Оператор ПОДОБНО может значительно замедлять выполнение запроса на больших таблицах (более 100 000 записей). Если поиск занимает больше 5 секунд, рассмотрите альтернативы из раздела 4.

3. Поиск в коде на встроенном языке (НайтиСтроку, СтрНайти)

Когда нужно найти фрагмент строки внутри программы (например, при обработке массива данных или в цикле), используйте функции встроенного языка:

  • НайтиСтроку() — возвращает позицию подстроки или 0, если не найдено.
  • СтрНайти() — аналог НайтиСтроку(), но с дополнительными параметрами (например, поиск с конца).
  • СтрПолучитьСтроку() — для извлечения фрагмента по шаблону.

Пример кода для поиска контрагентов с частью названия:

ПоисковаяСтрока = "ООО Рос";

СписокКонтрагентов = Справочники.Контрагенты.Выбрать();

Пока СписокКонтрагентов.Следующий() Цикл

Если НайтиСтроку(СписокКонтрагентов.Наименование, ПоисковаяСтрока) > 0 Тогда

Сообщить(СписокКонтрагентов.Наименование);

КонецЕсли;

КонецЦикла;

Преимущества этого метода:

  • 🔧 Гибкость: можно комбинировать с другими условиями (например, проверять не только название, но и ИНН).
  • 📈 Быстродействие: при правильной организации цикла работает быстрее, чем ПОДОБНО на больших выборках.

☑️ Проверка перед использованием НайтиСтроку()

Выполнено: 0 / 4

4. Полнотекстовый поиск: когда и как использовать

Если стандартные методы не дают результата, обратите внимание на полнотекстовый поиск — встроенный механизм , оптимизированный для поиска по фрагментам текста в больших объёмах данных. Он доступен через:

  • 🔎 Меню Все функции → Полнотекстовый поиск (в типовой конфигурации).
  • 📝 Метод ПолнотекстовыйПоиск.ВыполнитьПоиск() в коде.

Пример запроса:

РезультатПоиска = ПолнотекстовыйПоиск.ВыполнитьПоиск(

"ООО Рос",

"Справочник.Контрагенты.Наименование"

);

Особенности полнотекстового поиска:

  • ✅ Ищет по всем формам слова (например, по запросу дом найдёт дома, дому).
  • ✅ Поддерживает морфологию (работает для русского и английского языков).
  • ❌ Требует индексацию: если база не проиндексирована, поиск будет медленным или не сработает.
⚠️ Внимание: Полнотекстовый поиск может не работать в файловом варианте (только для клиент-серверного). Перед использованием проверьте настройку индексов в Администрирование → Поддержка и обслуживание → Полнотекстовый поиск.
Как ускорить полнотекстовый поиск?

Для ускорения создайте отдельный индекс по полям, которые часто используете в поиске. Например, для справочника "Контрагенты" можно проиндексировать поля "Наименование", "ИНН" и "КПП". Это делается через конфигуратор в свойствах объекта метаданных.

5. Регулярные выражения для сложных шаблонов

Если нужно найти строки по сложному шаблону (например, номера документов с определённой структурой или email-адреса), используйте регулярные выражения через объект РегулярноеВыражение.

Пример: поиск номеров накладных в формате НК-1234/23:

РегВыражение = Новый РегулярноеВыражение("НК-\d{4}/\d{2}");

ТекстДляПоиска = "Документы: НК-1234/23, НК-5678/24, Инвойс X-999";

Результат = РегВыражение.Найти(ТекстДляПоиска);

Пока Результат.Найдено() Цикл

Сообщить(Результат.Значение); // Выведет "НК-1234/23", затем "НК-5678/24"

Результат = РегВыражение.Найти(Результат.Текст, Результат.Позиция + 1);

КонецЦикла;

Когда применять регулярные выражения:

  • 📌 Поиск по фиксированному формату (например, телефоны, серийные номера).
  • 📌 Извлечение фрагментов из неструктурированного текста (например, парсинг писем или комментариев).
  • 📌 Замена или валидация данных (например, проверка корректности ИНН).

Регулярные выражения в 1С поддерживают не все возможности PCRE (например, нет lookbehind-утверждений), но покрывают 90% типичных задач по поиску и замене.

6. Оптимизация поиска: индексы, кеширование и альтернативы

Поиск по части строки может тормозить на больших базах. Чтобы ускорить работу:

  • 📊 Создайте индексы по полям, которые часто используете в поиске. В конфигураторе откройте свойства справочника и добавьте индексируемое поле.
  • 🔄 Кешируйте результаты: если один и тот же поисковый запрос выполняется часто, сохраняйте его результаты в временную таблицу.
  • 🔍 Используйте предварительную фильтрацию: сначала отберите записи по дате или статусу, а затем применяйте поиск по строке.

Пример оптимизированного запроса:

// Сначала отбираем активных контрагентов, затем ищем по имени

ВЫБРАТЬ

Наименование

ИЗ

Справочник.Контрагенты

ГДЕ

ПометкаУдаления = ЛОЖЬ

И Наименование ПОДОБНО "%ООО%"

Альтернативные подходы:

  • 🔧 Внешние поисковые системы: для очень больших баз (миллионы записей) можно интегрировать Elasticsearch или Sphinx.
  • 📋 Дополнительные реквизиты: если часто ищете по части ИНН, добавьте реквизит "ПрефиксИНН" и заполняйте его первыми 4-6 символами.
💡

Индексы ускоряют поиск только для точных совпадений или префиксов (например, "А%"). Поиск по середине строки (например, "%а%") редко выигрывает от индексов и может требовать полного сканирования таблицы.

7. Типичные ошибки и как их избежать

При поиске по части строки пользователи и разработчики часто сталкиваются с следующими проблемами:

  1. Игнорирование регистра: По умолчанию не учитывает регистр, но если вы сравниваете строки в коде без НРег(), могут возникнуть ошибки.
    ⚠️ Внимание: Функция СравнитьСтроки() с параметром Истина (учитывает регистр) работает медленнее, чем НРег().
  2. Пустые строки: Если поле не заполнено, функции вроде НайтиСтроку() вернут ошибку. Всегда проверяйте на ЗначениеЗаполнено().
  3. Символы подстановки в данных: Если в самом поле есть символы % или _, они будут восприняты как шаблоны. Экранируйте их через ЭкранироватьСтроку().

Пример обработки пустых значений:

Если ЗначениеЗаполнено(СтрокаДляПоиска) Тогда

Позиция = НайтиСтроку(БазоваяСтрока, СтрокаДляПоиска);

Иначе

Позиция = 0;

КонецЕсли;

💡

Чтобы избежать проблем с кодировкой при поиске (например, когда "ё" не совпадает с "е"), используйте функцию СтрЗаменить() для нормализации строк: СтрЗаменить(Строка, "ё", "е").

FAQ: Частые вопросы по поиску в 1С

Можно ли искать по части строки в отчётах?

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

  1. Откройте отчёт и перейдите на закладку Настройки.
  2. В разделе Отбор добавьте новое условие.
  3. В поле Значение введите шаблон, например %ООО%.
Почему поиск с % работает медленно?

Символ % в начале шаблона (например, %текст) заставляет сканировать всю таблицу, так как индексы не могут использоваться для поиска по середине строки. Чтобы ускорить:

  • Используйте префиксный поиск (текст%).
  • Ограничьте выборку по другим полям (дата, статус).
  • Для частых запросов создайте отдельное индексируемое поле с префиксами.
Как искать по части строки в динамическом списке?

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

  1. Откройте форму справочника в конфигураторе.
  2. Выделите динамический список и в палитре свойств найдите Поиск.
  3. Установите Разрешить поиск по любым словам или настройте собственные условия.

Для программного управления используйте метод НайтиПоСтроке():

ДинамическийСписок.НайтиПоСтроке("ООО Рос");
Можно ли использовать регулярные выражения в запросах 1С?

Нет, в языке запросов нет поддержки регулярных выражений. Их можно применять только на встроенном языке (как показано в разделе 5) или в внешних обработках.

Как найти документ по части номера?

Используйте оператор ПОДОБНО в запросе или фильтре. Пример для журнала документов РеализацияТоваровУслуг:

ВЫБРАТЬ

Номер,

Дата

ИЗ

Документ.РеализацияТоваровУслуг

ГДЕ

Номер ПОДОБНО "%123%"

Если номер имеет фиксированный формат (например, РТ-000123), лучше использовать программный поиск с НайтиСтроку() или регулярные выражения.