# AdvancedGlobalSearchOneS для 1С

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

- GitHub: https://github.com/SeiOkami/AdvancedGlobalSearchOneS
- Gitsell page: https://gitsell.ru/SeiOkami/AdvancedGlobalSearchOneS
- Visibility: public/free
- GitHub stars: 71
- Gitsell views: 46
- Gitsell downloads: 1

## 1C Configurations

Not specified.

## Pricing

Free or price is not specified.

## README

[![OpenYellow](https://img.shields.io/endpoint?url=https://openyellow.org/data/badges/1/609629774.json)](https://openyellow.org/grid?data=top&repo=609629774)

# Расширенный глобальный поиск 1С

<details open>
  <summary> О расширении </summary>

## О расширении

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

Такое поведение и замедляет работу базы, и не предоставляет удобства, ведь среди лишних результатов поиска нужно еще найти свой. А если результатов будет много, то 1С может и отказать в их выводе.

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

Данное расширение позволяет объединить все свои допонительные возможности поля поиска в одно иерархическое меню. И предоставляет удобные методы для его настройки. С таким подходом пользователю достаточно запомнить один ключевой символ для активации меню, а дале действовать интерактивно.

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

![image](/docs/img/Основное%20меню.png)

Стандартные возможности строки поиска остаются без изменений, но лишь дополняются своими действиями.

Поддерживаются любые конфигурации с русским или английским языком.

</details>


<details>
  <summary> Как это работает </summary>

## Как это работает

Используются платформенные события, которые позволяют переопределить поведение глобального поиска.

Когда пользователь вводит ключевой символ `\`, то расширение перехватывает управление поиском и строит пункты меню (команды). 
При интерактивном нажатии на какую-то из команд, расширение соответствующим образом изменяет строку поиска. При изменении строки поиска снова срабатывает логика расширения и выводятся уже подчиненные команды или результаты поиска.

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

При этом содержимое поля поиска 1С строится и разбирается фреймворком по формату:
`\Команда\ПодчиненнаяКоманда?Параметр1=Значение1&Параметр2=Значение2\СтрокаПоиска`

Например, в этой строке выполняется команда `Метаданные` с параметром `Тип` = `РегистрыСведений` и `C` (страница) = `2`. А в самом конце указана строка поиска:  
`\Метаданные?Тип=РегистрыСведений&С=2\поль`

Сам пользователь никак не формирует эту строку. Все это делает расширение автоматически исходя из интерактивных действий в построенном меню.

</details>

<details>
  <summary> Установка </summary>

## Установка

Актуальную версию можно скачать на [странице релизов](https://github.com/SeiOkami/AdvancedGlobalSearchOneS/releases)

Файлы расширений приложены в разрезе версии платформы и языка конфигурации. Например, версия для RU-конфигурации и платформы 8.3.22: `AdvancedGlobalSearchOneS_RU_8322`

Установку необходимо производить в режиме конфигуратора. Снимаются все галочки кроме "Активно". При установке может возникать необходимость решать конфликты. Например, несоответствие идентификатора языка конфигурации.

<details>
  <summary> Почему установка в конфигураторе </summary>

Начиная с версии 8.3.22 при добавлении расширения _в режиме предриятия_ могут возникать ошибки по типу:

` Не найден метод "ПриГлобальномПоиске", указанный в аннотации метода "РГП_ПриГлобальномПоиске" `

Такое возникает, если в конфигурации нет стандартного метода в модуле приложения, а расширение пытается его переопределить.

Это баг платформы и события всё равно будут работать. Ошибка игнорируется **в режиме конфигуратора**.

</details>

</details>

<details>
  <summary> Встроенное меню </summary>

## Встроенное меню

Расширение имеет встроенное меню, которое можно отключить частично или полностью.

### Поиск по метаданным

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

![image](/docs/img/Команда.%20Поиск%20по%20метаданным.png)

### Поиск по формам

  Позволяет искать по открытым формам. Формы можно активировать или закрывать.
  Дополнительно по форме можно искать элементы. Элемент можно активировать или дополнительно выделить заливкой.  

![image](/docs/img/Команда.%20Поиск%20по%20формам.png)

### Вычисление выражений

  Позволяет выполнить произвольное выражение с выбором контекста (с сохранением истории).  

![image](/docs/img/Команда.%20Вычисление%20выражений.png)

</details>


<details>
  <summary>Общая функциональность</summary>

## Общая функциональность

Движок помимо построения пунктов меню и вывода результата предоставляет возможности:

- __Панель "Избранное".__ В каждом пункте меню по умолчанию выводится кнопка, позволяющая добавить текущую строку поиска в избранное. При этом сохраняются все содержимое строки поиска (текущая команда, параметры, строка поиска и так далее). Такие элементы можно открывать как из меню поиска, так и из стандартной панели избранного 1С.

- __Постраничный вывод.__ Можно использовать специальный метод, который выводит результаты поиска с учетом текущей страницы. При этом пользователь получает интерфейс по быстрому переходу
![image](/docs/img/Возможности.%20Постраничный%20вывод.png)

- __Пользовательские настройки.__ Существуют как общие настройки (например, количество выводимых на странице результатов), так и индивидульные для команды, которые разработчик добавляет самостоятельно. Расширение предоставляет возможности их интерактивного изменения
![image](/docs/img/Возможности.%20Настройки.png)

- __Готовые программные методы.__ Множество методов, которые позволяют программисту быстро разрабатывать свои пункты меню

</details>
<details>
  <summary>Разработка собственного меню</summary>

## Разработка собственного меню

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

Для этого в своем расширении необходимо добавить переопределяемый модуль по шаблону:
`РГП_ГлобальныйПоискКлиентПереопределяемый_ВАШЕИМЯ`. Этот модуль будет вызываться из фреймворка при определении настроек меню.

Дополнительно можно подключить серверный переопределяемый общий модуль, чтобы при построении меню как-то дополнять данные из сервера.

Шаблоны таких модулей лежат в основном расширении. Их можно просто скопировать в свое и изменить последнюю часть имени, чтобы не было пересечений.

Пример такого расширения лежит в проекте: [InfostartToolkit](РасширенныйГлобальныйПоиск.InfostartToolkit)  
Оно дополняет меню поиска инструментами [Infostart Toolkit](https://infostart.ru/marketplace/toolkit/)

## Примеры своих команд

Все команды должны иметь родителя. Все кроме "корневой", которая активируется путём ввода специального символа. Этот же символ далее будет являться разделителем команд.

В расширении есть предопределенное меню с корневой командой, использующей символ. Получить основную команду можно так:

` КорневоеМеню = РГП_ГлобальныйПоискКлиент.ОсновноеМенюРасширенногоГлобальногоПоиска(ПараметрыПоиска); `

Далее можно добавлять свои команды. Простой пример:

```bsl
НашеМеню = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "Наше", КорневоеМеню);
НашеМеню.Представление = "Наше меню";
```

Можно добавить свою картинку:

```bsl
НашеМеню.Картинка = БиблиотекаКартинок.ПоискДанных;
```

И подчиненные команды:

Команда при нажатии открывает форму:
```bsl
Команда = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "К1", НашеМеню);
Команда.Представление = "Открыть форму";
Команда.ВыполняемоеДействие = РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействиеОткрытияФормы("ОбщаяФорма.ОбщиеНастройки");
```

Команда при нажатии открывает значение:
```bsl
Команда = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "К2", НашеМеню);
Команда.Представление = "Открыть значение";
Команда.ВыполняемоеДействие = РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействиеОткрытияЗначения(ТекущаяДата()); 
```

Команда при нажатии выполняет описание оповещения:
```bsl
Команда = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "К3", НашеМеню);
Команда.Представление = "Описание оповещения";
ОписаниеОповещения = РГП_ГлобальныйПоискКлиентСервер.ОписаниеОповещения("Процедура1", "Модуль1");
Команда.ВыполняемоеДействие = РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействиеОписанияОповещения(ОписаниеОповещения);
```

При этом сигнатура описания будет такой:
```bsl
// Выполнить что-то
// 
// Параметры:
//  ВыполняемоеДействие - см. РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействие
//  ДополнительныеПараметры - Произвольный
Процедура Процедура1(ВыполняемоеДействие, ДополнительныеПараметры) Экспорт
	//Что-то делаем
