Поиск по базе 1С: от галочки в конфигураторе до своего кода

· 9 мин

Содержание

Чтобы добавить поиск в 1С, чаще всего хватает полнотекстового поиска платформы: в конфигураторе у нужных объектов и реквизитов ставите свойство «Полнотекстовый поиск» = «Использовать», а в режиме Предприятия разрешаете поиск и строите индекс через Все функции → Стандартные → Управление полнотекстовым поиском. Если нужен поиск по одному справочнику или полю с точным условием, проще написать запрос с ПОДОБНО — индекс тогда не нужен.

Полнотекстовый поиск выбирают, когда пользователи ищут «что-то про Ромашку» по всей базе. Запрос — когда известно, где искать, и важна точность. Встроенная строка поиска в списках работает без всякой настройки.

Какой способ поиска в 1С выбрать под задачу

Сначала определите, кто ищет и что. От этого зависит, нужна ли вообще доработка конфигурации.

СпособКогда подходитЧто нужно настроитьСлабые места
Строка поиска в форме спискаНайти документ или элемент в одном спискеНичего, работает из коробкиИщет только по колонкам этого списка
Ввод по строке в полеВыбрать контрагента, набрав часть ИНН или названияСвойства справочника в конфигуратореТолько для полей ввода
Полнотекстовый поиск (ППД)Поиск по всей базе, по комментариям, описаниямСвойства объектов + индексИндекс надо обновлять, он занимает место
Запрос с ПОДОБНОСвоя обработка, поиск по конкретным полям с условиямиКодШаблон %…% читает всю таблицу

💡 В типовых конфигурациях БП 3.0, ЗУП 3.1 и УТ 11 свойства полнотекстового поиска уже расставлены разработчиком. Там обычно достаточно включить поиск и построить индекс — конфигуратор трогать не надо.

Как включить полнотекстовый поиск в конфигураторе

Этот шаг нужен для своей конфигурации или для нового объекта, который вы добавили сами.

Свойство объекта

  1. Откройте конфигуратор, в дереве метаданных выберите справочник, документ или регистр.
  2. Откройте палитру свойств (Alt+Enter).
  3. Найдите свойство «Полнотекстовый поиск» и выберите «Использовать».

Если у объекта стоит «Не использовать», его данные в индекс не попадут, какие бы галочки ни стояли у реквизитов.

Свойство реквизитов

У каждого реквизита и реквизита табличной части есть такое же свойство. Здесь и решается, сколько будет весить индекс.

  • ✅ Включайте: наименование, ИНН, артикул, номер, комментарий, текстовые описания.
  • ❌ Выключайте: суммы, количества, служебные флаги, хеши, реквизиты хранилища значения.
  • ⚠️ Длинные текстовые реквизиты (строка неограниченной длины) раздувают индекс сильнее всего. Индексируйте их, только если по ним правда ищут.

Ввод по строке

Если задача — быстрый подбор в поле, а не поиск по всей базе, настройте у справочника вкладку «Данные»: список полей «Ввод по строке» (например, Наименование, ИНН, Код) и способ поиска строки — по началу или по любой части. Поиск по любой части удобнее, но на больших справочниках медленнее.

После изменения свойств

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

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

Включение поиска и первая индексация в режиме Предприятия

Есть два пути: через команду платформы и через настройки самой конфигурации.

Через стандартную функцию платформы

  1. Если меню «Все функции» скрыто, включите его: Главное меню → Сервис → Параметры → флажок «Отображать команду «Все функции»».
  2. Откройте Все функции → Стандартные → Управление полнотекстовым поиском.
  3. Нажмите «Разрешить», если поиск запрещён.
  4. Нажмите «Обновить индекс» и дождитесь окончания.

В форме видно, актуален ли индекс и на какую дату. Это первое место, куда смотреть, если поиск «перестал находить».

Через настройки конфигурации

В конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11) тот же переключатель вынесен в Администрирование → Общие настройки, в группу про полнотекстовый поиск. Там же есть ссылка на настройку с кнопками обновления и очистки индекса.

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

