Реализация поиска по первым символам в Управляемых формах

19.03.15

Задачи пользователя - Поиск данных

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

Скачать файлы

Наименование Файл Версия Размер
Поиска по первым символам база + пояснения
.rar 393,48Kb
79
.rar 393,48Kb 79 Скачать

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

 

Краткое описание алгоритма:

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

 

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

 

1) Создаем форму списка

2) У формы списка создаем два реквизита

а) СтрокаПоиска с типом Строка

б) ВыборкаПоОбъект с типом таблица значений

3)На форме списка размещаем реквизит формы "СтрокаПоиска" в поле ввода и назначаем горячую клавишу "Ctrl+S".

 

4) Создаем две команды формы Вперед и Назад, размещаем их на форме списка. Командам назначаем обработчики.

5)В объекте, в нашем случае в номенклатуре создаем СКД с помощью которой будет формироваться список объектов по которым будет ходить курсор поиска. В СКД пишем запрос так что бы потом представлялось возможным открыть его в конструкторе запроса, а в коде заменить определенные подстроки и получить запрос к исполнению. А именно в время поиска важна Сортировка в списке объектов и то в какая ячейка сейчас выделена (по ней искать и нужно).

К примеру запрос

  ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Родитель,
Номенклатура.ОсновнойПоставщик.Наименование КАК ОсновнойПоставщик,
Номенклатура.Наименование
ПОМЕСТИТЬ ТаблицаНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаНоменклатуры.Ссылка,
ТаблицаНоменклатуры.Родитель,
ТаблицаНоменклатуры.ОсновнойПоставщик,
ТаблицаНоменклатуры.Наименование
ИЗ
ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
ГДЕ
(
&актинаяЯчйка ПОДОБНО &СтрокаПоиска
ИЛИ ТаблицаНоменклатуры.Ссылка = &Ссылка)

УПОРЯДОЧИТЬ ПО
&ПараметрУПР

  

В этом запросе потом меняем

 


ЯчекааПоиска="ТаблицаНоменклатуры."+АктинаяЯчейка;
ТекстЗапроса=СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос;

ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&ПараметрУПР",Порядок);
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&актинаяЯчйка",ЯчекааПоиска);

СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос=ТекстЗапроса;

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

 

5) программно переносим отборы настроенные в динамическом списке в нашу СКД поиска (этого пока не реализовано в примере, если будет актуально хотя бы нескольким пользователям то можно и доработать).

               

6) Так же в настройках СКД предусмотрительно добавляем возможные отборы, для иерархического справочника это будет Родитель элемента.

 

В случае если поиск в иерархическом справочнике, и отображение не списком то будет заполнять отбор

 

Если ПараметрыПоиска.Отображение<>"Список" тогда
// Натсройка отборов
НастройкиР.Отбор.Элементы[0].Использование=истина;
НастройкиР.Отбор.Элементы[0].ПравоеЗначение=ССылка.Родитель;

КонецЕсли;

 7) У элемента формы СПИСОК создаем событие "СписокПриАктивизацииЯчейки" в нем прописываем заполнение переменой "АктинаяЯчейка" объявленной в модуле формы:


&НаКлиенте
Перем АктинаяЯчейка;
&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
АктинаяЯчейка=Элемент.ТекущийЭлемент.Имя;
КонецПроцедуры

8) У поля ввода "СтрокаПоиска" (пункт 3), создаем обработчик события "АвтоПодбор", в нем прописываем:

 &НаКлиенте

Процедура СтрокаПоискаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)

ПараметрыПоиска=ФормированиеСтруктурыПоиска();
ПоискПодобноНаСервер(ПараметрыПоиска);

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

 

9)В обработчиках команд форм "ВПЕРЕД" и "НАЗАД"  пишем

 

 &НаКлиенте

Процедура Вперед(Команда)

СтрокаДокумента=КонтрлоьПеремещения();

НомерТекущегоДокумента=СтрокаДокумента[0].СистемныеПоляНомерПоПорядку;

