Очень часто при работе с объемными списками справочников (например, номенклатуры или контрагентов) возникает необходимость быстро применять ранее использованные фильтры. При открытии формы списка пользователи хотят нажать одну горячую клавишу, чтобы установить отбор из списка недавно установленных фильтров, не снимая руки с клавиатуры и не используя мышь. Разберем эту задачу подробно и выясним, как ее можно реализовать в 1С, особенно если речь идет об обычных формах.
Для начала проанализируем ситуацию с технической точки зрения. Если вы используете обычные формы, вы наверняка замечали стандартную кнопку «История отборов» в командной панели. Логично было бы предположить, что мы можем обратиться к этому списку через встроенный язык 1С и программно выбрать верхнюю строку.
Однако во встроенном языке платформы 1С для обычных форм нет методов для программного обращения к этой стандартной кнопке и ее содержимому. Платформа не отдает этот список разработчику в виде массива, таблицы значений или любой другой коллекции.
Выясним причину такого поведения: сама история сохраняется платформой на базовом (системном) уровне в кэше пользователя. Эти данные записываются в файлы с расширением .pfl, которые лежат в каталоге AppData профиля Windows пользователя, либо во внутреннем хранилище настроек платформы. Из-за этого «вытащить» именно последний отбор из стандартного платформенного окна с помощью кода 1С напрямую не получится.
Так как добраться до встроенной истории нельзя, мы рассмотрим создание собственного механизма сохранения последних отборов. Это классический подход, который требует небольшой доработки формы списка.
Разберем по шагам, как это реализовать:
ЭлементыФормы.Список.Отбор (какое поле фильтруется, какой вид сравнения используется и само значение).СохранитьЗначение(), либо сохранять структуру с настройками в специальный регистр сведений или справочник пользовательских настроек.Ctrl + F или F3.Посмотрим на пример логики, которая должна выполняться при нажатии на нашу горячую клавишу:
Процедура ПрименитьПоследнийОтборНажатие(Элемент)
// Пытаемся восстановить ранее сохраненную структуру отбора
СохраненныйОтбор = ВосстановитьЗначение("ПоследнийОтборНоменклатуры");
Если ТипЗнч(СохраненныйОтбор) = Тип("Структура") Тогда
// Устанавливаем параметры в отбор списка
ОтборСписка = ЭлементыФормы.Список.Отбор;
ЭлементОтбора = ОтборСписка.Найти(СохраненныйОтбор.ИмяПоля);
Если ЭлементОтбора <> Неопределено Тогда
ЭлементОтбора.ВидСравнения = СохраненныйОтбор.ВидСравнения;
ЭлементОтбора.Значение = СохраненныйОтбор.Значение;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
Иначе
Сообщить("История отборов пуста.");
КонецЕсли;
КонецПроцедуры
Такой подход полностью контролируется программистом и позволяет реализовать любую логику (например, хранить не один, а 5 последних отборов и выводить их в удобном выпадающем меню).
Рассмотрим еще один мощный вариант. Если стандартный отбор в обычных формах кажется слишком ограниченным, многие разработчики полностью подменяют стандартный механизм отбора и сортировки списков.
Для этого создаются обработки, которые строятся на базе ПостроительОтчета или Системы компоновки данных (СКД), а результат выводится в ТабличноеПоле. В таких кастомных решениях история отборов является программно управляемой по умолчанию. Вы можете задавать глубину истории, вызывать любой из них по кнопке или шорткату, сохранять сложные комбинации условий ("И/ИЛИ") и все это без потери производительности.
Если вносить изменения в конфигурацию нельзя (например, она полностью на поддержке, а расширения для обычных форм не работают так гибко, как в УФ), проанализируем альтернативный путь. В сообществе 1С часто шутят про применение RPA (Robotic Process Automation) для решения таких задач. Но в этой шутке есть доля правды.
Системные администраторы или продвинутые пользователи часто используют легковесные утилиты-макросы, такие как AutoHotkey (AHK). Поскольку стандартный отбор можно вызвать мышкой или последовательностью клавиш, значит, можно написать скрипт, который будет эмулировать эти действия.
Разберем логику работы такого макроса:
F4).Enter.Этот метод позволяет вообще не писать код в 1С и решает проблему пользователя "не брать мышку в руки", хотя технически является "костылем" на уровне операционной системы.
Стоит отметить, что проблема жестко привязана именно к платформе на обычных формах. Если вы используете конфигурацию на Управляемых формах (УФ), то там работа с историей поиска и отборов реализована на уровне платформы гораздо более элегантно. В УФ история поиска работает "из коробки" прямо в строке глобального поиска или в элементах динамических списков, и пользователи реже сталкиваются с необходимостью программировать отдельные горячие клавиши для возврата к предыдущему фильтру.