Почему в 1С при поиске по Ctrl+F в динамическом списке отображаются не все данные и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Каждый технический специалист или опытный пользователь систем на платформе «1С:Предприятие 8» рано или поздно сталкивается со странным поведением поиска в списках. Типичный сценарий: пользователь пытается найти элемент справочника или документ в динамическом списке, нажимает горячие клавиши Ctrl+F (или использует стандартное поле быстрого поиска), вводит строку поиска, но система ничего не находит. В то же время, если открыть форму расширенного поиска по клавишам Alt+F, те же самые элементы мгновенно обнаруживаются.

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

Разберем механизмы работы Ctrl+F и Alt+F: в чем разница?

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

Быстрый поиск (Ctrl+F) ориентирован в первую очередь на скорость работы. В современных конфигурациях 1С, особенно в управляемых формах, динамические списки отображают огромные массивы информации. Чтобы при вводе каждого символа система не «замораживала» интерфейс, отправляя тяжелые запросы к СУБД, платформа использует встроенный механизм полнотекстового поиска данных (ППД). Когда в свойствах динамического списка заполнена «Основная таблица» (например, Справочник.Номенклатура), платформа перенаправляет поисковый запрос из строки Ctrl+F не к таблицам базы данных SQL, а к предварительно построенному и проиндексированному файловому кэшу полнотекстового поиска. Если данный индекс поврежден, устарел или не содержит сведений о конкретных записях, то Ctrl+F вернет пустой результат.

Расширенный поиск (Alt+F) устроен совершенно иначе. Этот механизм предназначен для точечной фильтрации данных по конкретным колонкам. При его вызове платформа полностью игнорирует полнотекстовый индекс. Вместо этого она транслирует запрос напрямую к СУБД (будь то MS SQL Server, PostgreSQL или файловая база данных), преобразуя поисковую строку в SQL-конструкцию со стандартным оператором сравнения ПОДОБНО (в SQL-синтаксисе это оператор LIKE). База данных обращается к актуальным физическим таблицам, поэтому расширенный поиск всегда гарантированно находит актуальные данные, даже если они были записаны секунду назад и еще не успели попасть в индекс ППД.

Влияние программной загрузки данных на индексацию

Особое внимание следует уделить моменту массового наполнения базы данных. Как показывает практика, проблема «невидимости» данных для Ctrl+F часто возникает после работы внешних обработок переноса или загрузки данных. Почему так происходит?

При написании обработок загрузки разработчики ради ускорения процесса записи тысяч объектов часто используют специальный режим:


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

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

Пошаговая инструкция по исправлению проблемы

Рассмотрим последовательность действий, которые помогут восстановить корректную работу поиска Ctrl+F в динамических списках.

Шаг 1: Обновление и полное перестроение индекса полнотекстового поиска

Большинство пользователей и администраторов при возникновении проблем с поиском запускают регламентное задание по обновлению индекса. Однако, если элементы не были зарегистрированы в очереди на индексацию (как в случае с загрузкой данных), обычное обновление не принесет результатов, так как система считает, что обновлять нечего. Требуется провести полную очистку и переиндексацию.

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

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

Шаг 2: Программная перезапись «проблемных» объектов

Если информационная база слишком велика, а полное перестроение индекса заблокирует работу пользователей на долгое время, мы можем принудительно заставить платформу зарегистрировать для индексации только конкретный справочник или документы. Для этого напишем и запустим простую внешнюю обработку, которая программно перезапишет нужные элементы в обычном режиме (без флага загрузки):


Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    ОбъектНоменклатуры = Выборка.ПолучитьОбъект();
    // Отключаем режим загрузки, чтобы сработали все стандартные механизмы регистрации
    ОбъектНоменклатуры.ОбменДанными.Загрузка = Ложь;
    Попытка
        ОбъектНоменклатуры.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ОшибкиИндексации", УровеньЖурналаРегистрации.Ошибка,,, 
            "Не удалось перезаписать объект: " + ОбъектНоменклатуры.Ссылка + " - " + ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

Этот код принудительно обновит время модификации объектов и добавит их в очередь на индексацию полнотекстового поиска. После выполнения обработки достаточно запустить стандартное регламентное задание ОбновлениеИндексаППД или нажать кнопку «Обновить индекс» в настройках администрирования. Процесс займет считанные минуты, так как обрабатываться будут только элементы конкретного справочника. Для интерактивного мониторинга и регламентных операций с индексом можно использовать обработку для управления полнотекстовым поиском.

Шаг 3: Настройка параметров динамического списка в конфигураторе

Если проблема носит регулярный характер, а высокая скорость поиска по миллионной базе не требуется (например, в справочнике содержится всего несколько тысяч элементов), мы можем изменить логику работы динамического списка непосредственно в конфигураторе, чтобы Ctrl+F всегда искал данные напрямую в СУБД.

Рассмотрим, как это сделать:

  1. Откроем конфигурацию и найдем форму, в которой расположен проблемный динамический список.
  2. Выделим элемент формы с типом ДинамическийСписок и откроем его палитру свойств.
  3. Найдем свойство Основная таблица. Если в нем указана конкретная таблица, то платформа по умолчанию задействует механизм полнотекстового поиска для Ctrl+F.
  4. Если мы очистим это поле, то динамический список перейдет в режим работы по произвольному запросу. Поиск по строке начнет транслироваться в SQL-запросы напрямую к базе данных. Это решит проблему с Ctrl+F раз и навсегда для данного списка, но может снизить скорость работы при поиске по большим таблицам.
  5. Также проверим реквизиты списка. Чтобы поиск по строке работал корректно, убедимся, что у нужных колонок (например, «Код», «Наименование», «Артикул») в настройках списка установлен флаг Использовать всегда, либо эти колонки физически вынесены на форму.

Шаг 4: Анализ работы СУБД и исправление ошибок базы данных

В редких случаях, особенно в клиент-серверных вариантах работы на базе СУБД (MS SQL, PostgreSQL, IBM DB2), сбои в работе полнотекстового поиска могут быть вызваны рассинхронизацией физических таблиц или повреждением файлов базы данных. В таких ситуациях простые административные действия внутри «1С:Предприятия» могут не дать стабильного результата.

Для устранения глубоких системных ошибок выполним следующие шаги:

  1. Запустим информационную базу в режиме Конфигуратор монопольно (все пользователи должны выйти из системы).
  2. Откроем меню Администрирование — Тестирование и исправление...
  3. Установим флаги напротив следующих проверок:
    • Реиндексация таблиц информационной базы (перестроит индексы СУБД, что улучшит производительность и исправит ошибки связей).
    • Проверка логической целостности информационной базы (проверит внутреннюю структуру данных на наличие ошибок).
    • Реструктуризация таблиц информационной базы (полностью пересоздаст физические таблицы базы данных, устраняя скрытые дефекты разметки).
  4. Нажмем кнопку Выполнить и дождемся окончания процесса.

После проведения комплексного тестирования и исправления рекомендуется повторить Шаг 1 (очистку и перестроение индекса полнотекстового поиска) в режиме предприятия. Совместное выполнение этих процедур гарантированно восстанавливает работоспособность всех механизмов поиска в любых списках системы 1С.

← На главную