Поиск по фрагменту текста в 1С:Предприятие — одна из самых востребованных задач при работе с большими массивами данных.hether вы ищете контрагента по части названия, документ по номеру с пропущенными символами или фильтруете справочники по неполному совпадению — умение правильно формулировать такие запросы экономит часы ручной работы. Проблема в том, что стандартные механизмы платформы не всегда интуитивно понятны: где-то требуется оператор ПОДОБНО, а где-то — программный обход коллекции с использованием НайтиСтроку().
В этой статье разберём все доступные способы поиска по части строки — от базовых инструментов для пользователей до продвинутых техник для разработчиков. Особое внимание уделим нюансам производительности: почему некоторые методы тормозят на больших базах, как ускорить поиск с помощью индексов, и когда лучше отказаться от полнотекстового поиска в пользу альтернативных решений. Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3 (включая 8.3.23).
1. Стандартный поиск через фильтры (для пользователей)
Самый простой способ найти запись по части строки — использовать встроенные фильтры в списках справочников или документов. Этот метод не требует знания языка запросов и доступен даже начинающим пользователям.
Чтобы активировать поиск по фрагменту:
- 🔍 Откройте нужный справочник (например,
КонтрагентыилиНоменклатура). - 📝 В строке фильтра (обычно вверху таблицы) введите часть искомого текста, например
ООО Рос. - ⚡ Нажмите
Enterили кликните на значок лупы. Система покажет все записи, содержащие этот фрагмент.
Важно: по умолчанию 1С ищет совпадения в начале строки. Чтобы найти фрагмент в середине или конце поля, используйте символ подстановки %:
- 📌
%ООО%— найдёт все записи, гдеОООвстречается в любом месте. - 📌
Рос%— найдёт записи, начинающиеся наРос(например,Роснефть,Россети).
⚠️ Внимание: В некоторых конфигурациях (например, 1С:Бухгалтерия 3.0) символ%может не работать в ручном фильтре. В этом случае переходите к методу с операторомПОДОБНО(раздел 2).
2. Оператор ПОДОБНО в языке запросов
Для более гибкого поиска используйте язык запросов 1С с оператором ПОДОБНО (аналог LIKE в SQL). Этот метод подходит, когда нужно:
- 📋 Искать по нескольким полям одновременно.
- 🔄 Комбинировать условия (например,
ПОДОБНО+ дата + статус). - 📊 Встраивать поиск в отчёты или обработки.
Базовый синтаксис:
ВЫБРАТЬ
Наименование,
ИНН
ИЗ
Справочник.Контрагенты
ГДЕ
Наименование ПОДОБНО "%ООО%"
Особенности работы с ПОДОБНО:
- 🔹
%— заменяет любую последовательность символов (включая пустую). - 🔹
_(подчёркивание) — заменяет ровно один символ. - 🔹 Регистр не учитывается (поиск по
оооиОООдаст одинаковый результат).
| Пример условия | Что найдёт | Что не найдёт |
|---|---|---|
ПОДОБНО "А%" |
Альфа, Аэрофлот |
ТрансАзия, Бетта |
ПОДОБНО "%а%" |
Роснефть (есть "а" в середине) |
Газпром (если искать по кириллице) |
ПОДОБНО "С_м" |
Самолёт, Сом |
Стром (три символа между "С" и "м") |
⚠️ Внимание: Оператор ПОДОБНО может значительно замедлять выполнение запроса на больших таблицах (более 100 000 записей). Если поиск занимает больше 5 секунд, рассмотрите альтернативы из раздела 4.
3. Поиск в коде на встроенном языке (НайтиСтроку, СтрНайти)
Когда нужно найти фрагмент строки внутри программы (например, при обработке массива данных или в цикле), используйте функции встроенного языка:
НайтиСтроку()— возвращает позицию подстроки или 0, если не найдено.СтрНайти()— аналогНайтиСтроку(), но с дополнительными параметрами (например, поиск с конца).СтрПолучитьСтроку()— для извлечения фрагмента по шаблону.
Пример кода для поиска контрагентов с частью названия:
ПоисковаяСтрока = "ООО Рос";
СписокКонтрагентов = Справочники.Контрагенты.Выбрать();
Пока СписокКонтрагентов.Следующий() Цикл
Если НайтиСтроку(СписокКонтрагентов.Наименование, ПоисковаяСтрока) > 0 Тогда
Сообщить(СписокКонтрагентов.Наименование);
КонецЕсли;
КонецЦикла;
Преимущества этого метода:
- 🔧 Гибкость: можно комбинировать с другими условиями (например, проверять не только название, но и ИНН).
- 📈 Быстродействие: при правильной организации цикла работает быстрее, чем
ПОДОБНОна больших выборках.
☑️ Проверка перед использованием НайтиСтроку()
4. Полнотекстовый поиск: когда и как использовать
Если стандартные методы не дают результата, обратите внимание на полнотекстовый поиск — встроенный механизм 1С, оптимизированный для поиска по фрагментам текста в больших объёмах данных. Он доступен через:
- 🔎 Меню
Все функции → Полнотекстовый поиск(в типовой конфигурации). - 📝 Метод
ПолнотекстовыйПоиск.ВыполнитьПоиск()в коде.
Пример запроса:
РезультатПоиска = ПолнотекстовыйПоиск.ВыполнитьПоиск(
"ООО Рос",
"Справочник.Контрагенты.Наименование"
);
Особенности полнотекстового поиска:
- ✅ Ищет по всем формам слова (например, по запросу
домнайдётдома,дому). - ✅ Поддерживает морфологию (работает для русского и английского языков).
- ❌ Требует индексацию: если база не проиндексирована, поиск будет медленным или не сработает.
⚠️ Внимание: Полнотекстовый поиск может не работать в файловом варианте 1С (только для клиент-серверного). Перед использованием проверьте настройку индексов в Администрирование → Поддержка и обслуживание → Полнотекстовый поиск.
Как ускорить полнотекстовый поиск?
Для ускорения создайте отдельный индекс по полям, которые часто используете в поиске. Например, для справочника "Контрагенты" можно проиндексировать поля "Наименование", "ИНН" и "КПП". Это делается через конфигуратор в свойствах объекта метаданных.
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С не учитывает регистр, но если вы сравниваете строки в коде без
НРег(), могут возникнуть ошибки.⚠️ Внимание: Функция
СравнитьСтроки()с параметромИстина(учитывает регистр) работает медленнее, чемНРег(). - Пустые строки: Если поле не заполнено, функции вроде
НайтиСтроку()вернут ошибку. Всегда проверяйте наЗначениеЗаполнено(). - Символы подстановки в данных: Если в самом поле есть символы
%или_, они будут восприняты как шаблоны. Экранируйте их черезЭкранироватьСтроку().
Пример обработки пустых значений:
Если ЗначениеЗаполнено(СтрокаДляПоиска) Тогда
Позиция = НайтиСтроку(БазоваяСтрока, СтрокаДляПоиска);
Иначе
Позиция = 0;
КонецЕсли;
Чтобы избежать проблем с кодировкой при поиске (например, когда "ё" не совпадает с "е"), используйте функцию СтрЗаменить() для нормализации строк: СтрЗаменить(Строка, "ё", "е").
FAQ: Частые вопросы по поиску в 1С
Можно ли искать по части строки в отчётах?
Да, в большинстве типов отчётов (например, Универсальный отчёт или Отчёт по продажам) можно добавить условие с оператором ПОДОБНО в настройки отбора. Для этого:
- Откройте отчёт и перейдите на закладку
Настройки. - В разделе
Отбордобавьте новое условие. - В поле
Значениевведите шаблон, например%ООО%.
Почему поиск с % работает медленно?
Символ % в начале шаблона (например, %текст) заставляет 1С сканировать всю таблицу, так как индексы не могут использоваться для поиска по середине строки. Чтобы ускорить:
- Используйте префиксный поиск (
текст%). - Ограничьте выборку по другим полям (дата, статус).
- Для частых запросов создайте отдельное индексируемое поле с префиксами.
Как искать по части строки в динамическом списке?
В динамических списках (например, в формах справочников) поиск по фрагменту настраивается через свойство Поиск. Чтобы включить:
- Откройте форму справочника в конфигураторе.
- Выделите динамический список и в палитре свойств найдите
Поиск. - Установите
Разрешить поиск по любым словамили настройте собственные условия.
Для программного управления используйте метод НайтиПоСтроке():
ДинамическийСписок.НайтиПоСтроке("ООО Рос");
Можно ли использовать регулярные выражения в запросах 1С?
Нет, в языке запросов 1С нет поддержки регулярных выражений. Их можно применять только на встроенном языке (как показано в разделе 5) или в внешних обработках.
Как найти документ по части номера?
Используйте оператор ПОДОБНО в запросе или фильтре. Пример для журнала документов РеализацияТоваровУслуг:
ВЫБРАТЬ
Номер,
Дата
ИЗ
Документ.РеализацияТоваровУслуг
ГДЕ
Номер ПОДОБНО "%123%"
Если номер имеет фиксированный формат (например, РТ-000123), лучше использовать программный поиск с НайтиСтроку() или регулярные выражения.