Имя: Пароль:
1C
1С v8
Как отсортировать контекстный поиск
0 ZSSSP
 
13.03.17
15:55
Попробовал делать индексирование элемента не помогло. Попробовал индексирование с доп.упорядочиванием.http://s45.radikal.ru/i109/1703/1d/1b0c619a2123.png
1 polosov
 
13.03.17
15:58
Там по идее запросы: ВЫБРАТЬ ПЕРВЫЕ 50
как в УТ 11

А в этой конфе хз как.
2 ZSSSP
 
14.03.17
07:44
скажи где в ут11 находится данный запрос, а в своей конфигурации я постараюсь сам определиться.
3 RomaH
 
naïve
14.03.17
07:57
дарю:

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    УстановитьПривилегированныйРежим(Истина);
    
    СтандартнаяОбработка = Ложь;
    
    ДанныеВыбора = ПациентОкончаниеВводаТекстаНаСервере(Параметры);
    
КонецПроцедуры

Функция ПациентОкончаниеВводаТекстаНаСервере(Знач Параметры)
    
    ДанныеВыбора = Новый СписокЗначений;
    
    Подразделение = Неопределено;
    
    Параметры.Свойство("Подразделение",Подразделение);
    
    Текст = Параметры.СтрокаПоиска;
    
    
    ТекущийГод = Год(ТекущаяДата());
    ПозднееНеОбрабатываем = ТекущийГод - 5;
    
    Текст = СокрЛП(Текст);
    
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.IgnoreCase = Истина;
    RegExp.MultiLine = Ложь; // истина — текст многострочный, ложь — одна строка
    
    RegExp.Global = Истина;
    
    //Сначала обработаем временный номер
    Если Не ЗначениеЗаполнено(Подразделение) Тогда
        RegExp.pattern = "(\d+)";
        
        Результаты = RegExp.Execute(Текст);
        
        Если Результаты.Count() > 0 Тогда
            
            ВременныйНомер = Число(Результаты.Item(0).Value);
            
            СписокФизПоВременномуНомеру(ДанныеВыбора,ВременныйНомер);
            
            
        КонецЕсли;
    КонецЕсли;
    
    
    //Дальше поищем даты и прочее

    #Область ДатаРождения_И_ФИО
    
    RegExp.pattern = "(\d.*\d)";
    
    Результаты = RegExp.Execute(Текст);

    ЧастиДат = Новый Массив;
    
    Итерация = 0;
    
    День = 0;
    Месяц = 0;
    Год = 0;
    
    ДатаСтрокой = "";
    
    Если Результаты.Count() > 0 Тогда
        
        СтрокаСДатой = Результаты.Item(0).Value;
        
        RegExp.pattern = "\d+";
        
        Результаты = RegExp.Execute(СтрокаСДатой);
        
        Если Результаты.Count() > 0 Тогда
            
            Для Ш = 0 По Результаты.Count() - 1 Цикл
                
                ЧастьДаты = Результаты.Item(Ш).Value;
                
                ДатаСтрокой = ДатаСтрокой + ЧастьДаты;
                
                //ОбработатьЧастьДаты(ЧастьДаты,ЧастиДат,Итерация);
                    
            КонецЦикла;
            
        Иначе
            
            //ОбработатьЧастьДаты(СтрокаСДатой,ЧастиДат,Итерация);
            
        КонецЕсли;
        
    КонецЕсли;

    Если СтрДлина(ДатаСтрокой) = 2 Тогда
        
        Год = ПолучитьГодИзЧисла(Число(ДатаСтрокой),ПозднееНеОбрабатываем,ТекущийГод);
    
    ИначеЕсли СтрДлина(ДатаСтрокой) = 3 Тогда
        
        ГодСтрокой = Сред(ДатаСтрокой,2);
        Год = ПолучитьГодИзЧисла(Число(ГодСтрокой),ПозднееНеОбрабатываем,ТекущийГод);
        Месяц = Число(Лев(ДатаСтрокой,1));
        
    ИначеЕсли СтрДлина(ДатаСтрокой) = 4 Тогда //0255
        
        ГодСтрокой = Сред(ДатаСтрокой,3);
        Год = ПолучитьГодИзЧисла(Число(ГодСтрокой),ПозднееНеОбрабатываем,ТекущийГод);
        Месяц = Число(Лев(ДатаСтрокой,2));
        
        Если Месяц > 12 Тогда
            Месяц = 0;
        КонецЕсли;
        
    ИначеЕсли СтрДлина(ДатаСтрокой) = 6 Тогда //020266
        
        ГодСтрокой = Сред(ДатаСтрокой,5);
        Год = ПолучитьГодИзЧисла(Число(ГодСтрокой),ПозднееНеОбрабатываем,ТекущийГод);
        Месяц = Число(Сред(ДатаСтрокой,3,2));
        Если Месяц > 12 Тогда
            Месяц = 0;
        КонецЕсли;
        День = Число(Сред(ДатаСтрокой,1,2));
        Если День > 31 Тогда
            День = 0;
        КонецЕсли;
        
    ИначеЕсли СтрДлина(ДатаСтрокой) = 8 Тогда //02021966
        
        ГодСтрокой = Сред(ДатаСтрокой,5);
        Год = ПолучитьГодИзЧисла(Число(ГодСтрокой),ПозднееНеОбрабатываем,ТекущийГод);
        Месяц = Число(Сред(ДатаСтрокой,3,2));
        Если Месяц > 12 Тогда
            Месяц = 0;
        КонецЕсли;
        День = Число(Сред(ДатаСтрокой,1,2));
        Если День > 31 Тогда
            День = 0;
        КонецЕсли;
        
    КонецЕсли;
    
    Точность = "ГОД";
    
    Если Месяц = 0 И Год > 0 Тогда
        Точность = "ГОД";
        ДатаРождения = Дата(Год,1,1);
    ИначеЕсли День = 0 И Месяц > 0 И Год > 0 Тогда
        Точность = "МЕСЯЦ";
        ДатаРождения = Дата(Год,Месяц,1);
    ИначеЕсли День > 0 И Месяц > 0 И Год > 0 Тогда
        Точность = "ДЕНЬ";
        ДатаРождения = Дата(Год,Месяц,День);
    КонецЕсли;
    
    RegExp.pattern = "[a-zA-Zа-яА-Я]+";
    Результаты = RegExp.Execute(Текст);
    РезКол = Результаты.Count() - 1;
    
    ФИО = "";
    Для Инд = 0 По РезКол Цикл
        ФИО = ФИО + " " + Результаты.Item(Инд).Value;
    КонецЦикла;
    
    МассивФИО = СтрРазделить(ФИО," ",Ложь);
    #КонецОбласти
    
    СписокФизЛицПоПараметрам(ДанныеВыбора,ДатаРождения, Точность, МассивФИО, Подразделение,Параметры);

    Возврат ДанныеВыбора;
    
