О расширении
Поле поиска 1С само по себе имеет удобный функционал, но и обладает недостатками. Когда пользователь вводит строку поиска, то платформа ищет буквально все, что может. И метаданные, и элементы базы и справку и так далее. При этом сам пользователь в большинстве случаев знает, что он хочет найти. Например, какую-то обработку или отчет.
Такое поведение и замедляет работу базы, и не предоставляет удобства, ведь среди лишних результатов поиска нужно еще найти свой. А если результатов будет много, то 1С может и отказать в их выводе.
Так же платформа позволяет переопределять поведение строки поиска и наделять ее своими "быстрыми действиями". Но разрабатывать и поддерживать их неудобно, а самого пользователя принуждает запоминать и вводить вручную "ключевые слова".
Данное расширение позволяет объединить все свои допонительные возможности поля поиска в одно иерархическое меню. И предоставляет удобные методы для его настройки. С таким подходом пользователю достаточно запомнить один ключевой символ для активации меню, а дале действовать интерактивно.
Расширение уже содержит встроенное меню, но разработано как фреймворк для создания своих отдельных пунктов. При этом это можно делать в своих независимых расширениях, чтобы не было необходимости изменять основное.
Стандартные возможности строки поиска остаются без изменений, но лишь дополняются своими действиями.
Поддерживаются любые конфигурации с русским или английским языком.
Как это работает
Используются платформенные события, которые позволяют переопределить поведение глобального поиска.
Когда пользователь вводит ключевой символ \
, то расширение перехватывает управление поиском и строит пункты меню (команды).
При интерактивном нажатии на какую-то из команд, расширение соответствующим образом изменяет строку поиска. При изменении строки поиска снова срабатывает логика расширения и выводятся уже подчиненные команды или результаты поиска.
При этом каждая команда может обладать:
- Подчиненными командами (подменю)
- Параметрами, которые могут быть переданы программно или изменены интерактивно (например, номер текущей страницы результатов)
- Строкой поиска
При этом содержимое поля поиска 1С строится и разбирается фреймворком по формату:
\Команда\ПодчиненнаяКоманда?Параметр1=Значение1&Параметр2=Значение2\СтрокаПоиска
Например, в этой строке выполняется команда Метаданные
с параметром Тип
= РегистрыСведений
и C
(страница) = 2
. А в самом конце указана строка поиска:
\Метаданные?Тип=РегистрыСведений&С=2\поль
Сам пользователь никак не формирует эту строку. Все это делает расширение автоматически исходя из интерактивных действий в построенном меню.
Установка
Актуальную версию можно скачать на странице релизов
Файлы расширений приложены в разрезе версии платформы и языка конфигурации. Например, версия для RU-конфигурации и платформы 8.3.22: AdvancedGlobalSearchOneS_RU_8322
Установку необходимо производить в режиме конфигуратора. Снимаются все галочки кроме "Активно". При установке может возникать необходимость решать конфликты. Например, несоответствие идентификатора языка конфигурации.
Почему установка в конфигураторе
Начиная с версии 8.3.22 при добавлении расширения в режиме предриятия могут возникать ошибки по типу:
Не найден метод "ПриГлобальномПоиске", указанный в аннотации метода "РГП_ПриГлобальномПоиске"
Такое возникает, если в конфигурации нет стандартного метода в модуле приложения, а расширение пытается его переопределить.
Это баг платформы и события всё равно будут работать. Ошибка игнорируется в режиме конфигуратора.
Встроенное меню
Расширение имеет встроенное меню, которое можно отключить частично или полностью.
Позволяет искать метаданные по именам, синонимам, подсказкам и так далее. С фильтром по типу метаданных и без. В каждом элементе результата есть свои действия типа создания нового объекта или открытия.
Позволяет искать по открытым формам. Формы можно активировать или закрывать. Дополнительно по форме можно искать элементы. Элемент можно активировать или дополнительно выделить заливкой.
Позволяет выполнить произвольное выражение с выбором контекста (с сохранением истории).
Общая функциональность
Движок помимо построения пунктов меню и вывода результата предоставляет возможности:
-
Панель "Избранное". В каждом пункте меню по умолчанию выводится кнопка, позволяющая добавить текущую строку поиска в избранное. При этом сохраняются все содержимое строки поиска (текущая команда, параметры, строка поиска и так далее). Такие элементы можно открывать как из меню поиска, так и из стандартной панели избранного 1С.
-
Постраничный вывод. Можно использовать специальный метод, который выводит результаты поиска с учетом текущей страницы. При этом пользователь получает интерфейс по быстрому переходу
-
Пользовательские настройки. Существуют как общие настройки (например, количество выводимых на странице результатов), так и индивидульные для команды, которые разработчик добавляет самостоятельно. Расширение предоставляет возможности их интерактивного изменения
-
Готовые программные методы. Множество методов, которые позволяют программисту быстро разрабатывать свои пункты меню
Разработка собственного меню
Для удобства поддержки и обновления самого фреймворка, свои пункты меню строятся не внутри общего расширения, а отдельно в своих независимых.
Для этого в своем расширении необходимо добавить переопределяемый модуль по шаблону:
РГП_ГлобальныйПоискКлиентПереопределяемый_ВАШЕИМЯ
. Этот модуль будет вызываться из фреймворка при определении настроек меню.
Дополнительно можно подключить серверный переопределяемый общий модуль, чтобы при построении меню как-то дополнять данные из сервера.
Шаблоны таких модулей лежат в основном расширении. Их можно просто скопировать в свое и изменить последнюю часть имени, чтобы не было пересечений.
Пример такого расширения лежит в проекте: InfostartToolkit
Оно дополняет меню поиска инструментами Infostart Toolkit
Все команды должны иметь родителя. Все кроме "корневой", которая активируется путём ввода специального символа. Этот же символ далее будет являться разделителем команд.
В расширении есть предопределенное меню с корневой командой, использующей символ. Получить основную команду можно так:
КорневоеМеню = РГП_ГлобальныйПоискКлиент.ОсновноеМенюРасширенногоГлобальногоПоиска(ПараметрыПоиска);
Далее можно добавлять свои команды. Простой пример:
НашеМеню = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "Наше", КорневоеМеню);
НашеМеню.Представление = "Наше меню";
Можно добавить свою картинку:
НашеМеню.Картинка = БиблиотекаКартинок.ПоискДанных;
И подчиненные команды:
Команда при нажатии открывает форму:
Команда = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "К1", НашеМеню);
Команда.Представление = "Открыть форму";
Команда.ВыполняемоеДействие = РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействиеОткрытияФормы("ОбщаяФорма.ОбщиеНастройки");
Команда при нажатии открывает значение:
Команда = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "К2", НашеМеню);
Команда.Представление = "Открыть значение";
Команда.ВыполняемоеДействие = РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействиеОткрытияЗначения(ТекущаяДата());
Команда при нажатии выполняет описание оповещения:
Команда = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "К3", НашеМеню);
Команда.Представление = "Описание оповещения";
ОписаниеОповещения = РГП_ГлобальныйПоискКлиентСервер.ОписаниеОповещения("Процедура1", "Модуль1");
Команда.ВыполняемоеДействие = РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействиеОписанияОповещения(ОписаниеОповещения);
При этом сигнатура описания будет такой:
// Выполнить что-то
//
// Параметры:
// ВыполняемоеДействие - см. РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействие
// ДополнительныеПараметры - Произвольный
Процедура Процедура1(ВыполняемоеДействие, ДополнительныеПараметры) Экспорт
//Что-то делаем
КонецПроцедуры
Команда при нажатии выполняет план поиска:
Команда = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "К4", НашеМеню);
Команда.Представление = "План поиска";
ЭлементПлана = РГП_ГлобальныйПоискКлиент.ЭлементПланаГлобальногоПоискаКоманды("Процедура2", "Модуль1", Ложь);
Команда.ПланПоиска.Добавить(ЭлементПлана);
При этом так может выглядеть процедура плана поиска:
// Заполняем РезультатыПоиска, которые увидит пользователь
//
// Параметры:
// СтрокаПоиска - Строка - Полная строка (включая команды меню).
// РезультатыПоиска - РезультатГлобальногоПоиска - Выходной параметр. Содержит результаты поиска.
// ПараметрыВыполнения - см. ПараметрыВыполненияКомандыПоиска
Процедура Процедура2(Знач СтрокаПоиска, РезультатыПоиска, ПараметрыВыполнения) Экспорт
//Во входящей строке находится полная строка (включая команды меню)
//Если же нам нужна именно строка без команд, то можем взять её в параметрах выполнения
СтрокаПоиска = ПараметрыВыполнения.СтрокаПоиска;
//Здесь у нас находится ключ команды
КлючКоманды = ПараметрыВыполнения.Ключ;
//Так мы можем добавить результат поиска. При этом применяются те же объекты выполняемых действий
ВыполняемоеДействие = РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействиеОткрытияЗначения(ТекущаяДата());
РГП_ГлобальныйПоискКлиентСервер.ДобавитьЭлементРезультатаГлобальногоПоиска(
РезультатыПоиска, ВыполняемоеДействие, "Текущая дата");
КонецПроцедуры
Если доступность команды должна зависеть от прав или ролей пользователя, то для этого можно использовать функции расширения, которые кэшируют получения данных с сервера:
Процедура ПослеЗаполненияПараметровРасширенногоГлобальногоПоиска(ПараметрыПоиска) Экспорт
КомандаПоиска = РГП_ГлобальныйПоискКлиент.ОписаниеКомандыПоискаПоФормам(ПараметрыПоиска);
//Ограничение на полноправного пользователя (БСП)
КомандаПоиска.Использование = РГП_ГлобальныйПоискКлиентСервер.ЭтоПолноправныйПользователь(ПараметрыПоиска);
//Ограничение по конкретной роли
КомандаПоиска.Использование = РГП_ГлобальныйПоискКлиентСервер.РолиДоступны(ПараметрыПоиска, "АдминистраторСистемы");
//Ограничение по конкретному праву
КомандаПоиска.Использование = РГП_ГлобальныйПоискКлиентСервер.ЕстьПравоДоступа(ПараметрыПоиска, "Администрирование");
КонецПроцедуры
Чтобы оптимизировать получение данных о правах и ролях, нужно использовать серверный переопределяемый модуль (чтобы минимизировать обращения к серверу). Тут же можно получить какие-то данные с сервера, которые потом пригодятся в Клиентском переопределяемом модуле для настройки команд.
Процедура ПередЗаполнениемПараметровГлобальногоПоиска(Параметры) Экспорт
РГП_ГлобальныйПоискКлиентСервер.ДополнитьКэшРолейПользователей(Параметры, "АдминистраторСистемы");
РГП_ГлобальныйПоискКлиентСервер.ДополнитьКэшПравПользователей(Параметры, "Администрирование");
Параметры.ДополнительныеПараметры.Вставить("МоиДанные");
КонецПроцедуры
Помощь проекту
Если вы хотите поучавствовать в разработке самого фреймворка, то наюнсы описаны в файле CONTRIBUTING.md