Иногда документы в 1С:Документооборот удобнее искать через глобальный поиск по их регистрационному номеру, чем по названию. При этом глобальный поиск работает не всегда идеально.
Данное расширение исправляет это, добавляя возможность искать через глобальный поиск исключительно по регистрационному номеру.
Содержание
1. Описание работы
После установки расширения достаточно ввести в поле глобального поиска символ "=" (или "= ") и далее указать любой текст, после чего в результатах будут все документы, регистрационный номер номер которых содержит введённый текст (символ "=" в начале строки не учитывается).
Например, "=ДА" (или "= ДА") в демонстрационной базе ДО КОРП 3.0:
По умолчанию результаты поиска сортируются по возрастанию даты регистрации документов, а если нужно сортировать по убыванию даты регистрации, необходимо после символа "=" добавить символ "-" (минус).
Кроме того, можно не указывать символ "=" в начале строки, тогда система сама предложит поискать введённый текст среди регистрационных номеров документов:
Подсказка по использованию поиска отображается при нажатии на гиперссылку "Что искать" внизу списка результатов поиска:
По нажатию на один из вариантов будет произведён поиск, как будто в поле был введён текст "=ДА":
Или как как будто в поле был введён текст "=-ДА":
2. Установка и настройка расширения
Работа расширения проверена в Документооборот КОРП, редакция 3.0 (3.0.12.22) и Документооборот 8 КОРП, редакция 2.1 (2.1.32.6), но, учитывая характер доработки, расширение должно заработать и во всех остальных версиях (Документооборот государственного учреждения, ПРОФ, Холдинг).
Для установки расширения в режиме предприятия необходимо войти в базу под пользователем с полными правами, открыть "Функции для технического специалиста...", выбрать пункт "Управление расширениями конфигурации" ветки "Стандартные", нажать "Добавить", выбрать файл расширения на диске, а после - снять галочку "Безопасный режим" и перезапустить 1С (можно нажать на кнопку "Перепустить" в окне списка расширений.
Так же установить расширение можно через конфигуратор, открыв список расширений, добавив пустое расширение и загрузив в него файл из статьи.
Все необходимые настройки хранятся в константах, которые заполняются значениями по умолчанию при первом обращении к ним:
- Значение строки, которая определяет выводимое количество результатов поиска, хранится в константе "Количество результатов глобального поиска (ПРН)", значение по умолчанию: 15.
- Значение строки, которая определяет очерёдность плана поиска поиска по рег. номеру среди остальных планов глобального поиска, хранится в константе "Порядок поиска по рег. номеру в плане поиска (ПРН)", значение по умолчанию: 1.
- Значение строки, которая активирует поиск по регистрационному номеру, хранится в константе "Префикс глобального поиска по рег. номеру (ПРН)", значение по умолчанию: "=" (символ равно).
- Значение строки, которая задаёт сортировку результатов по убыванию, хранится в константе "Префикс сортировки по убыванию (ПРН)", значение по умолчанию: "-" (символ минус).
3. Подробности работы
Разработка вдохновлена статьей Расширение глобального поиска 1С, или Глобальный поиск "на максималках". Кроме того, в процессе я заглядывал в статью о глобальном поиске на ИТС (23-я платформа).
Идея с поиском по своему алгоритму при наличии специального символа в начале строки поиска хороша, но надо выбрать такой символ, чтобы и запоминался хорошо, и вводить его было удобно, и, желательно, не зависеть от раскладки.
Поэтому я выбрал символ "=", который вводится легко, не нужно нажимать SHIFT, он одинаков в любой раскладке. Хотя мне и кажется, что он не совсем логичен, и нагляднее было бы использовать строку типа "рн" (регистрационный номер) или "рег", но такое неудобно вводить. В любом случае, строку поиска всегда можно поменять на более удобную.
Я решил немного изменить подход и не сразу искать документы, а сначала добавлять в результаты поиска специальный результат, по нажатию на который уже будет запускаться нестандартный алгоритм поиска.
Для этого в ПриНачалеРаботыСистемы я добавляю клиентский ПланПоиска (а так же устанавливаю подсказку ввода и описание поиска):
&После("ПриНачалеРаботыСистемы")
Процедура ПРН_ПриНачалеРаботыСистемы()
ГлобальныйПоиск.УстановитьПодсказкуВвода(НСтр("ru='Что искать?'") + " (CTRL + SHIFT + F)");
ОписаниеГлобальногоПоискаМассив = Новый Массив;
ОписаниеГлобальногоПоискаМассив.Добавить(Новый ФорматированнаяСтрока(НСтр("ru='Что искать:'"), Новый Шрифт(,, Истина)));
ОписаниеГлобальногоПоискаМассив.Добавить(Символы.ПС);
ОписаниеГлобальногоПоискаМассив.Добавить(Символы.ПС);
ОписаниеГлобальногоПоискаМассив.Добавить(НСтр("ru='Введите '"));
ОписаниеГлобальногоПоискаМассив.Добавить(Новый ФорматированнаяСтрока("=", Новый Шрифт(,11, Истина), WebЦвета.Зеленый));
ОписаниеГлобальногоПоискаМассив.Добавить(НСтр("ru=' для поиска документа по '"));
ОписаниеГлобальногоПоискаМассив.Добавить(Новый ФорматированнаяСтрока(НСтр("ru='регистрационному номеру'"), Новый Шрифт(,, Истина), WebЦвета.Зеленый));
ОписаниеГлобальногоПоискаМассив.Добавить(Символы.ПС);
ОписаниеГлобальногоПоискаМассив.Добавить(Символы.ПС);
ОписаниеГлобальногоПоискаМассив.Добавить(НСтр("ru='Введите '"));
ОписаниеГлобальногоПоискаМассив.Добавить(Новый ФорматированнаяСтрока("=", Новый Шрифт(,11, Истина), WebЦвета.Зеленый));
ОписаниеГлобальногоПоискаМассив.Добавить(Новый ФорматированнаяСтрока("-", Новый Шрифт(,15, Истина), WebЦвета.Зеленый));
ОписаниеГлобальногоПоискаМассив.Добавить(НСтр("ru=' для поиска документа по '"));
ОписаниеГлобальногоПоискаМассив.Добавить(Новый ФорматированнаяСтрока(НСтр("ru='регистрационному номеру'"), Новый Шрифт(,, Истина), WebЦвета.Зеленый));
ОписаниеГлобальногоПоискаМассив.Добавить(Символы.ПС);
ОписаниеГлобальногоПоискаМассив.Добавить(НСтр("ru='и сортировки результатов по убыванию даты регистрации'"));
ОписаниеГлобальногоПоискаМассив.Добавить(Символы.ПС);
ОписаниеГлобальногоПоискаМассив.Добавить(Символы.ПС);
ОписаниеГлобальногоПоискаМассив.Добавить(НСтр("ru='Введите строку для поиска, ссылку или арифметическое выражение'"));
ГлобальныйПоиск.УстановитьОписание(Новый ФорматированнаяСтрока(ОписаниеГлобальногоПоискаМассив));
ПорядокПоиска = ПРН_ГлобальныйПоискСерверПовтИспВызов.ПорядокПоиска();
ПрефиксПоиска = ПРН_ГлобальныйПоискСерверПовтИспВызов.ПрефиксПоиска();
ПланПоиска = ГлобальныйПоиск.ПолучитьПлан();
ПланПоиска.Вставить(0, "ДобавитьПоискПоРегНомеру", "ПРН_ГлобальныйПоискКлиент", Ложь, Ложь, ПорядокПоиска, ПрефиксПоиска);
ГлобальныйПоиск.УстановитьПлан(ПланПоиска);
КонецПроцедуры
Клиентский поиск не ищет документ, а лишь добавляет два специальных результата в начало (ПорядокПоиска по умолчанию равен 1, значение хранится в константе) всех результатов поиска:
// Добавляет в результаты поиска специальный результат, по нажатию на который выполнится
// поиск документа по регистрационному номеру. См. ПРН_ГлобальныйПоискСервер.ПоискПоРегистрационномуНомеру
//
// Параметры:
// СтрокаПоиска - Строка - пользовательский ввод
// РезультатыПоиска - РезультатГлобальногоПоиска
// ДопПараметры - Произвольный - передается из ПланаПоиска, см. ПРН_ПриНачалеРаботыСистемы модуля приложения.
//
Процедура ДобавитьПоискПоРегНомеру(СтрокаПоиска, РезультатПоиска, ДопПараметры) Экспорт
// Поиск с сортировкой по возрастанию даты регистрации
ЭлементРезультатаПоиска = Новый ЭлементРезультатаГлобальногоПоиска;
ЭлементРезультатаПоиска.ВидПоиска = "ПоискПоРегНомеру";
ЭлементРезультатаПоиска.Описание = "ПоискПоРегНомеруДатаВозр";
ЭлементРезультатаПоиска.Значение = СтрокаПоиска;
// Представление
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(НСтр("ru='Найти документ по рег. номеру (Дата '"));
МассивСтрок.Добавить(БиблиотекаКартинок.ПереместитьВверх);
МассивСтрок.Добавить("): ");
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(
СтрокаПоиска,
Новый Шрифт(,, Истина),
WebЦвета.Зеленый));
ЭлементРезультатаПоиска.Представление = Новый ФорматированнаяСтрока(МассивСтрок);
ЭлементРезультатаПоиска.Картинка = БиблиотекаКартинок.НайтиВСодержании;
РезультатПоиска.Вставить(0, ЭлементРезультатаПоиска);
// Поиск с сортировкой по убыванию даты регистрации
ЭлементРезультатаПоиска = Новый ЭлементРезультатаГлобальногоПоиска;
ЭлементРезультатаПоиска.ВидПоиска = "ПоискПоРегНомеру";
ЭлементРезультатаПоиска.Описание = "ПоискПоРегНомеруДатаУбыв";
ЭлементРезультатаПоиска.Значение = СтрокаПоиска;
// Представление
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(НСтр("ru='Найти документ по рег. номеру (Дата '"));
МассивСтрок.Добавить(БиблиотекаКартинок.ПереместитьВниз);
МассивСтрок.Добавить("): ");
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(
СтрокаПоиска,
Новый Шрифт(,, Истина),
WebЦвета.Зеленый));
ЭлементРезультатаПоиска.Представление = Новый ФорматированнаяСтрока(МассивСтрок);
ЭлементРезультатаПоиска.Картинка = БиблиотекаКартинок.НайтиВСодержании;
РезультатПоиска.Вставить(1, ЭлементРезультатаПоиска);
КонецПроцедуры
Теперь при любом поиске первыми будут отображаться вот такие строки:
При нажатии на них сработает событие ПриВыбореРезультатаГлобальногоПоиска модуля управляемого приложения и в поле поиска будет подставлена строка поиска, которую ввёл пользователь, предварённая заданным префиксом поиска (ПрефиксПоиска равен "=" по умолчанию, хранится в константе), префиксом сортировки по убыванию (ПрефиксПоискаПоУбыванию равен "-" по умолчанию, хранится в константе), и будет заново запущен глобальный поиск, как будто пользователь всё это ввёл самостоятельно:
&После("ПриВыбореРезультатаГлобальногоПоиска")
// При нажатии на специальный результат поиска имитируется поиск с заданным префиксом.
// См. ПРН_ГлобальныйПоискСервер.ПоискПоРегистрационномуНомеру
Процедура ПРН_ПриВыбореРезультатаГлобальногоПоиска(ЭлементРезультата, СтандартнаяОбработка)
Если ЭлементРезультата.ВидПоиска = "ПоискПоРегНомеру"
И (ЭлементРезультата.Описание = "ПоискПоРегНомеруДатаУбыв" Или ЭлементРезультата.Описание = "ПоискПоРегНомеруДатаВозр") Тогда
СтандартнаяОбработка = Ложь;
ПрефиксПоиска = ПРН_ГлобальныйПоискСерверПовтИспВызов.ПрефиксПоиска();
Если ЭлементРезультата.Описание = "ПоискПоРегНомеруДатаУбыв" Тогда
ПрефиксПоискаПоУбыванию = ПРН_ГлобальныйПоискСерверПовтИспВызов.ПрефиксСортировкиПоУбыванию();
ПрефиксПоиска = ПрефиксПоиска + ПрефиксПоискаПоУбыванию;
КонецЕсли;
ГлобальныйПоиск.НачатьПоиск(ПрефиксПоиска + ЭлементРезультата.Значение);
КонецЕсли;
КонецПроцедуры
После этого сработает событие ПриГлобальномПоиске модуля управляемого приложения, план поиска будет очищен (чтобы не искало лишнего) и в него будет добавлен только один элемент - поиск по регистрационному номеру:
&После("ПриГлобальномПоиске")
// В случае заданного префикса в строке поиска будет запущен специальный поиск.
// См. ПРН_ГлобальныйПоискСервер.ПоискПоРегистрационномуНомеру
//
Процедура ПРН_ПриГлобальномПоиске(СтрокаПоиска, ПланПоиска)
ПорядокПоиска = ПРН_ГлобальныйПоискСерверПовтИспВызов.ПорядокПоиска();
ПрефиксПоиска = ПРН_ГлобальныйПоискСерверПовтИспВызов.ПрефиксПоиска();
Если СтрНачинаетсяС(СтрокаПоиска, ПрефиксПоиска) И СтрДлина(СтрокаПоиска) > СтрДлина(ПрефиксПоиска) Тогда
ПланПоиска.Очистить();
ПланПоиска.Добавить("ПоискПоРегистрационномуНомеру", "ПРН_ГлобальныйПоискСервер", Истина, Истина, ПорядокПоиска);
КонецЕсли;
КонецПроцедуры
Процедура поиска учитывает, что расширение может работать как в ДО 2.1, так в и ДО 3.0 банальной заменой текста запроса, т.к. отличия между конфигурациями для целей расширения - только разные справочники:
- в ДО 2.1 справочники ВнутренниеДокументы, ВходящиеДокументы и ИсходящиеДокументы
- в ДО 3.0 только один справочник ДокументыПредприятия
Проверено на следующих конфигурациях и релизах:
- Документооборот КОРП, релизы 2.1.32.6