Тип базыГде лежит индекс
ФайловаяВ каталоге базы, папка вида 1Cv8FTxt
Клиент-сервернаяВ рабочем каталоге кластера на сервере 1С, в подкаталоге базы

Учитывайте это при планировании диска: индекс может занять заметную долю от размера самой базы.

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

Когда индекс построен, поиск доступен в нескольких местах.

Глобальный поиск

Поле поиска в правом верхнем углу окна (или Ctrl+Shift+F). Он ищет одновременно по командам, справке и данным. Данные находятся именно через полнотекстовый индекс: выключен поиск — в результатах будут только команды.

Поиск в списке

В любой форме списка есть строка поиска (Ctrl+F переводит в неё курсор). Для поиска по конкретной колонке с условием есть расширенный поиск (Alt+F). Этот поиск работает и без индекса, но на больших журналах документов бывает медленным.

Синтаксис строки полнотекстового поиска

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

Что ввестиЧто найдётся
ромашка поставкаЗаписи, где есть оба слова
ромашка ИЛИ лютикЗаписи с любым из слов
ромашка НЕ возвратС первым словом, но без второго
"договор поставки"Точная фраза
рома*Слова, начинающиеся на «рома»
#ромашкаНечёткий поиск, найдёт и опечатки

Поиск учитывает словоформы русского языка: по слову «договор» найдутся «договора» и «договором».

Программный поиск: объект ПолнотекстовыйПоиск и запросы

Если нужно встроить поиск в свою обработку или форму, есть два инструмента.

Поиск по индексу из кода

Работает на сервере. Результаты приходят порциями, размер порции задаёте сами.

&НаСервере
Процедура НайтиНаСервере(СтрокаПоиска)

    Результаты.Очистить();

    Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()
        <> РежимПолнотекстовогоПоиска.Разрешить Тогда
        Сообщить("Полнотекстовый поиск выключен в базе");
        Возврат;
    КонецЕсли;

    Список = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, 50);

    Попытка
        Список.ПерваяЧасть();
    Исключение
        Сообщить("Не удалось выполнить поиск: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат;
    КонецПопытки;

    Для Каждого Элемент Из Список Цикл
        НоваяСтрока = Результаты.Добавить();
        НоваяСтрока.Объект   = Элемент.Значение;
        НоваяСтрока.Описание = Элемент.Описание;
    КонецЦикла;

    Сообщить(СтрШаблон("Найдено всего: %1", Формат(Список.ПолноеКоличество(), "ЧГ=0")));

КонецПроцедуры

Здесь Результаты — реквизит формы типа «Таблица значений» с колонками Объект и Описание. Следующие 50 строк получают методом Список.СледующаяЧасть().

💡 Попытка здесь не для красоты. Слишком короткая строка или строка из одних служебных слов вызывает исключение — без обработки пользователь увидит окно ошибки.

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

Подходит, когда ищете по конкретному справочнику и полю. Индекс не нужен, результат всегда актуален.

Функция ЭкранироватьДляПодобно(Знач Текст)
    // Сначала сам спецсимвол, потом остальные
    Для Каждого Символ Из СтрРазделить("~,%,_,[,],^", ",") Цикл
        Текст = СтрЗаменить(Текст, Символ, "~" + Символ);
    КонецЦикла;
    Возврат Текст;
КонецФункции

Функция НайтиКонтрагентов(СтрокаПоиска)
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 50
    |    Контрагенты.Ссылка КАК Ссылка,
    |    Контрагенты.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    (Контрагенты.Наименование ПОДОБНО &Шаблон СПЕЦСИМВОЛ ""~""
    |        ИЛИ Контрагенты.ИНН = &Строка)";
    Запрос.УстановитьПараметр("Шаблон", "%" + ЭкранироватьДляПодобно(СтрокаПоиска) + "%");
    Запрос.УстановитьПараметр("Строка", СтрокаПоиска);
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Экранирование обязательно. Без него пользователь, набравший 100%, получит не то, что ждал: % и _ в ПОДОБНО — служебные символы.

Для строки неограниченной длины (например, комментария) сравнивать напрямую нельзя — оберните поле: ВЫРАЗИТЬ(Документ.Комментарий КАК СТРОКА(1000)) ПОДОБНО &Шаблон.

⚠️ Шаблон с % в начале не использует индекс СУБД. На справочнике в 5 000 строк это незаметно, на регистре в миллионы записей — секунды и десятки секунд. Для таких объёмов берите полнотекстовый поиск.

Обновление индекса и производительность поиска

Индекс сам по себе не обновляется. Новый документ попадёт в поиск только после очередного обновления.

Как устроено обновление

Платформа держит основной и дополнительный индекс. Свежие изменения пишутся в дополнительный — это быстро. Слияние переносит их в основной — это долго, но после него поиск работает быстрее.

Отсюда стандартная схема:

ОперацияКак частоКогда
Обновление индексаКаждые 5–15 минутВ течение дня
Слияние индексовРаз в суткиНочью
Полная очистка и перестроениеПо необходимостиВ выходной

Регламентные задания

В конфигурациях на БСП есть два регламентных задания: обновление и слияние индекса полнотекстового поиска. Расписание меняют в Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания.

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

Для своей конфигурации задание пишут сами:

Процедура ОбновлениеИндексаППД() Экспорт
    Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()
        = РежимПолнотекстовогоПоиска.Разрешить
        И Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда
        ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Истина);
    КонецЕсли;