Если
ВыборкаПоОбъект.Количество() > НомерТекущегоДокумента Тогда
Элементы.Список.ТекущаяСтрока=ВыборкаПоОбъект[НомерТекущегоДокумента].ССылка;
Иначе
Сообщить("Элемент не найден, или поиск окончен");
КонецЕсли;

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

&НаКлиенте
Процедура Назад(Команда)

СтрокаДокумента=КонтрлоьПеремещения();

НомерТекущегоДокумента=СтрокаДокумента[0].СистемныеПоляНомерПоПорядку;

Если
НомерТекущегоДокумента-2 >=0 Тогда
Элементы.Список.ТекущаяСтрока=ВыборкаПоОбъект[НомерТекущегоДокумента-2].ССылка;
Иначе
Сообщить("Элемент не найден, или поиск окончен");
КонецЕсли;



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

10) Пишем вспомогательные процедуры

 &НаКлиенте

Функция ФормированиеСтруктурыПоиска()

ПараметрыПоиска=Новый Структура;
ПараметрыПоиска.Вставить("Порядок",Строка(ЭтаФорма.Список.Порядок));
ПараметрыПоиска.Вставить("Ссылка",Элементы.Список.ТекущаяСтрока);
ПараметрыПоиска.Вставить("АктинаяЯчейка",АктинаяЯчейка);
ПараметрыПоиска.Вставить("СтрокаПоиска",Элементы.СтрокаПоиска.ТекстРедактирования);
ПараметрыПоиска.Вставить("Отображение",Строка(Элементы.Список.Отображение));
Возврат
ПараметрыПоиска;

КонецФункции
// ()

&НаСервереБезКонтекста
Функция ПоискПодобно(ПараметрыПоиска)

Порядок=ПараметрыПоиска.Порядок;
АктинаяЯчейка=ПараметрыПоиска.АктинаяЯчейка;
ССылка=ПараметрыПоиска.ССылка;
СтрокаПоиска=ПараметрыПоиска.СтрокаПоиска+"%";

СхемаКомпановкиДанныхР=Справочники.Номенклатура.ПолучитьМакет("Поиск");
ЯчекааПоиска="ТаблицаНоменклатуры."+АктинаяЯчейка;
ТекстЗапроса=СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос;
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&ПараметрУПР",Порядок);
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"&актинаяЯчйка",ЯчекааПоиска);
СхемаКомпановкиДанныхР.НаборыДанных.УпорядТаблица.Запрос=ТекстЗапроса;
КомпновщиеНастроекР=Новый КомпоновщикНастроекКомпоновкиДанных;
КомпновщиеНастроекР.ЗагрузитьНастройки(СхемаКомпановкиДанныхР.НастройкиПоУмолчанию);

НастройкиР=КомпновщиеНастроекР.Настройки;
НастройкиР.ПараметрыДанных.Элементы[0].Значение=СтрокаПоиска;
НастройкиР.ПараметрыДанных.Элементы[1].Значение=ССылка;
если
ПараметрыПоиска.Отображение<>"Список" тогда
// Натсройка отборов
НастройкиР.Отбор.Элементы[0].Использование=истина;
НастройкиР.Отбор.Элементы[0].ПравоеЗначение=ССылка.Родитель;

