1с как добавить строку поиска на форму
Пользователь кликают ячейку в колонку которая его интересует, когда решил что пора искать нажимает CTRL+S, набирает первые символы искомого объекта и далее нажимает вперед или назад. Поиск работает аналогично как обычных формах.
Краткое описание алгоритма:
Осуществляем выборку всех объектов, по правилам отбора которые настроены в динамическом списке и упорядочиваем наш результат выборки. Для того что бы результат запроса был пронумерован используем СКД с выводом в таблицу значений. Для того чтобы таблицу значений хранить на клиенте создаем реквизит на форме с типом таблица значений. Полученную таблицу из СКД, выгружаем в реквизит формы. И если пользователь нажал вперед то в динамическом списке делаем текущую строку, ссылку на следующий объект, после объекта активной строки из нашей таблицы значений в реквизите формы. И если пользователь нажал назад то в динамическом списке делаем текущую строку, ссылку на предыдущий объект, после объекта активной строки из нашей таблицы значений в реквизите формы.
Далее идет краткое описание пунктов на которые нужно обратить внимание когда вы будите писать аналогичный механизм на реальные управляемые формы. Эти пункты нельзя назвать инструкцией к написанию, вашего поиска, это скорее пункты по которым можно внести четкую ясность как работает код в опубликованной конфигурации на что можно ориентироваться при написании уже ваших алгоритмов.
1) Создаем форму списка
2) У формы списка создаем два реквизита
а) СтрокаПоиска с типом Строка
б) ВыборкаПоОбъект с типом таблица значений
3)На форме списка размещаем реквизит формы "СтрокаПоиска" в поле ввода и назначаем горячую клавишу "Ctrl+S".
5)В объекте, в нашем случае в номенклатуре создаем СКД с помощью которой будет формироваться список объектов по которым будет ходить курсор поиска. В СКД пишем запрос так что бы потом представлялось возможным открыть его в конструкторе запроса, а в коде заменить определенные подстроки и получить запрос к исполнению. А именно в время поиска важна Сортировка в списке объектов и то в какая ячейка сейчас выделена (по ней искать и нужно).
К примеру запрос
Номенклатура. Ссылка КАК Ссылка ,
Номенклатура.Родитель ,
Номенклатура.ОсновнойПоставщик.Наименование КАК ОсновнойПоставщик ,
Номенклатура.Наименование
ПОМЕСТИТЬ ТаблицаНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаНоменклатуры.Ссылка ,
ТаблицаНоменклатуры.Родитель ,
ТаблицаНоменклатуры.ОсновнойПоставщик ,
ТаблицаНоменклатуры.Наименование
ИЗ
ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
ГДЕ
( &актинаяЯчйка ПОДОБНО &СтрокаПоиска
ИЛИ ТаблицаНоменклатуры. Ссылка = &Ссылка )
УПОРЯДОЧИТЬ ПО
&ПараметрУПР
В этом запросе потом меняем
ЯчекааПоиска = "ТаблицаНоменклатуры." + АктинаяЯчейка ;
ТекстЗапроса = СхемаКомпановкиДанныхР . НаборыДанных . УпорядТаблица . Запрос ;
ТекстЗапроса = СтрЗаменить ( ТекстЗапроса , "&ПараметрУПР" , Порядок );
ТекстЗапроса = СтрЗаменить ( ТекстЗапроса , "&актинаяЯчйка" , ЯчекааПоиска );
СхемаКомпановкиДанныхР . НаборыДанных . УпорядТаблица . Запрос = ТекстЗапроса ;
Обращаю внимание что все колонки по которым будет осуществляться поиск, выбираем данные во временную таблицу и преобразуем их в строки для возможности дальнейшего сравнения.
5) программно переносим отборы настроенные в динамическом списке в нашу СКД поиска (этого пока не реализовано в примере, если будет актуально хотя бы нескольким пользователям то можно и доработать).
6) Так же в настройках СКД предусмотрительно добавляем возможные отборы, для иерархического справочника это будет Родитель элемента.
В случае если поиск в иерархическом справочнике, и отображение не списком то будет заполнять отбор
Если ПараметрыПоиска . Отображение <> "Список" тогда
// Натсройка отборов
НастройкиР . Отбор . Элементы [ 0 ]. Использование =истина;
НастройкиР . Отбор . Элементы [ 0 ]. ПравоеЗначение = ССылка . Родитель ;
7) У элемента формы СПИСОК создаем событие "СписокПриАктивизацииЯчейки" в нем прописываем заполнение переменой "АктинаяЯчейка" объявленной в модуле формы:
&НаКлиенте
Перем АктинаяЯчейка ;
&НаКлиенте
Процедура СписокПриАктивизацииЯчейки ( Элемент )
АктинаяЯчейка = Элемент . ТекущийЭлемент . Имя ;
КонецПроцедуры
8) У поля ввода "СтрокаПоиска" (пункт 3), создаем обработчик события "АвтоПодбор", в нем прописываем:
Процедура СтрокаПоискаАвтоПодбор ( Элемент , Текст , ДанныеВыбора , Ожидание , СтандартнаяОбработка )
ПараметрыПоиска = ФормированиеСтруктурыПоиска ();
ПоискПодобноНаСервер ( ПараметрыПоиска );
9)В обработчиках команд форм "ВПЕРЕД" и "НАЗАД" пишем
НомерТекущегоДокумента = СтрокаДокумента [ 0 ]. СистемныеПоляНомерПоПорядку ;
Если ВыборкаПоОбъект . Количество () > НомерТекущегоДокумента Тогда
Элементы . Список . ТекущаяСтрока = ВыборкаПоОбъект [ НомерТекущегоДокумента ]. ССылка ;
Иначе
Сообщить ( "Элемент не найден, или поиск окончен" );
КонецЕсли;
НомерТекущегоДокумента = СтрокаДокумента [ 0 ]. СистемныеПоляНомерПоПорядку ;
Если НомерТекущегоДокумента - 2 >= 0 Тогда
Элементы . Список . ТекущаяСтрока = ВыборкаПоОбъект [ НомерТекущегоДокумента - 2 ]. ССылка ;
Иначе
Сообщить ( "Элемент не найден, или поиск окончен" );
КонецЕсли;
10) Пишем вспомогательные процедуры
ПараметрыПоиска =Новый Структура ;
ПараметрыПоиска . Вставить ( "Порядок" , Строка ( ЭтаФорма . Список . Порядок ));
ПараметрыПоиска . Вставить ( "Ссылка" , Элементы . Список . ТекущаяСтрока );
ПараметрыПоиска . Вставить ( "АктинаяЯчейка" , АктинаяЯчейка );
ПараметрыПоиска . Вставить ( "СтрокаПоиска" , Элементы . СтрокаПоиска . ТекстРедактирования );
ПараметрыПоиска . Вставить ( "Отображение" , Строка ( Элементы . Список . Отображение ));
Возврат ПараметрыПоиска ;
&НаСервереБезКонтекста
Функция ПоискПодобно ( ПараметрыПоиска )
Порядок = ПараметрыПоиска . Порядок ;
АктинаяЯчейка = ПараметрыПоиска . АктинаяЯчейка ;
ССылка = ПараметрыПоиска . ССылка ;
СтрокаПоиска = ПараметрыПоиска . СтрокаПоиска + "%" ;
СхемаКомпановкиДанныхР = Справочники . Номенклатура . ПолучитьМакет ( "Поиск" );
ЯчекааПоиска = "ТаблицаНоменклатуры." + АктинаяЯчейка ;
ТекстЗапроса = СхемаКомпановкиДанныхР . НаборыДанных . УпорядТаблица . Запрос ;
ТекстЗапроса = СтрЗаменить ( ТекстЗапроса , "&ПараметрУПР" , Порядок );
ТекстЗапроса = СтрЗаменить ( ТекстЗапроса , "&актинаяЯчйка" , ЯчекааПоиска );
СхемаКомпановкиДанныхР . НаборыДанных . УпорядТаблица . Запрос = ТекстЗапроса ;
КомпновщиеНастроекР =Новый КомпоновщикНастроекКомпоновкиДанных ;
КомпновщиеНастроекР . ЗагрузитьНастройки ( СхемаКомпановкиДанныхР . НастройкиПоУмолчанию );
НастройкиР = КомпновщиеНастроекР . Настройки ;
НастройкиР . ПараметрыДанных . Элементы [ 0 ]. Значение = СтрокаПоиска ;
НастройкиР . ПараметрыДанных . Элементы [ 1 ]. Значение = ССылка ;
если ПараметрыПоиска . Отображение <> "Список" тогда
// Натсройка отборов
НастройкиР . Отбор . Элементы [ 0 ]. Использование =истина;
НастройкиР . Отбор . Элементы [ 0 ]. ПравоеЗначение = ССылка . Родитель ;
КонецЕсли;
КомпоновщикМакетаР =Новый КомпоновщикМакетаКомпоновкиДанных ;
МакетКомпоновкиР = КомпоновщикМакетаР . Выполнить ( СхемаКомпановкиДанныхР , НастройкиР , , , Тип ( "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений" ));
ПроцессорКомпоновкиДанныхР =Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновкиДанныхР . Инициализировать ( МакетКомпоновкиР );
ПроцессорВыводВКолецкцию =Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений ;
ВыборкаПоОбъект = Новый ТаблицаЗначений ;
ПроцессорВыводВКолецкцию . УстановитьОбъект ( ВыборкаПоОбъект );
ПроцессорВыводВКолецкцию . Вывести ( ПроцессорКомпоновкиДанныхР );
&НаСервере
Процедура ПоискПодобноНаСервер ( ПараметрыПоиска )
табл = ПоискПодобно ( ПараметрыПоиска );
Если ТипЗнч ( табл )= ТИп ( "ТаблицаЗначений" ) тогда
ЗначениеВРеквизитФормы ( табл , "ВыборкаПоОбъект" );
ЭтаФорма . СтрокаПоиска = ПараметрыПоиска . СтрокаПоиска ;
КонецЕсли;
КонецПроцедуры
Полнотекстовый поиск - позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов (например, определенных видов документов или справочников). Сами критерии поиска могут варьироваться в довольно широком диапазоне. То есть найти нужные данные можно, даже не помня точно, где они хранятся в конфигурации и как именно записаны.
Полнотекстовый поиск предоставляет следующие возможности:
- Есть поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ 7.79-2000). Пример: "русская фраза" = "russkaya fraza".
- Есть поддержка замещения (написание части символов в русских словах одноклавишными латинскими символами). Пример: "руссrfz фраpf" (окончания каждого слова набраны латиницей, допустим, в результате ошибки оператора).
- Есть возможность нечеткого поиска (буквы в найденных словах могут отличаться) с указанием порога нечеткости. Пример: указав в строке поиска слово "привет" и нечеткость 17 %, найдем все аналогичные слова с ошибками и без: "привет", "превет", "привед".
- Есть возможность указать область выполнения поиска по выбранным объектам метаданных.
- Полнотекстовое индексирование названий стандартных полей ("Код", "Наименование" и т. д.) производится на всех языках конфигурации.
- Поиск выполняется с учетом синонимов русского, английского и украинского языков.
- Морфологический словарь русского языка содержит ряд специфических слов, относящихся к областям деятельности, автоматизируемым с помощью системы программ "1С:Предприятие".
- Стандартно в состав поставляемых словарей включены словарные базы и словари тезауруса и синонимов русского, украинского и английского языков, которые предоставлены компанией "Информатик".
- Поиск можно осуществлять с использованием подстановочных символов ("*"), а также с указанием поисковых операторов ("И", "ИЛИ", "НЕ", "РЯДОМ") и спецсимволов.
Полнотекстовый поиск можно осуществлять в любой конфигурации на платформе 1С:Предприятие 8
Для того чтобы открыть окно управления полнотекстовым поиском необходимо выполнить следующее:
Обычное приложение - пункт меню Операции - Управление полнотекстовым поиском.
Управляемое приложение - пункт меню Главное меню - Все функции - Стандартные - Управление полнотекстовым поиском.
- Обновить индекс – Создание индекса/Обновление индекса;
- Очистить индекс – обнуление индекса(рекомендуется после обновления всех данных);
- пункт Разрешить слияние индексов – отвечает за слияние основного и дополнительного индекса.
Полнотекстовый поиск осуществляется при помощи полнотекстового индекса. При отсутствии индекса полнотекстовый поиск как таковой не возможен. Для того чтобы поиск имел результат, все необходимые данные должны быть включены в полнотекстовый индекс. Если пользователем введены в базу новые данные, их следует включить в рассматриваемый индекс, иначе они не будут участвовать в поиске. Чтобы этого избежать, необходимо обновлять полнотекстовый индекс. При обновлении система анализирует только определенные типы данных: Строка, Данные ссылочного типа (ссылки на документы, справочники),Число, Дата, ХранилищеЗначения. Если пользователь не имеет прав доступа к определенной информации, то он не сможет увидеть ее в результатах поиска. Следует также помнить и о том, что в свойствах объектов, по которым будет происходить поиск должно быть установлено значение Полнотекстовый Поиск – Использовать, которое задано по умолчанию.
Как вы можете заметить свойство Использовать установлено для всего справочника Контрагенты, но сделать это можно и для каждого его реквизита соответствующего типа.
Рассмотрим более подробно полнотекстовый индекс, который состоит из двух частей (индексов): основного индекса и дополнительного. Высокая скорость поиска данных обеспечивается за счет основного индекса, но обновление его происходит относительно медленно, в зависимости от объема данных. Дополнительный индекс ему противоположен. Данные добавляются в него намного быстрее, но поиск осуществляется медленнее. Система осуществляет поиск одновременно в обоих индексах. Большая часть данных находится в основном индексе, а данные добавляемые в систему попадают в дополнительный индекс. Пока объем данных в дополнительном индексе небольшой, поиск по нему происходит относительно быстро. В тот момент, когда нагрузка на систему невелика, происходит операция слияния индексов, в результате чего дополнительный индекс очищается, а все данные помещаются в основной индекс. Слияние индексов предпочтительнее выполнять в тот момент времени, когда нагрузка на систему минимальна. С этой целью можно создавать регламентированные задания и задания по расписанию.
Специальные операторы, допустимые при задании поискового выражения
Механизм полнотекстового поиска допускает написание части символов русского слова одноклавишными латинскими символами. Результат поиска при этом не измениться.
Два оператора РЯДОМ
- упрощенный. На расстоянии 8 слов друг от друга
- РЯДОМ/[+/-]n – поиск данных в одном реквизите на расстоянии n-1 слов между ними.
Знак указывает в каком направлении от первого слова будет поиск второго. (+ - после, - до)
Групповой символ «*» может использоваться только в качестве замены конца слова
Программными средствами и средствами 1с: программирование.
Оператор синонимов «!». Позволяет найти слово и его синонимы
Как программно обновить индекс полнотекстового поиска?
Пример полнотекстового поиска данных
Определение переменной СписокПоиска
Кроме этого в процедуре обработки события ПриОткрыии формы определим, что эта переменная будет содержать список полнотекстового поиска, с помощью которого мы и будем осуществлять поиск в данных
Теперь для события нажатия на кнопку Найти напишем код, который позволит нам выполнять поиск в соответствии с тем выражением, которое задано в поле ПоисковоеВыражение
Создадим в модуле формы процедуру с таким именем и напишем в ней код,
В заключение передаем управление в процедуру ДоступностьКнопок() для того, чтобы сделать доступными или, наоборот, запретить доступ к кнопкам Предыдущая порция и Следующая порция (в зависимости от того, какая порция полученных результатов отображена). Текст этой процедуры представлен в Коде
Теперь необходимо создать обработчики событий нажатия на кнопки ПредыдущаяПорция() и СледующаяПорция().
Заключительным «штрихом» будет создание обработчика события onclick поля HTML-документа, расположенного в форме. Дело в том, что результат полнотекстового поиска, представленный в виде HTML-текста, содержит гиперссылки на номера элементов списка поиска. И нам хотелось бы, чтобы при переходе пользователя на эту ссылку система открывала бы форму того объекта, который содержится в этом элементе списка. Для этого мы будем перехватывать событие onclick HTML-документа, содержащегося в поле HTML-документа, получать номер элемента списка из гиперссылки и открывать форму соответствующего объекта. Текст обработчика события onclick поля HTML-документа представлен в коде
Сразу оговорюсь, пример для списка справочника Контрагенты, но подобное я использую очень часто.
И так: Менеджерам хочется открыть список контрагентов, и быстро найти контрагента по любым данным которые они помнят!
Реализованно следующим образом:
1. На форму в Командную панель Действия формы добавленно 2 Кнопки
а) Найтиконтр (с картинкой поиск, Процедура НайтиКонтр(Кнопка)) будет использоваться для запроса данных у пользователя для отбора
б) Инф (с картинкой бинокль) будет отображать параметр текущего запроса
в) В свойствах табличного поля добавим Событие При Активизации Колонки - Процедура ИзмНазваниеКнопки(Элемент)
2. В модуль добавим код:
Код 1C v 8.х
В результате перемещаясь по колонкам списка, меняется Поиск по. (Названию колонки)
Для примера нужно быстро получить список Контрагентов у которых телефон содержит 783
Результат:
Автор: Евгений Мигачев
Похожие FAQ
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 42Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 20
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш Google maps, поиск оптимального маршрута 5
В данном посте хочу коснуться основных аспектов построения оптимального маршрута с использованием API Google maps. Исходные данные для построения маршрута: * Географические координаты объектов, которые хранятся в базе; * Координаты начальной и коне Microsoft SQL Server Native Client Добавление значения в столбец "datetime" привело к переполнению 1
При формировании отчета на СКД получили ошибку: Microsoft SQL Server Native Client 11.0: Добавление значения в столбец "datetime" привело к переполнению Подробнее текст такой: . по причине: Ошибка компоновки данных по причине: Ошибка получени База для Разработки или Рабочая? Как быстро определить? 3
Когда-то я работал консультантом SAP . В SAPe есть настройка изменения цвета главного окна программы и у нас было негласное правило: Рабочая программа - Красный фон , Тестовая - Зеленый , Разработка - Синий . Работая в 1С, всегда открыто по 5-6 Посмотреть все результаты поиска похожих
Еще в этой же категории
Как в форме списка реализовать сортировку по своему реквизиту? 10Если реквизит примитивного типа, то достаточно установить для свойства реквизита «Индексировать» значение «Индексировать» или «Индексировать с доп. упорядочиванием» (не доступно для реквизитов типа ХранилищеЗначения). Если же реквизит ссылочного типа Сортировка списка по произвольной колонке? 7
В процедуру ПриОткрытии или в конец модуля добавить: ЭлементыФормы.РегистрСведенийСписок.НастройкаПорядка.НомерСоглашения.Доступность=Истина; Где НомерСоглашения - Колонка в списке регистра сведений по которой нужно сортировать! Далее щелкнув Оформление строки в ПриПолученииДанных или ПриВыводеСтроки 6
Событие ПриПолученииДанных использется для оформления ячеек строк данных, отображаемых табличным полем. Обработчик данного события вызывается табличным полем в тех же случаях, что и обработчик ПриВыводеСтроки , т.е. при обновлении данных, отображ Табличное поле
Как получить строки табличного поля, отобранные отбором? 4
ОтборСтрок = ТабличнаяЧастьИсточник.ОтборСтрок ; ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличнаяЧастьИсточник); // Добавляются необходимые отборы, такие же как в отбор Отбор по списку значений 3
СозданныйСписок = Новый СписокЗначений; СозданныйСписок.Добавить(Перечисления.СтатусЗаявки.Выполнено); СозданныйСписок.Добавить(Перечисления.СтатусЗаявки.ЗакрытиеЗаявки); СозданныйСписок.Добавить(Перечисления.СтатусЗаявки.ОтклоненаРукОтдЗакупок); Посмотреть все в категории Список Справочника, Документов, Регистров
Ключевые слова и Изображения
Слова упорядочены по частоте использования в тексте
Изображения
Читайте также: