Почему при установке отбора в форме списка 1С 7.7 перестает работать поиск по коду и артикулу и как это исправить

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке конфигураций на платформе 1С 7.7 разработчики часто сталкиваются с задачей сокрытия неактуальных или неиспользуемых элементов справочника (например, архивной номенклатуры). Однако после применения стандартных методов фильтрации, таких как УстановитьОтбор() или ИспользоватьСписокЭлементов(), пользователи замечают, что привычный интерактивный поиск (позиционирование курсора при вводе символов с клавиатуры) перестает работать по колонкам «Код» или «Артикул».

Разберем подробно причины такого поведения платформы 1С 7.7 и проанализируем проверенные варианты решения этой проблемы.

Причины проблемы: особенности механики индексов 1С 7.7

Для понимания происходящего проанализируем, как платформа 1С 7.7 взаимодействует с индексами базы данных (особенно в формате DBF):

  1. Использование метода УстановитьОтбор(): При вызове отбора по реквизиту платформа переключает текущий активный индекс базы данных на специальный составной индекс. В структуре файлов 1С 7.7 такой индекс строится по схеме [РеквизитОтбора] + UPPER(Наименование). Поскольку индекс с комбинацией [РеквизитОтбора] + Код или [РеквизитОтбора] + Артикул в платформе отсутствует, клавиатурный поиск продолжает работать только по наименованию, а по коду и артикулу позиционирование становится невозможным.
  2. Использование метода ИспользоватьСписокЭлементов(): Данный метод переводит форму списка из режима прямой навигации по индексу DBF в режим отображения фиксированного массива элементов. В этом случае платформа полностью отключает применение индексов таблицы для быстрого поиска, из-за чего интерактивный поиск перестает работать по всем колонкам.

Способ 1. Использование служебных групп (иерархическая изоляция)

Самый простой и эффективный способ сохранить стандартный поиск без изменения механизмов индексации — использовать иерархическую структуру справочника.

Рассмотрим алгоритм настройки:

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

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

Способ 2. Программное поле поиска с методом АктивизироватьОбъект()

Если изменять структуру иерархии справочника нельзя, добавим на форму списка специальное поле для ввода подстроки поиска.

Разберем по шагам создание такого механизма:

  1. Разместим на форме списка справочника поле ввода текстового типа (например, ТекстПоиска).
  2. В обработчике изменения этого поля или по кнопке «Найти» пропишем программный поиск элемента и последующее позиционирование на нем.

Посмотрим на пример кода для модуля формы списка справочника:


Процедура ПриИзмененииТекстаПоиска()
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    
    // Выполняем поиск по коду или артикулу
    Если Спр.НайтиПоКоду(СокрЛП(ТекстПоиска)) = 1 Тогда
        АктивизироватьОбъект(Спр.ТекущийЭлемент());
    ИначеИли Спр.НайтиПоРеквизиту("Артикул", СокрЛП(ТекстПоиска), 1) = 1 Тогда
        АктивизироватьОбъект(Спр.ТекущийЭлемент());
    Иначе
        Сообщить("Элемент с таким кодом или артикулом не найден!");
    КонецЕсли;
КонецПроцедуры

Метод АктивизироватьОбъект() корректно перемещает курсор на нужный элемент таблицы, даже если в форме активен отбор через УстановитьОтбор() или ИспользоватьСписокЭлементов() (при условии, что сам найденный элемент удовлетворяет условиям отбора).

Способ 3. Перехват ввода и поиск с помощью внешних компонент (FormEx)

Для сохранения привычного пользовательского опыта (когда поиск начинается сразу при наборе символов на клавиатуре без клика в отдельное поле) проанализируем использование внешней компоненты FormEx.

  1. Подключим внешнюю компоненту FormEx при запуске системы или открытии формы.
  2. Перехватим событие нажатия клавиш в таблице формы списка с помощью обработки события КлавишаНажата().
  3. Накапливаем введенные символы в буферную переменную и вызываем метод АктивизироватьОбъект() по результатам поиска.

Способ 4. Использование компонент 1С++ и ТабличногоПоля

Для сложных проектов наиболее универсальным решением является переход от штатной формы списка к использованию элемента ТабличноеПоле из библиотеки 1С++. Это позволяет выводить данные через прямые SQL-запросы к базе данных и самостоятельно настраивать абсолютно любые отборы, сортировки и алгоритмы поиска по любым колонкам без ограничений штатного движка 1С 7.7.

← На главную