КонецЕсли;
КомпоновщикМакетаР=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиР=КомпоновщикМакетаР.Выполнить(СхемаКомпановкиДанныхР,НастройкиР, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

ПроцессорКомпоновкиДанныхР=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанныхР.Инициализировать(МакетКомпоновкиР);

ПроцессорВыводВКолецкцию=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ВыборкаПоОбъект = Новый ТаблицаЗначений;

ПроцессорВыводВКолецкцию.УстановитьОбъект(ВыборкаПоОбъект);
ПроцессорВыводВКолецкцию.Вывести(ПроцессорКомпоновкиДанныхР);


Возврат
ВыборкаПоОбъект;



КонецФункции
// ПоискПодобно()

&НаСервере
Процедура ПоискПодобноНаСервер(ПараметрыПоиска)
табл=ПоискПодобно(ПараметрыПоиска);
Если
ТипЗнч(табл)=ТИп("ТаблицаЗначений") тогда
ЗначениеВРеквизитФормы(табл,"ВыборкаПоОбъект");
ЭтаФорма.СтрокаПоиска=ПараметрыПоиска.СтрокаПоиска;
КонецЕсли;
КонецПроцедуры

См. также

Быстрый поиск дублей с четким/нечетким поиском по любому сочетанию реквизитов/реквизитов таб. частей с отбором и быстрой заменой значений в ЛЮБЫХ базах 8.1-8.3 (УТ 10.3, БП 2, ЗУП 2.5, КА 1.1, УТ 11, БП 3, УНФ 1.6/3.0, КА 2, ЗУП 3 и т.д.)

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

9600 руб.

14.05.2012    155117    324    252    

556

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

19200 руб.

15.05.2017    42471    10    24    

38

Поиск номенклатуры в интернете (Розница 2.3, Управление торговлей 11.4)

Розничная торговля WEB-интеграция Поиск данных Платформа 1С v8.3 Оперативный учет 1С:Розница 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

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

1999 руб.

15.10.2020    18383    22    63    

23

Кто такая Мантикора?

Поиск данных Платформа 1С v8.3 Россия Абонемент ($m)

Статья об опыте развертывания и интеграции с базой данных Manticore Search для быстрого полнотекстового поиска.

1 стартмани

30.11.2023    2999    andreysidor4uk    14    

45

PowerOffice

Поиск данных Корректировка данных Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

PowerOffice - обработка для поиска, просмотра и обработки данных для пользователей. Доступ к объектам на просмотр и редактирование данных определяется правами пользователя.

1 стартмани

05.06.2023    1902    23    PowerBoy    1    

15

Получение ссылки по бинарной строке PostgreSQL или MSSQL

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Получение ссылки в 1С по бинарной строке из PostgreSQL в виде строки формата bytea или из MSSQL в виде шестнадцатиричной строки. Кроме ссылочных объектов ссылки могут быть получены и для перечислений. Это может быть полезно при анализе логов журнала регистрации или СУБД.

1 стартмани

04.04.2023    2559    2    berserg    2    

12

Поиск документов с ошибками проведения, универсальный

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.08.2022    2971    21    KVIKS    3    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. sytkosa 119 21.08.12 11:10 Сейчас в теме
(0) На второй картинке ошибка в тексте
2. seermak 665 21.08.12 13:49 Сейчас в теме
&НаКлиенте
Процедура ПоискАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПоискАвтоПодбор_Сервер(ВРег(Текст));
КонецПроцедуры

&НаСервере
Процедура ПоискАвтоПодбор_Сервер(Знач СтрокаСравнения)
УдалитьОтборУСписокЗначений(СписокДанных.Отбор, Новый ПолеКомпоновкиДанных("Литера"));
ЗаполнитьСписокЗначений(СписокДанных.Отбор, Новый ПолеКомпоновкиДанных("СтрокаПодбора"), СтрокаСравнения, ВидСравненияКомпоновкиДанных.Содержит);
КонецПроцедуры


&НаСервере
Процедура ЗаполнитьСписокЗначений(ОтборСКД, Знач ЛевоеЗначение, Знач ПравоеЗначение, ВидСравнения = Неопределено)
ЭлементыОтбора = ОтборСКД.Элементы;
ЭлементОтбораДанных = Неопределено;
Для Каждого ЭлементОтбора Из ЭлементыОтбора Цикл
Если ЭлементОтбора.ЛевоеЗначение = ЛевоеЗначение Тогда
Если ЭлементОтбораДанных = Неопределено Тогда
ЭлементОтбораДанных = ЭлементОтбора;
Иначе
ЭлементОтбора.Использование = Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Если ЭлементОтбораДанных = Неопределено Тогда
ЭлементОтбораДанных = ЭлементыОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораДанных.ЛевоеЗначение = ЛевоеЗначение;
КонецЕсли;
ЭлементОтбораДанных.ВидСравнения = ВидСравнения;
ЭлементОтбораДанных.ПравоеЗначение = ПравоеЗначение;
ЭлементОтбораДанных.Использование = Истина;
КонецПроцедуры
&НаСервере
Процедура УдалитьОтборУСписокЗначений(ОтборСКД, ЛевоеЗначение)
ЭлементыОтбора = ОтборСКД.Элементы;
МассивОтборов = Новый Массив;
Для Каждого ЭлементОтбора Из ЭлементыОтбора Цикл
Если ЭлементОтбора.ЛевоеЗначение = ЛевоеЗначение Тогда
МассивОтборов.Добавить(ЭлементОтбора);
КонецЕсли;
КонецЦикла;

Для Каждого ЭлементОтбора Из МассивОтборов Цикл
ЭлементыОтбора.Удалить(ЭлементОтбора);
КонецЦикла;
КонецПроцедуры

на и не мучайся, вот еще в реквизитах поля поиска - обновление текста редактирования = не использовать
user881571; +1 Ответить
3. Rudakov_D 226 22.08.12 05:34 Сейчас в теме
(2) дополню в выходные :)
4. Stamper 43 22.08.12 10:50 Сейчас в теме
помню, пытались мы как-то внедрить веб-расширение для 1С 8.0
так вот там автоподбор вариантов выбора просто жутко тормозило. и это понятно, т.к. нужно было прокачивать дополнительную информацию.
как я понимаю, по причинам производительности и исключили эту "фичу" из управляемого (который потенциально будет веб-) интерфейса.
как с производительностью у этого решения?
отдельная благодарность будет автору за запись видеоролика какого-нибудь.
p.s. плюсанул
5. Rudakov_D 226 22.08.12 10:59 Сейчас в теме
(4)
1) У меня пока нет заказчиков мест тестирования этого алгоритма на реальных данных, подумаю разместить демо базу с УФ где нибудь и посмотрю как работает... однако когда время выделить и для этого пока не знаю...

