При разработке конфигураций на платформе 1С 7.7 разработчики часто сталкиваются с задачей сокрытия неактуальных или неиспользуемых элементов справочника (например, архивной номенклатуры). Однако после применения стандартных методов фильтрации, таких как УстановитьОтбор() или ИспользоватьСписокЭлементов(), пользователи замечают, что привычный интерактивный поиск (позиционирование курсора при вводе символов с клавиатуры) перестает работать по колонкам «Код» или «Артикул».
Разберем подробно причины такого поведения платформы 1С 7.7 и проанализируем проверенные варианты решения этой проблемы.
Для понимания происходящего проанализируем, как платформа 1С 7.7 взаимодействует с индексами базы данных (особенно в формате DBF):
УстановитьОтбор(): При вызове отбора по реквизиту платформа переключает текущий активный индекс базы данных на специальный составной индекс. В структуре файлов 1С 7.7 такой индекс строится по схеме [РеквизитОтбора] + UPPER(Наименование). Поскольку индекс с комбинацией [РеквизитОтбора] + Код или [РеквизитОтбора] + Артикул в платформе отсутствует, клавиатурный поиск продолжает работать только по наименованию, а по коду и артикулу позиционирование становится невозможным.ИспользоватьСписокЭлементов(): Данный метод переводит форму списка из режима прямой навигации по индексу DBF в режим отображения фиксированного массива элементов. В этом случае платформа полностью отключает применение индексов таблицы для быстрого поиска, из-за чего интерактивный поиск перестает работать по всем колонкам.Самый простой и эффективный способ сохранить стандартный поиск без изменения механизмов индексации — использовать иерархическую структуру справочника.
Рассмотрим алгоритм настройки:
При работе внутри рабочих групп штатный клавиатурный поиск по всем реквизитам (наименованию, коду, артикулу) продолжает функционировать в полном объеме, так как составные индексы DBF не нарушаются.
Если изменять структуру иерархии справочника нельзя, добавим на форму списка специальное поле для ввода подстроки поиска.
Разберем по шагам создание такого механизма:
ТекстПоиска).Посмотрим на пример кода для модуля формы списка справочника:
Процедура ПриИзмененииТекстаПоиска()
Спр = СоздатьОбъект("Справочник.Номенклатура");
// Выполняем поиск по коду или артикулу
Если Спр.НайтиПоКоду(СокрЛП(ТекстПоиска)) = 1 Тогда
АктивизироватьОбъект(Спр.ТекущийЭлемент());
ИначеИли Спр.НайтиПоРеквизиту("Артикул", СокрЛП(ТекстПоиска), 1) = 1 Тогда
АктивизироватьОбъект(Спр.ТекущийЭлемент());
Иначе
Сообщить("Элемент с таким кодом или артикулом не найден!");
КонецЕсли;
КонецПроцедуры
Метод АктивизироватьОбъект() корректно перемещает курсор на нужный элемент таблицы, даже если в форме активен отбор через УстановитьОтбор() или ИспользоватьСписокЭлементов() (при условии, что сам найденный элемент удовлетворяет условиям отбора).
Для сохранения привычного пользовательского опыта (когда поиск начинается сразу при наборе символов на клавиатуре без клика в отдельное поле) проанализируем использование внешней компоненты FormEx.
КлавишаНажата().АктивизироватьОбъект() по результатам поиска.Для сложных проектов наиболее универсальным решением является переход от штатной формы списка к использованию элемента ТабличноеПоле из библиотеки 1С++. Это позволяет выводить данные через прямые SQL-запросы к базе данных и самостоятельно настраивать абсолютно любые отборы, сортировки и алгоритмы поиска по любым колонкам без ограничений штатного движка 1С 7.7.