КонецПроцедуры
```

Команда при нажатии выполняет план поиска:
```bsl
Команда = РГП_ГлобальныйПоискКлиент.НоваяКомандаРасширенногоПоиска(ПараметрыПоиска, "К4", НашеМеню);
Команда.Представление = "План поиска";
ЭлементПлана = РГП_ГлобальныйПоискКлиент.ЭлементПланаГлобальногоПоискаКоманды("Процедура2", "Модуль1", Ложь);
Команда.ПланПоиска.Добавить(ЭлементПлана);
```

При этом так может выглядеть процедура плана поиска:
```bsl
// Заполняем РезультатыПоиска, которые увидит пользователь
// 
// Параметры:
//  СтрокаПоиска - Строка - Полная строка (включая команды меню).
//  РезультатыПоиска - РезультатГлобальногоПоиска - Выходной параметр. Содержит результаты поиска.
//  ПараметрыВыполнения - см. ПараметрыВыполненияКомандыПоиска
Процедура Процедура2(Знач СтрокаПоиска, РезультатыПоиска, ПараметрыВыполнения) Экспорт

  //Во входящей строке находится полная строка (включая команды меню)
  //Если же нам нужна именно строка без команд, то можем взять её в параметрах выполнения
  СтрокаПоиска = ПараметрыВыполнения.СтрокаПоиска;

  //Здесь у нас находится ключ команды
  КлючКоманды = ПараметрыВыполнения.Ключ;

  //Так мы можем добавить результат поиска. При этом применяются те же объекты выполняемых действий
  ВыполняемоеДействие = РГП_ГлобальныйПоискКлиентСервер.ВыполняемоеДействиеОткрытияЗначения(ТекущаяДата());
  РГП_ГлобальныйПоискКлиентСервер.ДобавитьЭлементРезультатаГлобальногоПоиска(
    РезультатыПоиска, ВыполняемоеДействие, "Текущая дата");

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

