При переходе с платформы 1С 7.7 или обычных форм 1С 8.2 на управляемый интерфейс («Такси») разработчики и пользователи часто сталкиваются с изменением поведения табличных частей. В классическом интерфейсе достаточно было установить фокус на нужную колонку и начать набирать первые буквы наименования — курсор автоматически перемещался на первую подходящую позицию. В управляемых формах ввод символов либо сразу открывает системное диалоговое окно поиска с последующей фильтрацией строк, либо переводит текущую ячейку в режим редактирования.
Разберем, почему платформа работает именно так, какие типовые ошибки допускают разработчики при попытке вернуть старое поведение, и как правильно реализовать быстрый переход по строкам без лишних серверных вызовов.
В управляемом интерфейсе состав строк на клиенте отделен от базы данных. Попытка реализовать поиск по табличной части через серверный запрос к информационной базе влечет за собой две серьезные проблемы:
ТекущаяСтрока в управляемой форме ожидает не порядковый номер или индекс строки, а целочисленный идентификатор строки данных формы, получаемый методом ПолучитьИдентификатор().Посмотрим на пример неоптимального подхода, где выполняется лишний серверный контекстный вызов и запрос к еще не сохраненным данным:
// Неоптимальный подход с обращением к базе через запрос
Функция ПолучитьНомерСтроки(Текст)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказ.НомерСтроки,
| Заказ.Товар КАК Товар
|ИЗ
| Документ.ЗаказКлиента.Товары КАК Заказ
|ГДЕ
| Заказ.Ссылка = &Ссылка
|УПОРЯДОЧИТЬ ПО
| Товар";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
// При таком подходе не учитываются новые, еще не записанные строки
Возврат 0;
КонецФункции
Табличная часть документа уже полностью загружена в коллекцию формы Объект.ИмяТабличнойЧасти (тип ДанныеФормыКоллекция). Это позволяет выполнять поиск по начальным символам целиком на стороне клиента без отправки тяжелых серверных запросов.
Разберем по шагам, как найти строку по совпадению первых букв и переключить на нее курсор:
НРег() и метод Лев().ПолучитьИдентификатор().ТекущаяСтрока элемента формы таблицы.Посмотрим на реализацию клиентской процедуры:
&НаКлиенте
Процедура ПерейтиКСтрокеПоПервымБуквам(ИскомыйТекст)
Длина = СтрДлина(ИскомыйТекст);
Если Длина = 0 Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
ТекстЯчейки = Строка(СтрокаТЧ.Номенклатура);
Если НРег(Лев(ТекстЯчейки, Длина)) = НРег(ИскомыйТекст) Тогда
Элементы.Товары.ТекущаяСтрока = СтрокаТЧ.ПолучитьИдентификатор();
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Чтобы предоставить пользователю максимально удобный интерфейс ввода без конфликтов с редактированием ячеек таблицы, добавим над табличной частью отдельное поле ввода.
Строка (например, СтрокаБыстрогоПоиска).АвтоПодборТекста или ПриИзменении.Пример обработчика события поля поиска:
&НаКлиенте
Процедура СтрокаБыстрогоПоискаАвтоПодборТекста(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПерейтиКСтрокеПоПервымБуквам(Текст);
КонецПроцедуры
Если задача не требует жесткой кастомизации формы, проанализируем стандартное поведение платформы 1С 8.3:
Ctrl + F или начале ввода в нередактируемой колонке открывается панель поиска. Она накладывает отбор на видимые строки.Ctrl + Q или кнопка отмены поиска на панели таблицы.F3 и Shift + F3.