Как программно применить последний фильтр (отбор) в списке 1С?

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

Очень часто при работе с объемными списками справочников (например, номенклатуры или контрагентов) возникает необходимость быстро применять ранее использованные фильтры. При открытии формы списка пользователи хотят нажать одну горячую клавишу, чтобы установить отбор из списка недавно установленных фильтров, не снимая руки с клавиатуры и не используя мышь. Разберем эту задачу подробно и выясним, как ее можно реализовать в 1С, особенно если речь идет об обычных формах.

Почему нельзя достать стандартную историю отборов программно?

Для начала проанализируем ситуацию с технической точки зрения. Если вы используете обычные формы, вы наверняка замечали стандартную кнопку «История отборов» в командной панели. Логично было бы предположить, что мы можем обратиться к этому списку через встроенный язык 1С и программно выбрать верхнюю строку.

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

Выясним причину такого поведения: сама история сохраняется платформой на базовом (системном) уровне в кэше пользователя. Эти данные записываются в файлы с расширением .pfl, которые лежат в каталоге AppData профиля Windows пользователя, либо во внутреннем хранилище настроек платформы. Из-за этого «вытащить» именно последний отбор из стандартного платформенного окна с помощью кода 1С напрямую не получится.

Решение 1: Кастомный механизм сохранения отборов

Так как добраться до встроенной истории нельзя, мы рассмотрим создание собственного механизма сохранения последних отборов. Это классический подход, который требует небольшой доработки формы списка.

Разберем по шагам, как это реализовать:

  1. Перехват и сохранение отбора: При установке фильтра пользователем (или в обработчике закрытия формы списка) мы считываем параметры текущего активного фильтра. Нам нужно получить данные из свойства ЭлементыФормы.Список.Отбор (какое поле фильтруется, какой вид сравнения используется и само значение).
  2. Запись настроек: Полученные данные мы сохраняем программно. Для этого можно использовать стандартную функцию СохранитьЗначение(), либо сохранять структуру с настройками в специальный регистр сведений или справочник пользовательских настроек.
  3. Назначение горячей клавиши: На форму списка добавляется новая кнопка. Чтобы не перегружать интерфейс, ее можно сделать невидимой. В свойствах этой кнопки (в конфигураторе) назначается нужная комбинация горячих клавиш, например Ctrl + F или F3.
  4. Программное применение (восстановление): В обработчике нажатия нашей новой кнопки мы пишем код, который считывает сохраненные ранее настройки.

Посмотрим на пример логики, которая должна выполняться при нажатии на нашу горячую клавишу:


Процедура ПрименитьПоследнийОтборНажатие(Элемент)
    
    // Пытаемся восстановить ранее сохраненную структуру отбора
    СохраненныйОтбор = ВосстановитьЗначение("ПоследнийОтборНоменклатуры");
    
    Если ТипЗнч(СохраненныйОтбор) = Тип("Структура") Тогда
        // Устанавливаем параметры в отбор списка
        ОтборСписка = ЭлементыФормы.Список.Отбор;
        
        ЭлементОтбора = ОтборСписка.Найти(СохраненныйОтбор.ИмяПоля);
        Если ЭлементОтбора <> Неопределено Тогда
            ЭлементОтбора.ВидСравнения = СохраненныйОтбор.ВидСравнения;
            ЭлементОтбора.Значение     = СохраненныйОтбор.Значение;
            ЭлементОтбора.Использование = Истина;
        КонецЕсли;
    Иначе
        Сообщить("История отборов пуста.");
    КонецЕсли;

КонецПроцедуры

Такой подход полностью контролируется программистом и позволяет реализовать любую логику (например, хранить не один, а 5 последних отборов и выводить их в удобном выпадающем меню).

Решение 2: Использование универсальных отборов на СКД

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

Для этого создаются обработки, которые строятся на базе ПостроительОтчета или Системы компоновки данных (СКД), а результат выводится в ТабличноеПоле. В таких кастомных решениях история отборов является программно управляемой по умолчанию. Вы можете задавать глубину истории, вызывать любой из них по кнопке или шорткату, сохранять сложные комбинации условий ("И/ИЛИ") и все это без потери производительности.

Решение 3: Макросы и AutoHotkey (Программные роботы)

Если вносить изменения в конфигурацию нельзя (например, она полностью на поддержке, а расширения для обычных форм не работают так гибко, как в УФ), проанализируем альтернативный путь. В сообществе 1С часто шутят про применение RPA (Robotic Process Automation) для решения таких задач. Но в этой шутке есть доля правды.

Системные администраторы или продвинутые пользователи часто используют легковесные утилиты-макросы, такие как AutoHotkey (AHK). Поскольку стандартный отбор можно вызвать мышкой или последовательностью клавиш, значит, можно написать скрипт, который будет эмулировать эти действия.

Разберем логику работы такого макроса:

  1. Пользователь нажимает глобальную горячую клавишу (например, F4).
  2. Программа AutoHotkey перехватывает нажатие и проверяет, активно ли окно 1С.
  3. Если окно активно, скрипт быстро отправляет в систему нужную последовательность нажатий: вызов контекстного меню или меню действий -> стрелка вниз до пункта "История отборов" -> выбор первой (верхней) строки -> нажатие Enter.

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

А что с Управляемыми формами (УФ)?

Стоит отметить, что проблема жестко привязана именно к платформе на обычных формах. Если вы используете конфигурацию на Управляемых формах (УФ), то там работа с историей поиска и отборов реализована на уровне платформы гораздо более элегантно. В УФ история поиска работает "из коробки" прямо в строке глобального поиска или в элементах динамических списков, и пользователи реже сталкиваются с необходимостью программировать отдельные горячие клавиши для возврата к предыдущему фильтру.

← На главную