### Ограничения команд

Если доступность команды должна зависеть от прав или ролей пользователя, то для этого можно использовать функции расширения, которые кэшируют получения данных с сервера:

```bsl
Процедура ПослеЗаполненияПараметровРасширенногоГлобальногоПоиска(ПараметрыПоиска) Экспорт

  КомандаПоиска = РГП_ГлобальныйПоискКлиент.ОписаниеКомандыПоискаПоФормам(ПараметрыПоиска);

  //Ограничение на полноправного пользователя (БСП)
  КомандаПоиска.Использование = РГП_ГлобальныйПоискКлиентСервер.ЭтоПолноправныйПользователь(ПараметрыПоиска);

  //Ограничение по конкретной роли
  КомандаПоиска.Использование = РГП_ГлобальныйПоискКлиентСервер.РолиДоступны(ПараметрыПоиска, "АдминистраторСистемы");

  //Ограничение по конкретному праву
  КомандаПоиска.Использование = РГП_ГлобальныйПоискКлиентСервер.ЕстьПравоДоступа(ПараметрыПоиска, "Администрирование");

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

### Серверные данные

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

```bsl
Процедура ПередЗаполнениемПараметровГлобальногоПоиска(Параметры) Экспорт

  РГП_ГлобальныйПоискКлиентСервер.ДополнитьКэшРолейПользователей(Параметры, "АдминистраторСистемы");
  РГП_ГлобальныйПоискКлиентСервер.ДополнитьКэшПравПользователей(Параметры, "Администрирование");
  Параметры.ДополнительныеПараметры.Вставить("МоиДанные");

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

</details>

<details>
  <summary> Помощь проекту </summary>

## Помощь проекту

Если вы хотите поучавствовать в разработке самого фреймворка, то наюнсы описаны в файле CONTRIBUTING.md

</details>

<details>
  <summary> Контакты и материалы </summary>

## Контакты и материалы

- [Страница проекта](https://github.com/SeiOkami/AdvancedGlobalSearchOneS)
- [Обзорная статья на Инфостарт](https://infostart.ru/public/1833872/?ref=1159)
- [Видео с демонстрацией (новый релиз)](https://youtu.be/0I4q8iwWpPQ)
- [Видео с демонстрацией (старый релиз)](https://youtu.be/8KJ0HJLL4hc)
- [Новости проекта](https://t.me/JuniorOneS)
- [По всем вопросам](https://t.me/SeiOkami)

</details>