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

19.03.15

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Поиска по первым символам база + пояснения
.rar 393,48Kb
79
79 Скачать (1 SM) Купить за 1 850 руб.

                Пользователь кликают ячейку в колонку которая его интересует,  когда решил что пора искать нажимает 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].ПравоеЗначение=ССылка.Родитель;

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

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

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

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


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



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

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

См. также

Поиск данных Внешние источники данных Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если вам нужно автоматически генерировать представления (view) к вашей базе данных 1С (есть две версии - для СУБД MS SQL Server и для PostgreSQL) по структуре метаданных 1С, то вам необходима данная обработка. Наш "Генератор View", другими словами - это коннектор к данным 1С для Power BI - незаменимый помощник для бизнес-аналитиков, работающих с базами 1С из Yandex Datalens/Power BI и т.д. Работает для обычных и управляемых форм под 1С 8.3

230000 руб.

31.07.2020    13500    13    48    

25

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

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

10800 руб.

14.05.2012    158455    338    253    

570

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

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

1999 руб.

15.10.2020    18882    23    63    

24

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

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

5 стартмани

25.09.2024    1733    0    Артано    14    

17

Поиск данных Программист Платформа 1С v8.3 Россия Бесплатно (free)

В этой статье я хочу рассмотреть еще один кейс применения Clickhouse в связке с 1С - оптимизацию поиска в справочнике по ключевым словам. Здесь не будет готового решения, но будут описаны важные моменты, которые позволят легко применить данный кейс в реальности.

18.08.2024    1527    1cnik2    23    

14

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

Отображение и просмотр реквизитов справочника или документа - с бесконечным открытием подуровней.

2 стартмани

14.06.2024    3229    7    RustIG    26    

22

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

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

1 стартмани

30.11.2023    4287    andreysidor4uk    18    

52

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

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

1 стартмани

05.06.2023    2263    25    PowerBoy    1    

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

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


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

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

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

на и не мучайся, вот еще в реквизитах поля поиска - обновление текста редактирования = не использовать
user881571; +1 Ответить
3. Rudakov_D 230 22.08.12 05:34 Сейчас в теме
(2) дополню в выходные :)
4. Stamper 43 22.08.12 10:50 Сейчас в теме
помню, пытались мы как-то внедрить веб-расширение для 1С 8.0
так вот там автоподбор вариантов выбора просто жутко тормозило. и это понятно, т.к. нужно было прокачивать дополнительную информацию.
как я понимаю, по причинам производительности и исключили эту "фичу" из управляемого (который потенциально будет веб-) интерфейса.
как с производительностью у этого решения?
отдельная благодарность будет автору за запись видеоролика какого-нибудь.
p.s. плюсанул
5. Rudakov_D 230 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 230 22.08.12 11:17 Сейчас в теме
(6) что конкретно, по вашему мнению, не правильно? (как-нибудь пересмотрю)
9. bulpi 217 22.08.12 13:16 Сейчас в теме
1)Поиск по первым символам в обычных формах работает все же не так.
2)Молодец, что хоть это сделал. Но нюхом чую, что должно быть проще.
3)Без обид : Не работай там , где нужно что-то объяснять - учитель, репетитор. Не твое это :)
10. SergDi 22.08.12 19:03 Сейчас в теме
давайте вставлю свои 5 копеек по поводу поиска по подстроке...

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


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

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

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

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


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

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