Как отследить событие поиска (Ctrl+F) в динамическом списке и пересчитать итоги в 1С

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При работе с динамическими списками в управляемых формах разработчики часто сталкиваются с необходимостью выполнять дополнительные действия при поиске: вычислять суммы итогов, обновлять выпадающие списки фильтров или изменять оформление. Однако стандартный контекстный поиск, вызываемый по сочетанию клавиш Ctrl+F или через поисковую строку, выполняется базовыми механизмами платформы на лету и не генерирует отдельного события формы вроде ПриПоиске.

Рассмотрим, с чем связано такое ограничение платформы, а также разберем проверенные практические способы решения этой задачи.

Почему платформа не генерирует событие при поиске

Проанализируем работу динамического списка. Интерактивный поиск накладывает временные условия выборки на запрос к базе данных и перерисовывает таблицу на клиенте. При этом:

  1. Строка поиска и быстрые условия фильтрации не добавляются напрямую в коллекцию КомпоновщикНастроек.ПользовательскиеНастройки.Отбор как стандартные элементы отбора.
  2. Динамический список работает в режиме порционной (постраничной) выборки данных с сервера. Обход элементов таблицы на клиенте вернет информацию только по текущей видимой странице, а не по всему отфильтрованному массиву.

Тем не менее, существует несколько эффективных архитектурных решений для отслеживания поиска и получения актуальных данных.

Решение 1. Переопределение сочетания клавиш Ctrl+F и собственный обработчик

Если необходимо полностью контролировать процесс поиска и моментально запускать расчеты, самым надежным способом будет перехват нажатия клавиш Ctrl+F. Для этого создадим пользовательскую команду и назначим ей сочетание клавиш.

Разберем по шагам порядок действий:

  1. В форме списка добавим новую команду, например, КомандаНайтиДокументы.
  2. В свойствах команды установим сочетание клавиш Ctrl+F.
  3. Выведем команду на форму или назначим ее кнопкой по умолчанию.
  4. В обработчике команды вызовем собственную форму диалога ввода строки поиска или наложим отбор программируемо, после чего выполним пересчет показателей.

Решение 2. Использование события ПриАктивизацииСтроки с обработчиком ожидания

Если менять стандартное поведение строки поиска не требуется, можно использовать событие ПриАктивизацииСтроки таблицы динамического списка. После того как пользователь нажимает Ctrl+F и выполняет поиск, платформа обновляет данные списка и автоматически активизирует первую найденную строку.

Чтобы исключить частые и тяжелые запросы к серверу при быстром перемещении по строкам, подключим обработчик ожидания с задержкой в 1 секунду. Это позволит дождаться завершения ввода пользователя и только потом вызывать серверную процедуру пересчета.

Рассмотрим пример реализации на клиенте:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    // Отключаем предыдущий обработчик, если пользователь продолжает навигацию
    ОтключитьОбработчикОжидания("РассчитатьИтогиСЗадержкой");
    
    // Подключаем повторно с задержкой в 1 секунду
    ПодключитьОбработчикОжидания("РассчитатьИтогиСЗадержкой", 1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьИтогиСЗадержкой()
    // Вызов серверной процедуры пересчета итогов
    ОбновитьИтогиНаСервере();
КонецПроцедуры

Решение 3. Расчет итогов через исполняемые настройки компоновки данных

Для корректного расчета итогов по всей отфильтрованной выборке (с учетом введенной строки поиска Ctrl+F) необходимо получить актуальные настройки компоновки непосредственно из элемента формы. Для этого в платформе 1С предусмотрен метод ПолучитьИсполняемыеНастройкиКомпоновкиДанных().

Выясним, как правильно выгрузить данные на сервере:


&НаСервере
Процедура ОбновитьИтогиНаСервере()
    // Получаем текущие настройки динамического списка с учетом поиска
    ИсполняемыеНастройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
    
    // Используем схемы СКД для формирования отдельного легкого запроса расчета итогов
    // ... Выполнение запроса по полученной схеме и настройкам ...
КонецПроцедуры

Решение 4. Обработка пользовательских настроек на сервере

Для отслеживания изменения стандартных панелей отборов и быстрых фильтров таблицы рекомендуется использовать событие таблицы формы ПриОбработкеПользовательскихНастроекНаСервере.

Данный обработчик вызывается на сервере каждый раз, когда пользователь меняет состав отборов, сортировок или группировок через стандартный диалог настроек. В теле этой процедуры можно оперативно перезапускать алгоритм расчета итоговых сумм или обновлять связанные реквизиты формы.

Рекомендации по оптимизации производительности

При реализации расчета итогов по динамическому списку соблюдайте следующие правила:

  1. Избегайте выполнения расчетов в реальном времени при больших объемах данных. Если таблица содержит сотни тысяч записей, автоматический пересчет при каждом изменении фильтра создаст высокую нагрузку на СУБД. В таких случаях предпочтительно выносить расчет итогов на отдельную команду (кнопку «Рассчитать итоги»).
  2. Запрашивайте только агрегаты. В запросе СКД для итогов выбирайте исключительно функции СУММА(), КОЛИЧЕСТВО() или КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...), исключая выборку детальных полей строк.
← На главную