Как реализовать поиск и переход к строке по первым буквам в табличной части 1С 8.3?

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

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

Разберем, почему платформа работает именно так, какие типовые ошибки допускают разработчики при попытке вернуть старое поведение, и как правильно реализовать быстрый переход по строкам без лишних серверных вызовов.

Особенности архитектуры управляемых форм и разбор частых ошибок

В управляемом интерфейсе состав строк на клиенте отделен от базы данных. Попытка реализовать поиск по табличной части через серверный запрос к информационной базе влечет за собой две серьезные проблемы:

  1. Неактуальность данных: Если документ еще не записан в базу или пользователь отредактировал состав строк в текущем сеансе, серверный запрос к табличной части документа вернет либо пустой результат, либо устаревшие данные из базы данных.
  2. Некорректная установка текущей строки: Свойство элемента формы ТекущаяСтрока в управляемой форме ожидает не порядковый номер или индекс строки, а целочисленный идентификатор строки данных формы, получаемый методом ПолучитьИдентификатор().

Посмотрим на пример неоптимального подхода, где выполняется лишний серверный контекстный вызов и запрос к еще не сохраненным данным:


// Неоптимальный подход с обращением к базе через запрос
Функция ПолучитьНомерСтроки(Текст)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Заказ.НомерСтроки,
        |   Заказ.Товар КАК Товар
        |ИЗ
        |   Документ.ЗаказКлиента.Товары КАК Заказ
        |ГДЕ
        |   Заказ.Ссылка = &Ссылка
        |УПОРЯДОЧИТЬ ПО
        |   Товар";
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    // При таком подходе не учитываются новые, еще не записанные строки
    Возврат 0;
КонецФункции

Решение 1. Быстрый поиск и позиционирование на клиенте без серверных вызовов

Табличная часть документа уже полностью загружена в коллекцию формы Объект.ИмяТабличнойЧасти (тип ДанныеФормыКоллекция). Это позволяет выполнять поиск по начальным символам целиком на стороне клиента без отправки тяжелых серверных запросов.

Разберем по шагам, как найти строку по совпадению первых букв и переключить на нее курсор:

  1. Обходим коллекцию строк табличной части в цикле на клиенте.
  2. Сравниваем начало текстового представления реквизита с введенной строкой без учета регистра через функцию НРег() и метод Лев().
  3. При нахождении первого совпадения получаем внутренний идентификатор строки через метод ПолучитьИдентификатор().
  4. Присваиваем полученный идентификатор свойству ТекущаяСтрока элемента формы таблицы.

Посмотрим на реализацию клиентской процедуры:


&НаКлиенте
Процедура ПерейтиКСтрокеПоПервымБуквам(ИскомыйТекст)
    Длина = СтрДлина(ИскомыйТекст);
    Если Длина = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        ТекстЯчейки = Строка(СтрокаТЧ.Номенклатура);
        Если НРег(Лев(ТекстЯчейки, Длина)) = НРег(ИскомыйТекст) Тогда
            Элементы.Товары.ТекущаяСтрока = СтрокаТЧ.ПолучитьИдентификатор();
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Решение 2. Создание специального поля быстрого поиска над таблицей

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

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

Пример обработчика события поля поиска:


&НаКлиенте
Процедура СтрокаБыстрогоПоискаАвтоПодборТекста(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПерейтиКСтрокеПоПервымБуквам(Текст);
КонецПроцедуры

Решение 3. Использование штатных возможностей платформы

Если задача не требует жесткой кастомизации формы, проанализируем стандартное поведение платформы 1С 8.3:

  1. Стандартный поиск: При нажатии клавиши Ctrl + F или начале ввода в нередактируемой колонке открывается панель поиска. Она накладывает отбор на видимые строки.
  2. Сброс поиска: Для быстрого возврата к полному списку используется стандартное сочетание клавиш Ctrl + Q или кнопка отмены поиска на панели таблицы.
  3. Полнотекстовый поиск и навигация: В списках с большим объемом данных типовой полнотекстовый поиск платформы работает эффективнее линейного перебора строк и позволяет переходить между найденными значениями с помощью клавиш F3 и Shift + F3.
← На главную