КонецФункции

Процедура СписокФизПоВременномуНомеру(ДанныеВыбора,ВременныйНомер)
    
    Если ВременныйНомер = 0 Тогда
        Возврат;    
    КонецЕсли;
    
    Запрос = Новый Запрос;
    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ВременныйНомерПациента.ДокументРегистрации.Пациент КАК Ссылка,
    |    ВременныйНомерПациента.ДокументРегистрации.Пациент.Наименование КАК Пациент,
    |    ВременныйНомерПациента.ДокументРегистрации.Пациент.ДатаРождения КАК ДатаРождения
    |ИЗ
    |    РегистрСведений.ВременныйНомерПациента КАК ВременныйНомерПациента
    |ГДЕ
    |    ВременныйНомерПациента.НомерПациента = &НомерПациента
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    ВременныйНомерПациентаДляПрофосмотра.НаправлениеНаПрофосмотр.Пациент,
    |    ВременныйНомерПациентаДляПрофосмотра.НаправлениеНаПрофосмотр.Пациент.Наименование,
    |    ВременныйНомерПациентаДляПрофосмотра.НаправлениеНаПрофосмотр.Пациент.ДатаРождения
    |ИЗ
    |    РегистрСведений.ВременныйНомерПациентаДляПрофосмотра КАК ВременныйНомерПациентаДляПрофосмотра
    |ГДЕ
    |    ВременныйНомерПациентаДляПрофосмотра.НомерПациента = &НомерПациента";
    
    Запрос.УстановитьПараметр("НомерПациента",ВременныйНомер);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Пациент + " " + Формат(Выборка.ДатаРождения,"ДФ=dd.MM.yy"));
    КонецЦикла;
    
КонецПроцедуры

