Поиск по базе 1С: от галочки в конфигураторе до своего кода
Содержание
Чтобы добавить поиск в 1С, чаще всего хватает полнотекстового поиска платформы: в конфигураторе у нужных объектов и реквизитов ставите свойство «Полнотекстовый поиск» = «Использовать», а в режиме Предприятия разрешаете поиск и строите индекс через Все функции → Стандартные → Управление полнотекстовым поиском. Если нужен поиск по одному справочнику или полю с точным условием, проще написать запрос с ПОДОБНО — индекс тогда не нужен.
Полнотекстовый поиск выбирают, когда пользователи ищут «что-то про Ромашку» по всей базе. Запрос — когда известно, где искать, и важна точность. Встроенная строка поиска в списках работает без всякой настройки.
Какой способ поиска в 1С выбрать под задачу
Сначала определите, кто ищет и что. От этого зависит, нужна ли вообще доработка конфигурации.
| Способ | Когда подходит | Что нужно настроить | Слабые места |
|---|---|---|---|
| Строка поиска в форме списка | Найти документ или элемент в одном списке | Ничего, работает из коробки | Ищет только по колонкам этого списка |
| Ввод по строке в поле | Выбрать контрагента, набрав часть ИНН или названия | Свойства справочника в конфигураторе | Только для полей ввода |
| Полнотекстовый поиск (ППД) | Поиск по всей базе, по комментариям, описаниям | Свойства объектов + индекс | Индекс надо обновлять, он занимает место |
Запрос с ПОДОБНО | Своя обработка, поиск по конкретным полям с условиями | Код | Шаблон %…% читает всю таблицу |
💡 В типовых конфигурациях БП 3.0, ЗУП 3.1 и УТ 11 свойства полнотекстового поиска уже расставлены разработчиком. Там обычно достаточно включить поиск и построить индекс — конфигуратор трогать не надо.
Как включить полнотекстовый поиск в конфигураторе
Этот шаг нужен для своей конфигурации или для нового объекта, который вы добавили сами.
Свойство объекта
- Откройте конфигуратор, в дереве метаданных выберите справочник, документ или регистр.
- Откройте палитру свойств (
Alt+Enter). - Найдите свойство «Полнотекстовый поиск» и выберите «Использовать».
Если у объекта стоит «Не использовать», его данные в индекс не попадут, какие бы галочки ни стояли у реквизитов.
Свойство реквизитов
У каждого реквизита и реквизита табличной части есть такое же свойство. Здесь и решается, сколько будет весить индекс.
- ✅ Включайте: наименование, ИНН, артикул, номер, комментарий, текстовые описания.
- ❌ Выключайте: суммы, количества, служебные флаги, хеши, реквизиты хранилища значения.
- ⚠️ Длинные текстовые реквизиты (строка неограниченной длины) раздувают индекс сильнее всего. Индексируйте их, только если по ним правда ищут.
Ввод по строке
Если задача — быстрый подбор в поле, а не поиск по всей базе, настройте у справочника вкладку «Данные»: список полей «Ввод по строке» (например, Наименование, ИНН, Код) и способ поиска строки — по началу или по любой части. Поиск по любой части удобнее, но на больших справочниках медленнее.
После изменения свойств
Сохраните конфигурацию и выполните Конфигурация → Обновить конфигурацию базы данных (F7). Затем в Предприятии индекс нужно перестроить — старый не знает про новые поля.
В типовой конфигурации на поддержке правка свойств потребует включить возможность изменения. Это усложнит каждое следующее обновление. Если меняете ради одного поля — сначала проверьте, не включено ли оно уже.
Включение поиска и первая индексация в режиме Предприятия
Есть два пути: через команду платформы и через настройки самой конфигурации.
Через стандартную функцию платформы
- Если меню «Все функции» скрыто, включите его:
Главное меню → Сервис → Параметры→ флажок «Отображать команду «Все функции»». - Откройте
Все функции → Стандартные → Управление полнотекстовым поиском. - Нажмите «Разрешить», если поиск запрещён.
- Нажмите «Обновить индекс» и дождитесь окончания.
В форме видно, актуален ли индекс и на какую дату. Это первое место, куда смотреть, если поиск «перестал находить».
Через настройки конфигурации
В конфигурациях на БСП (БП 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 минут | В течение дня |
| Слияние индексов | Раз в сутки | Ночью |
| Полная очистка и перестроение | По необходимости | В выходной |
Регламентные задания
В конфигурациях на БСП есть два регламентных задания: обновление и слияние индекса полнотекстового поиска. Расписание меняют в Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания.
В файловой базе регламентные задания выполняются, только пока открыт хотя бы один клиентский сеанс. Если база стоит ночью без пользователей, ночное слияние не произойдёт.
Для своей конфигурации задание пишут сами:
Процедура ОбновлениеИндексаППД() Экспорт
Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()
= РежимПолнотекстовогоПоиска.Разрешить
И Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда
ПолнотекстовыйПоиск.ОбновитьИндекс(Ложь, Истина);
КонецЕсли;
КонецПроцедуры
Первый параметр ОбновитьИндекс — выполнять ли слияние, второй — индексировать порциями. Порциями — чтобы одно выполнение задания не висело часами.
Как ускорить
- 🔧 Уберите из индекса реквизиты, по которым никто не ищет: каждый лишний текст увеличивает время обновления.
- 🔧 Проверьте, не индексируются ли регистры с миллионами записей, где поиск не нужен.
- 🔧 Держите индекс на быстром диске: обновление активно пишет на диск.
- 🔧 Не запускайте полное перестроение в рабочее время.
Права доступа и безопасность результатов
Полнотекстовый поиск не даёт пользователю больше, чем у него есть по ролям: объекты, на чтение которых нет права, платформа в результаты не включает.
Есть три места, где можно случайно открыть лишнее.
- Привилегированный режим. Если ваш серверный код вызывает поиск или запрос после
УстановитьПривилегированныйРежим(Истина), проверка прав отключается. Пользователь увидит то, что видеть не должен. Для поиска привилегированный режим не нужен. - Ограничения на уровне записей. Если в базе настроены RLS (например, доступ только к своим организациям), проверьте поиск под тестовым пользователем с ограничениями. Смотрите и сами строки, и текст в колонке описания.
- Файлы индекса. В индексе лежит текст данных базы. Каталог индекса должен быть доступен только служебной учётной записи сервера 1С, а не всем пользователям сетевой папки.
Управлять индексом — разрешать, обновлять, очищать — должен администратор. Обычному пользователю достаточно права искать.
Почему поиск ничего не находит и как это исправить
Большинство жалоб сводится к нескольким ситуациям. Выберите свою:
Если очистка из формы не помогает и вы решили удалить папку индекса вручную, сначала завершите все сеансы и предупредите пользователей. В клиент-серверной базе это делают при остановленной службе сервера 1С, иначе файлы заняты рабочим процессом. Остановка службы обрывает работу всех баз на этом сервере — планируйте её на нерабочее время.