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