При переходе с устаревших систем на современные конфигурации вроде УТ 11.5 или ERP, опытные операторы колл-центров часто сталкиваются с дискомфортом. В старых версиях (1С 7.7) поиск работал по принципу «прыжка»: пользователь начинал набирать текст, и курсор мгновенно перемещался на подходящую строку, не скрывая при этом остальной список. В управляемом приложении 1С 8.3 стандартный поиск работает через отбор, скрывая всё лишнее, что не всегда удобно при работе «на телефоне».
В этой статье мы разберем, как технически реализовать привычное «позиционирование» вместо «отбора», проанализируем возможности динамических списков и создадим удобный интерфейс для быстрого подбора.
Стандартный динамический список в управляемых формах оптимизирован для работы с большими объемами данных через SQL-запросы. Когда мы вводим текст в поле поиска, платформа накладывает фильтр (ГДЕ Наименование ПОДОБНО...). Это удобно для поиска конкретной позиции, но лишает пользователя контекста — он не видит товаров, которые находятся рядом в справочнике. Наша задача — заставить систему найти ссылку на объект и сделать её активной в списке, сохранив видимость всей структуры справочника.
Рассмотрим основной метод реализации «прыжка». Для этого нам понадобится создать собственное поле ввода и связать его с событием изменения текста. Разберем по шагам:
СтрокаПоиска (тип Строка).АвтоПодбор или ИзменениеТекста.Проанализируем программный код, который будет выполняться на стороне сервера для поиска подходящей ссылки:
&НаСервереБезКонтекста
Функция НайтиСсылкуПоТексту(Знач ТекстПоиска)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Текст + ""%""
| И НЕ Номенклатура.ЭтоГруппа
|УПОРЯДОЧИТЬ ПО
| Номенклатура.Наименование";
Запрос.УстановитьПараметр("Текст", ТекстПоиска);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
После получения ссылки на клиенте нам нужно обновить свойство ТекущаяСтрока. Посмотрим, как это выглядит в обработчике события:
&НаКлиенте
Процедура СтрокаПоискаИзменениеТекста(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ЗначениеЗаполнено(Текст) Тогда
НайденнаяСсылка = НайтиСсылкуПоТексту(Текст);
Если ЗначениеЗаполнено(НайденнаяСсылка) Тогда
Элементы.СписокНоменклатура.ТекущаяСтрока = НайденнаяСсылка;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный момент: Чтобы поиск работал мгновенно, поле Наименование в справочнике Номенклатура обязательно должно быть индексировано. В типовой УТ 11 это обычно так и есть, но при поиске по артикулу проверьте наличие индекса в свойствах метаданных.
Для дам из колл-центра критически важна возможность перемещаться по папкам без использования мыши. В 1С 7.7 нажатие Enter на папке открывало её, а Backspace возвращал на уровень выше. В управляемых формах Enter часто сразу выбирает товар в документ.
Выясним, как переопределить это поведение. Нам нужно перехватить событие выбора в таблице:
&НаКлиенте
Процедура СписокНоменклатураВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Если это папка - проваливаемся внутрь
ДанныеСтроки = Элементы.СписокНоменклатура.ДанныеСтроки(ВыбраннаяСтрока);
Если ДанныеСтроки.ЭтоГруппа Тогда
СтандартнаяОбработка = Ложь;
Элементы.СписокНоменклатура.РодительВерхнегоУровня = ВыбраннаяСтрока;
КонецЕсли;
КонецПроцедуры
Для реализации возврата назад по Backspace лучше всего создать команду формы, назначить ей сочетание клавиш и прописать программный сброс родителя:
&НаКлиенте
Процедура КомандаВверх(Команда)
ТекущийРодитель = Элементы.СписокНоменклатура.РодительВерхнегоУровня;
Если ЗначениеЗаполнено(ТекущийРодитель) Тогда
// Получаем родителя текущей группы через серверный вызов
НовыйРодитель = ПолучитьРодителяНаСервере(ТекущийРодитель);
Элементы.СписокНоменклатура.РодительВерхнегоУровня = НовыйРодитель;
КонецЕсли;
КонецПроцедуры
Рассмотрим ситуацию, когда данных не очень много (до 10-15 тысяч позиций). Автор темы упоминал, что использование Таблицы Значений (ТЗ) на форме работает медленно. Проанализируем причину: при каждом поиске данные могут перекачиваться с сервера на клиент целиком.
Если вы всё же решили использовать ТЗ для максимальной скорости позиционирования (метод НайтиСтроки() на клиенте), следуйте этим правилам:
Элементы.Таблица.ОтобразитьСтроку(), чтобы список автоматически прокручивался к найденному результату.В современных конфигурациях 1С эффективнее использовать механизм ПолнотекстовыйПоиск. Разберем ситуацию, когда поиск идет не только по началу строки, но и по вхождению слов. Это позволит оператору быстрее находить товар, даже если он не помнит точного начала названия.
Метод ПолнотекстовыйПоиск.СоздатьСписок(ТекстПоиска) возвращает массив объектов. Мы можем взять первый элемент этого массива и установить его как ТекущаяСтрока. Это обеспечит высокую скорость даже на базах с сотнями тысяч SKU.
Проанализировав задачу, мы приходим к выводу, что «ломать» систему и внедрять старые обычные формы в УТ 11.5 — путь к проблемам с обновлениями. Оптимальным решением будет:
ТекущейСтрокой.Помните, что комфорт пользователя — это баланс между привычками и технологическими возможностями платформы. Реализовав предложенные методы, вы сохраните высокую скорость работы колл-центра, не нарушая архитектуру 1С:Предприятие 8.3.