2) Какой видеоролик хотите ? По написанию?

3) Думаю это все таки решение преимущественно для толстых клиентов, у меня уже есть заказчики которые хотят в одной колонке видеть разные реквизиты, а это можно реализовать только динамическим списком, и поиск хотят тоже иметь.
8. Stamper 43 22.08.12 11:46 Сейчас в теме
(5)ролик, в котором можно было бы оценить быстродействие. чтоб было ясно, похоже на работу в толстом клиенте, или нет
6. petrov_al 10 22.08.12 11:04 Сейчас в теме
Автор, все гораздо проще, не изобретай велосипед...смотри продвинутый курс гилева 1с8.2 а особенно события.
7. Rudakov_D 226 22.08.12 11:17 Сейчас в теме
(6) что конкретно, по вашему мнению, не правильно? (как-нибудь пересмотрю)
9. bulpi 215 22.08.12 13:16 Сейчас в теме
1)Поиск по первым символам в обычных формах работает все же не так.
2)Молодец, что хоть это сделал. Но нюхом чую, что должно быть проще.
3)Без обид : Не работай там , где нужно что-то объяснять - учитель, репетитор. Не твое это :)
10. SergDi 22.08.12 19:03 Сейчас в теме
давайте вставлю свои 5 копеек по поводу поиска по подстроке...

в модуле менеджера справочника номенклатуры пишешь код в процедуре ОбработкаПолученияДанныхВыбора(), например такой код:


Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Товары.Ссылка как Товар
|ИЗ
| Справочник.Номенклатура КАК Товары
|ГДЕ
| Товары.Наименование ПОДОБНО &Наименование
|ИЛИ
| Товары.Артикул = &Артикул
|
|";
Запрос.УстановитьПараметр("Наименование",
"%"+Параметры.СтрокаПоиска + "%");

Запрос.УстановитьПараметр("Артикул",Параметры.СтрокаПоиска);

Результат = Запрос.Выполнить();
ТаблицаРезультатов = Результат.Выгрузить();
МассивТоваров = ТаблицаРезультатов.ВыгрузитьКолонку("Товар");

ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора.ЗагрузитьЗначения(МассивТоваров);


СтандартнаяОбработка = Ложь;

КонецПроцедуры
Оставьте свое сообщение