Как реализовать быстрый подбор номенклатуры «как в 7.7» через позиционирование в УТ 11.5?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

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

Анализ проблемы: Почему стандартный поиск не всегда подходит

Стандартный динамический список в управляемых формах оптимизирован для работы с большими объемами данных через SQL-запросы. Когда мы вводим текст в поле поиска, платформа накладывает фильтр (ГДЕ Наименование ПОДОБНО...). Это удобно для поиска конкретной позиции, но лишает пользователя контекста — он не видит товаров, которые находятся рядом в справочнике. Наша задача — заставить систему найти ссылку на объект и сделать её активной в списке, сохранив видимость всей структуры справочника.

Решение 1: Программное позиционирование в Динамическом Списке

Рассмотрим основной метод реализации «прыжка». Для этого нам понадобится создать собственное поле ввода и связать его с событием изменения текста. Разберем по шагам:

  1. Добавим на форму реквизит СтрокаПоиска (тип Строка).
  2. Разместим его над динамическим списком номенклатуры.
  3. Для этого поля создадим событие АвтоПодбор или ИзменениеТекста.

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


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

После получения ссылки на клиенте нам нужно обновить свойство ТекущаяСтрока. Посмотрим, как это выглядит в обработчике события:


&НаКлиенте
Процедура СтрокаПоискаИзменениеТекста(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Если ЗначениеЗаполнено(Текст) Тогда
        НайденнаяСсылка = НайтиСсылкуПоТексту(Текст);
        Если ЗначениеЗаполнено(НайденнаяСсылка) Тогда
            Элементы.СписокНоменклатура.ТекущаяСтрока = НайденнаяСсылка;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важный момент: Чтобы поиск работал мгновенно, поле Наименование в справочнике Номенклатура обязательно должно быть индексировано. В типовой УТ 11 это обычно так и есть, но при поиске по артикулу проверьте наличие индекса в свойствах метаданных.

Решение 2: Имитация навигации «Norton Commander» (Enter и Backspace)

Для дам из колл-центра критически важна возможность перемещаться по папкам без использования мыши. В 1С 7.7 нажатие Enter на папке открывало её, а Backspace возвращал на уровень выше. В управляемых формах Enter часто сразу выбирает товар в документ.

Выясним, как переопределить это поведение. Нам нужно перехватить событие выбора в таблице:


&НаКлиенте
Процедура СписокНоменклатураВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Если это папка - проваливаемся внутрь
    ДанныеСтроки = Элементы.СписокНоменклатура.ДанныеСтроки(ВыбраннаяСтрока);
    Если ДанныеСтроки.ЭтоГруппа Тогда
        СтандартнаяОбработка = Ложь;
        Элементы.СписокНоменклатура.РодительВерхнегоУровня = ВыбраннаяСтрока;
    КонецЕсли;
КонецПроцедуры

Для реализации возврата назад по Backspace лучше всего создать команду формы, назначить ей сочетание клавиш и прописать программный сброс родителя:


&НаКлиенте
Процедура КомандаВверх(Команда)
    ТекущийРодитель = Элементы.СписокНоменклатура.РодительВерхнегоУровня;
    Если ЗначениеЗаполнено(ТекущийРодитель) Тогда
        // Получаем родителя текущей группы через серверный вызов
        НовыйРодитель = ПолучитьРодителяНаСервере(ТекущийРодитель);
        Элементы.СписокНоменклатура.РодительВерхнегоУровня = НовыйРодитель;
    КонецЕсли;
КонецПроцедуры

Оптимизация: Таблицы значений против Динамических списков

Рассмотрим ситуацию, когда данных не очень много (до 10-15 тысяч позиций). Автор темы упоминал, что использование Таблицы Значений (ТЗ) на форме работает медленно. Проанализируем причину: при каждом поиске данные могут перекачиваться с сервера на клиент целиком.

Если вы всё же решили использовать ТЗ для максимальной скорости позиционирования (метод НайтиСтроки() на клиенте), следуйте этим правилам:

  1. Используйте ДанныеФормыКоллекция и загружайте в неё только необходимые колонки (Наименование, Ссылка, Артикул).
  2. Избегайте частого обновления всей таблицы.
  3. Применяйте метод Элементы.Таблица.ОтобразитьСтроку(), чтобы список автоматически прокручивался к найденному результату.

Использование полнотекстового поиска (ППД)

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

Метод ПолнотекстовыйПоиск.СоздатьСписок(ТекстПоиска) возвращает массив объектов. Мы можем взять первый элемент этого массива и установить его как ТекущаяСтрока. Это обеспечит высокую скорость даже на базах с сотнями тысяч SKU.

Заключение и рекомендации

Проанализировав задачу, мы приходим к выводу, что «ломать» систему и внедрять старые обычные формы в УТ 11.5 — путь к проблемам с обновлениями. Оптимальным решением будет:

Помните, что комфорт пользователя — это баланс между привычками и технологическими возможностями платформы. Реализовав предложенные методы, вы сохраните высокую скорость работы колл-центра, не нарушая архитектуру 1С:Предприятие 8.3.

← На главную