Процедура СписокФизЛицПоПараметрам(ДанныеВыбора,ДатаРождения, Точность, МассивФИО, Знач Подразделение = Неопределено,Параметры)
    
    Если МассивФИО.Количество() = 0 И Не ЗначениеЗаполнено(ДатаРождения) Тогда
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    
    Фамилия = "";
    Имя = "";
    Отчество = "";
    
    Для Ш = 0 По МассивФИО.ВГраница() Цикл
        Фамилия = МассивФИО[Ш];
        Прервать;
    КонецЦикла;
    
    Для Ш = 1 По МассивФИО.ВГраница() Цикл
        Имя = МассивФИО[Ш];
        Прервать;
    КонецЦикла;
    
    Для Ш = 2 По МассивФИО.ВГраница() Цикл
        Отчество = СокрЛП(Отчество + " " + МассивФИО[Ш]);
    КонецЦикла;
    
    //ФИО = Фамилия + " " + Имя + " " + Отчество;
    //
    //МассивФИО = СтрРазделить(ФИО," ",Ложь);
    //
    //МассивПерестановок = ОбщегоНазначенияПовтИсп.ПолучитьИндексыПерестановкиПоДлинеМассива(МассивФИО.Количество());
    
    ЭтоСтационар = Ложь;
    МассивСтационарыхПациентов = Неопределено;
    
    Если ЗначениеЗаполнено(Подразделение) Тогда
        
        Запрос.Текст =
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    ЗанятыеКойкиСтационара2ОстаткиИОбороты.Пациент
        |ИЗ
        |    РегистрНакопления.ЗанятыеКойкиСтационара2.ОстаткиИОбороты(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, -7), &НачалоПериода, , , Подразделение = &Подразделение) КАК ЗанятыеКойкиСтационара2ОстаткиИОбороты";
        
        Запрос.УстановитьПараметр("НачалоПериода",КонецДня(ТекущаяДата()));
        Запрос.УстановитьПараметр("Подразделение",Подразделение);
        
        Результат = Запрос.Выполнить();
        
        Если Не Результат.Пустой() Тогда
            
            МассивСтационарыхПациентов = Результат.Выгрузить().ВыгрузитьКолонку("Пациент");
            ЭтоСтационар = Истина;
        КонецЕсли;
        
    КонецЕсли;
        
    Запрос.Текст =
    
    "ВЫБРАТЬ ПЕРВЫЕ 16
    |    ФизическиеЛица.ФизЛицо КАК Ссылка,
    |    ФизическиеЛица.Фамилия КАК Фамилия,
    |    ФизическиеЛица.Имя КАК Имя,
    |    ФизическиеЛица.Отчество КАК Отчество,
    |    ФизическиеЛица.ФизЛицо.ДатаРождения КАК ДатаРождения
    |ИЗ
    |    РегистрСведений.ФИОФизЛиц КАК ФизическиеЛица
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВесовыеКоэфициентыПациентов КАК ВесовыеКоэфициентыПациентов
    |        ПО ФизическиеЛица.ФизЛицо = ВесовыеКоэфициентыПациентов.Пациент
    |ГДЕ
    |    (НЕ &ЭтоСтационар
    |            ИЛИ ФизическиеЛица.ФизЛицо В (&МассивСтационарыхПациентов))
    |    И (&ДатаРождения = ДАТАВРЕМЯ(1, 1, 1)
    |            ИЛИ ФизическиеЛица.ФизЛицо.ДатаРождения МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаРождения, МЕСЯЦ) И КОНЕЦПЕРИОДА(&ДатаРождения, МЕСЯЦ))
    |    И (&Фамилия = ""%""
    |            ИЛИ ФизическиеЛица.Фамилия ПОДОБНО &Фамилия)
    |    И (&Имя = ""%""
    |            ИЛИ ФизическиеЛица.Имя ПОДОБНО &Имя)
    |    И (&Отчество = ""%""
    |            ИЛИ ФизическиеЛица.Отчество ПОДОБНО &Отчество)
    |    И НЕ ФизическиеЛица.ФизЛицо.ПометкаУдаления
    |    И НЕ ФизическиеЛица.ФизЛицо.Предопределенный
    |
    |УПОРЯДОЧИТЬ ПО
    |    Фамилия,
    |    Имя,
    |    Отчество,
    |    ВесовыеКоэфициентыПациентов.ВесовойКоэффициент УБЫВ";
    
    Запрос.УстановитьПараметр("ДатаРождения", ?(ЗначениеЗаполнено(ДатаРождения),ДатаРождения,'00010101'));
    
    Запрос.УстановитьПараметр("ЭтоСтационар", ЭтоСтационар);
    Запрос.УстановитьПараметр("МассивСтационарыхПациентов", МассивСтационарыхПациентов);
    Запрос.УстановитьПараметр("Фамилия", Фамилия + "%");
    Запрос.УстановитьПараметр("Фамилия", Фамилия + "%");
    Запрос.УстановитьПараметр("Имя", Имя + "%");
    Запрос.УстановитьПараметр("Отчество", Отчество + "%");
    
    Запрос.Текст = СтрЗаменить(Запрос.Текст,"МЕСЯЦ",Точность);
    
    Результат = Запрос.Выполнить().Выбрать();
    
    Пока Результат.Следующий() Цикл
        ДанныеВыбора.Добавить(Результат.Ссылка, Результат.Фамилия + " " + Результат.Имя + " " + Результат.Отчество + " " + Формат(Результат.ДатаРождения,"ДФ=dd.MM.yy"));
    КонецЦикла;
    
    Если Результат.Количество() > 15 Тогда
        ДанныеВыбора.Удалить(15);
        ДанныеВыбора.Добавить("", "---------------Это не все----------------");
    ИначеЕсли Параметры.Отбор.Свойство("Предопределенный") Тогда
        
    Иначе
        ДанныеВыбора.Добавить("", "-----------------------------------------");
        ДанныеВыбора.Добавить(Справочники.Пациенты.НовыйПациент,);
    КонецЕсли;
    
КонецПроцедуры
4 RomaH
 
naïve
14.03.17
08:08
и это не "контекстный поиск", а "быстрый поиск" или "ввод по строке в поле ввода"
ну по крайней мере так его 1С называет
5 ZSSSP
 
14.03.17
09:30
Тема закрыта всем спасибо.Решил, нашел запрос где обрабатывается данный поиск сделал сортировку в нем.