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