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