КонецПроцедуры

Первый параметр ОбновитьИндекс — выполнять ли слияние, второй — индексировать порциями. Порциями — чтобы одно выполнение задания не висело часами.

Как ускорить

  • 🔧 Уберите из индекса реквизиты, по которым никто не ищет: каждый лишний текст увеличивает время обновления.
  • 🔧 Проверьте, не индексируются ли регистры с миллионами записей, где поиск не нужен.
  • 🔧 Держите индекс на быстром диске: обновление активно пишет на диск.
  • 🔧 Не запускайте полное перестроение в рабочее время.

Права доступа и безопасность результатов

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

Есть три места, где можно случайно открыть лишнее.

  1. Привилегированный режим. Если ваш серверный код вызывает поиск или запрос после УстановитьПривилегированныйРежим(Истина), проверка прав отключается. Пользователь увидит то, что видеть не должен. Для поиска привилегированный режим не нужен.
  2. Ограничения на уровне записей. Если в базе настроены RLS (например, доступ только к своим организациям), проверьте поиск под тестовым пользователем с ограничениями. Смотрите и сами строки, и текст в колонке описания.
  3. Файлы индекса. В индексе лежит текст данных базы. Каталог индекса должен быть доступен только служебной учётной записи сервера 1С, а не всем пользователям сетевой папки.

Управлять индексом — разрешать, обновлять, очищать — должен администратор. Обычному пользователю достаточно права искать.

Почему поиск ничего не находит и как это исправить

Большинство жалоб сводится к нескольким ситуациям. Выберите свою:

Диагностика: выберите симптом

Если очистка из формы не помогает и вы решили удалить папку индекса вручную, сначала завершите все сеансы и предупредите пользователей. В клиент-серверной базе это делают при остановленной службе сервера 1С, иначе файлы заняты рабочим процессом. Остановка службы обрывает работу всех баз на этом сервере — планируйте её на нерабочее время.

Частые вопросы

Можно ли искать по содержимому присоединённых файлов?
Встроенный полнотекстовый поиск индексирует реквизиты базы. В конфигурациях на БСП текст из файлов Word и PDF может извлекаться в отдельный реквизит и попадать в индекс — это зависит от настроек работы с файлами.
Сколько места займёт индекс?
Зависит от числа индексируемых реквизитов, а не от размера базы напрямую. База с большими текстовыми комментариями даст индекс больше, чем база с теми же документами без текста.
Ищет ли полнотекстовый поиск по числам и датам?
Номера документов и коды, хранящиеся строкой, находятся. Числовые суммы и даты как значения для поиска текстом не предназначены — для них используйте отбор в списке.
Нужно ли перестраивать индекс после обновления конфигурации?
Если обновление поменяло свойства полнотекстового поиска у объектов — да. Если нет, хватит обычного регулярного обновления.
Работает ли поиск в веб-клиенте?
Да, поиск выполняется на сервере, клиент только передаёт строку и показывает результат.