Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

УФ. Ввод по строке - количество строк результата

УФ. Ввод по строке - количество строк результата
Я
   fisher
 
18.01.21 - 18:11
При вводе по строке в поле ввода справочника выдает 10 строк подходящих результатов.
Как можно увеличить количество строк? Желательно для конкретного поля ввода.
   Ёпрст
 
1 - 18.01.21 - 18:41
а не 50  разве ?..
   acht
 
2 - 18.01.21 - 18:42
(0) Обработать событие АвтоПодбор поля ввода самостоятельно?
   Ёпрст
 
3 - 18.01.21 - 18:42
Ну.. разве что переопределять поведение и подсовывать сколько надо через ОбработкаПолученияДанныхВыбора какого нить, на нимфостарте были статьи на сей счет
   acht
 
4 - 18.01.21 - 18:46
(3) ОбработкаПолученияДанныхВыбора сразу для всего справочника/ПВХ/итп. Для отдельного поля ввода надо перекрывать события отдельного поля ввода. И возможно там ОкончаниеВводаТекста какое-нибудь еще.
   fisher
 
5 - 18.01.21 - 18:59
(2) О! Т.е. если вернуть больше данных выбора, то их попытается все показать, с полосой прокрутки и т.п? Спасибо. Меня что-то клемануло, что это ограничение платформы или типа того.
   fisher
 
6 - 19.01.21 - 13:06
(3) Переопределил ОбработкаПолученияДанныхВыбора(), сделал список на 20 элементов.
С какого-то перепугу платформа к ним добавляет еще несколько (закономерности в количестве не установил) со стандартной подсветкой поиска.
Когда она это делает? Как этого избежать? Ничего не понимаю.
   Ёпрст
 
7 - 19.01.21 - 13:25
(6) а  СтандартнаяОбработка = Ложь; ?
   fisher
 
8 - 19.01.21 - 13:25
Что любопытно - если тупо пустой список выбора формировать, то пустой и остается. Если хоть один элемент в него поместить - отсебятины накидывает.
   fisher
 
9 - 19.01.21 - 13:26
(7) Да.
   Ёпрст
 
10 - 19.01.21 - 13:31
(8) а ты в ДанныеВыбора пихаешь список со значениями или со структурой ?
   Ёпрст
 
11 - 19.01.21 - 13:32
А в отладке, эта отсебятина в ДанныеВыбора видна ?...
   Ёпрст
 
12 - 19.01.21 - 13:33
Там же это г.. еще и на полнотекстовый поиск завязано (если штатно, в свойствах выставить, начало, в любом месте и т.п) или это указать, если структуру в список толкаешь
   fisher
 
13 - 19.01.21 - 13:39
(10) Пробовал и так и эдак - без разницы
(11) В отладке не видна, так как ПолучитьДанныеВыбора отдает как положено. Или где надо смотреть?
(12) Не очень понял. В настройках стоит полнотекстовый поиск не использовать. Способ поиска строки пробовал оба - и "Начало" и "Любая часть".
   fisher
 
14 - 19.01.21 - 13:46
Вообще, меня почти устраивает штатный поиск в режиме "Любая часть". Только два момента не устраивает:
1) только 10 элементов
2) хитрый алгоритм формирования. Первые пять элементов отображает из тех, которые нашел по первым символам, а остальные пять - из тех где нашел где угодно. Может, оно на небольших справочниках и разнородном ассортименте и норм, а у нас как-то не очень.
При этом режим поиска "Любая часть" работает даже при отключенном полнотекстовом поиске один в один как полнотекстовый поиск - по нескольким словам, в произвольном порядке, с подсветкой слов поиска в результате. Как это можно повторить при переопределении поиска - ума не приложу. Если пытаться использовать полнотекстовый поиск программно, то ессно выдает что он отключен. Да и не хочу я базовую функциональность завязывать на полнотекстовый поиск с его периодическими приколами.
   fisher
 
15 - 19.01.21 - 13:48
Главное, что не непонятно - как подсветку слов поиска в результате получить при переопределении? Да и с приколом этим разобраться бы... Релиз, правда, старый. Может полечили уже этот прикол...
   fisher
 
16 - 19.01.21 - 13:48
"Главное, что непонятно"
   Ёпрст
 
17 - 19.01.21 - 13:50
(13) там поиск еще зависит, включен ли полнотекстовый или нет, попробуй включить его и посмотреть, как оно штатно
   Ёпрст
 
18 - 19.01.21 - 13:50
а вот количество элементов..хз, видать штатно зашит где-то или еще где, смотреть надо
   fisher
 
19 - 19.01.21 - 13:54
(17) Сейчас попробую.
(18) Да в том-то и дело, что количество элементов не фиксировано. Сколько отдаешь в список выбора - все и показывает (больше 20 правда не пробовал). Просто еще в конец добавляет псевдослучайное количество дополнительных элементов (у меня от 1 до 7). Причем мои без подсветки поиска, а эти гады с подсветкой.
   Ёпрст
 
20 - 19.01.21 - 14:05
И это.. История "выбора при вводе" в Авто стоит или выключена ?
   fisher
 
21 - 19.01.21 - 14:07
(20) В Авто. Сначала открывается история. Начинаешь набирать - открывается список выбора.
   fisher
 
22 - 19.01.21 - 14:14
(20) По-ходу, ты гений-телепат!
Эта фигня однозначно связана с историей ввода. Только как-то хитро.
Очень похоже на то, что добавляются результаты поиска по истории ввода (только бывает находит больше, чем в отображаемой истории)
   fisher
 
23 - 19.01.21 - 14:17
Ну, так и есть. Отключил историю - добавлять перестал. Ну, это нестрашно. Главное, что объяснение есть. Еще бы с подсветкой разобраться...
Но уже спасибо огромное!
   fisher
 
24 - 19.01.21 - 14:19
(20) Кстати, а какой смысл отключать историю? Там же все равно открывается это долбанное окошко с "Показать все"? Или его можно таки как-то пристрелить малой кровью?
   Вафель
 
25 - 19.01.21 - 15:23
попробуй в список выбора для предоставления указывать форматированную строку
   fisher
 
26 - 19.01.21 - 15:35
(25) Хорошая идея. Реально хорошая. Но нет.
   fisher
 
27 - 19.01.21 - 15:38
(25) Хотя стоп! Почему нет? Я ж ее сам могу раскрасить! Я, честно говоря, и не знал что в представление списка значений можно форматированную строку пихать. Никогда внимания не обращал.
Спасибо!
   fisher
 
28 - 19.01.21 - 15:41
Да, красится без проблем!
   fisher
 
29 - 19.01.21 - 15:54
Теперь, по-идее, я смогу полностью повторить системный поиск по строке с учетом моих хотелок.
Ура, товарищи! Честно говоря, не верилось. Спасибо!
   Ёпрст
 
30 - 19.01.21 - 20:37
(29) Проверил, на 8.3.18.1208 такое же поведение - и "мусор" с авто подкидывает в список, и штатно, или 10 или 12 всего результатов выводит (закономерность не уловил)
 
 Рекламное место пустует
   fisher
 
31 - 20.01.21 - 11:57
Навскидку вот чего получилось (аналог полнотекстового поиска с произвольным количеством строк выбора, приоритетом результатов совпадающих с началом строки и стандартной подсветкой слов поиска в результате).
Так как в продакшене еще не откатывал, буду рад любым замечаниям.
Функция ПодсветитьСлова(ИсходнаяСтрока, МассивСловПодсветки, Знач ШрифтПодсветки = Неопределено, Знач ЦветПодсветки = Неопределено)
    
    МассивРезультирующихСтрок = Новый Массив;
    
    Если ШрифтПодсветки = Неопределено Тогда
        ШрифтПодсветки = Новый Шрифт(,, Истина);// жирный

    КонецЕсли;
    
    Если ЦветПодсветки = Неопределено Тогда
        ЦветПодсветки = Новый Цвет(0, 153, 0);// светло-зеленый из стандартной подсветки ввода по строке

    КонецЕсли;
    
    ИсходнаяСтрокаНормализованная = НРег(ИсходнаяСтрока);// нормализация

    
    // получим список диапазонов символов для подсветки

    СписокДиапазонов = Новый СписокЗначений;
    Для НомерСлова = 1 По МассивСловПодсветки.Количество() Цикл
        СловоПодсветки = НРег(МассивСловПодсветки[НомерСлова - 1]);// нормализация

        ПозицияНачалаСлова = Найти(ИсходнаяСтрокаНормализованная, СловоПодсветки);
        Если ПозицияНачалаСлова > 0 Тогда
            МассивДиапазона = Новый Массив;
            МассивДиапазона.Добавить(ПозицияНачалаСлова);
            МассивДиапазона.Добавить(ПозицияНачалаСлова + СтрДлина(СловоПодсветки) - 1);
            СписокДиапазонов.Добавить(МассивДиапазона, Формат(ПозицияНачалаСлова, "ЧЦ=3; ЧВН="));
        КонецЕсли;
    КонецЦикла;
    
    // отсортируем список диапазонов по возрастанию началов диапазонов

    СписокДиапазонов.СортироватьПоПредставлению();
    
    // сформируем массив результирующих строк с разным оформлением (подсветкой)

    СтартоваяПозиция = 1;
    Для Каждого ЭлементДиапазона Из СписокДиапазонов Цикл
        НачалоДиапазона = ЭлементДиапазона.Значение[0];
        КонецДиапазона = ЭлементДиапазона.Значение[1];
        Если НачалоДиапазона > СтартоваяПозиция Тогда// часть строки без подсветки

            ЧастьБезВыделения = Сред(ИсходнаяСтрока, СтартоваяПозиция, НачалоДиапазона - СтартоваяПозиция);
            МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(ЧастьБезВыделения));
            СтартоваяПозиция = НачалоДиапазона;
        КонецЕсли;
        Если КонецДиапазона >= СтартоваяПозиция Тогда// часть строки с подсветкой

            ЧастьВыделяемая = Сред(ИсходнаяСтрока, СтартоваяПозиция, КонецДиапазона - СтартоваяПозиция + 1);
            МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(ЧастьВыделяемая, ШрифтПодсветки, ЦветПодсветки));
            СтартоваяПозиция = КонецДиапазона + 1;
        КонецЕсли;
    КонецЦикла;
    
    ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрока);
    Если СтартоваяПозиция <= ДлинаИсходнойСтроки Тогда// "хвост" без выделения

        Хвост = Сред(ИсходнаяСтрока, СтартоваяПозиция, ДлинаИсходнойСтроки - СтартоваяПозиция + 1);
        МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(Хвост));
    КонецЕсли;
    
    Возврат Новый ФорматированнаяСтрока(МассивРезультирующихСтрок);
    
КонецФункции

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    СтрокаПоиска = СтрЗаменить(Параметры.СтрокаПоиска, """", "");// нормализация

    
    Если СтрокаПоиска <> "" И Параметры.Свойство("ВводПоСтрокеРасширенный") Тогда
        
        МаксимумСтрокРезультата = 30;
        
        МассивСловПоиска = СтрРазделить(СтрокаПоиска, " ", Ложь);
        КоличествоСловПоиска = МассивСловПоиска.Количество();
        
        Если КоличествоСловПоиска > 0 Тогда
        
            СтандартнаяОбработка = Ложь;        
            СписокВыбора = Новый СписокЗначений;
            
            Запрос = Новый Запрос;
            
            УсловияПоиска = ""; 
            ПриоритетСортировки = "";
            Для НомерСловаПоиска = 1 По КоличествоСловПоиска Цикл
                
                СловоПоиска = МассивСловПоиска[НомерСловаПоиска - 1];
                ДлинаСловаПоиска = СтрДлина(СловоПоиска);
                
                Запрос.УстановитьПараметр("СловоПоиска" + НомерСловаПоиска, "%" + СловоПоиска + "%");
                УсловияПоиска = УсловияПоиска + "
                |    И Номенклатура.Наименование ПОДОБНО &СловоПоиска" + НомерСловаПоиска;
                
                ПриоритетСортировки = ПриоритетСортировки + СтрШаблон("
                |        КОГДА ПОДСТРОКА(Номенклатура.Наименование, 1, %1) = ""%2""
                |          ТОГДА %3", Формат(ДлинаСловаПоиска, "ЧГ="), СловоПоиска, НомерСловаПоиска);
                
            КонецЦикла;
            
            Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ " + МаксимумСтрокРезультата + "
            |    Номенклатура.Ссылка КАК Ссылка,
            |    Номенклатура.Наименование КАК Наименование,
            |    Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
            |    ВЫБОР" + ПриоритетСортировки + "
            |        ИНАЧЕ 9
            |    КОНЕЦ КАК ПриоритетСортировки
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    ИСТИНА" + УсловияПоиска + "
            |УПОРЯДОЧИТЬ ПО
            |    ПриоритетСортировки, Наименование";
            
            Выборка = Запрос.Выполнить().Выбрать();
            Пока Выборка.Следующий() Цикл
                
                СписокВыбора.Добавить(Новый Структура("Значение, ПометкаУдаления", Выборка.Ссылка, Выборка.ПометкаУдаления), ПодсветитьСлова(Выборка.Наименование, МассивСловПоиска));
                
            КонецЦикла;
            
            ДанныеВыбора = СписокВыбора;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

   fisher
 
32 - 20.01.21 - 11:58
Да, это на примере справочника "Номенклатура".
   Ёпрст
 
33 - 27.01.21 - 21:10
(31) еще не смотрел.
А вот форматированную строку, с помощью этого метода не пробовал ?

СтрНайтиИВыделитьОформлением
   fisher
 
34 - 28.01.21 - 11:08
(33) Не пробовал, потому что в моем старом релизе ее еще нет :) Метод в 15 релизе добавили.
А так - да. Получается, что велосипед изобрел. Хотя, как посмотреть.
СтрНайтиИВыделитьОформлением() не позволяет управлять оформлением ("искомые строки подсвечены стандартным образом").
Ну и в этой старой версии моей функции подсвечивается только первое вхождение. Вот доработанная версия:
Функция ПодсветитьСлова(ИсходнаяСтрока, МассивСловПодсветки, Знач ШрифтПодсветки = Неопределено, Знач ЦветПодсветки = Неопределено)
    
    МассивРезультирующихСтрок = Новый Массив;
    
    Если ШрифтПодсветки = Неопределено Тогда
        ШрифтПодсветки = Новый Шрифт(,, Истина);// жирный

    КонецЕсли;
    
    Если ЦветПодсветки = Неопределено Тогда
        ЦветПодсветки = Новый Цвет(0, 153, 0);// светло-зеленый из стандартной подсветки ввода по строке

    КонецЕсли;
    
    ИсходнаяСтрокаНормализованная = НРег(ИсходнаяСтрока);// нормализация

    ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрокаНормализованная);
    
    // получим список диапазонов символов для подсветки

    СписокДиапазонов = Новый СписокЗначений;
    Для НомерСлова = 1 По МассивСловПодсветки.Количество() Цикл
        СловоПодсветки = НРег(МассивСловПодсветки[НомерСлова - 1]);// нормализация

        ПозицияНачалаСлова = 1;
        ДлинаСлова = СтрДлина(СловоПодсветки);
        Пока ПозицияНачалаСлова <> 0 И ПозицияНачалаСлова <= ДлинаИсходнойСтроки Цикл
            ПозицияНачалаСлова = СтрНайти(ИсходнаяСтрокаНормализованная, СловоПодсветки, , ПозицияНачалаСлова);
            Если ПозицияНачалаСлова > 0 Тогда
                МассивДиапазона = Новый Массив;
                МассивДиапазона.Добавить(ПозицияНачалаСлова);
                МассивДиапазона.Добавить(ПозицияНачалаСлова + ДлинаСлова - 1);
                СписокДиапазонов.Добавить(МассивДиапазона, Формат(ПозицияНачалаСлова, "ЧЦ=3; ЧВН="));
                ПозицияНачалаСлова = ПозицияНачалаСлова + ДлинаСлова;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    // отсортируем список диапазонов по возрастанию начал диапазонов

    СписокДиапазонов.СортироватьПоПредставлению();
    
    // сформируем массив результирующих строк с разным оформлением (подсветкой)

    СтартоваяПозиция = 1;
    Для Каждого ЭлементДиапазона Из СписокДиапазонов Цикл
        НачалоДиапазона = ЭлементДиапазона.Значение[0];
        КонецДиапазона = ЭлементДиапазона.Значение[1];
        Если НачалоДиапазона > СтартоваяПозиция Тогда// часть строки без подсветки

            ЧастьБезВыделения = Сред(ИсходнаяСтрока, СтартоваяПозиция, НачалоДиапазона - СтартоваяПозиция);
            МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(ЧастьБезВыделения));
            СтартоваяПозиция = НачалоДиапазона;
        КонецЕсли;
        Если КонецДиапазона >= СтартоваяПозиция Тогда// часть строки с подсветкой

            ЧастьВыделяемая = Сред(ИсходнаяСтрока, СтартоваяПозиция, КонецДиапазона - СтартоваяПозиция + 1);
            МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(ЧастьВыделяемая, ШрифтПодсветки, ЦветПодсветки));
            СтартоваяПозиция = КонецДиапазона + 1;
        КонецЕсли;
    КонецЦикла;
    
    Если СтартоваяПозиция <= ДлинаИсходнойСтроки Тогда// "хвост" без выделения

        Хвост = Сред(ИсходнаяСтрока, СтартоваяПозиция, ДлинаИсходнойСтроки - СтартоваяПозиция + 1);
        МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(Хвост));
    КонецЕсли;
    
    Возврат Новый ФорматированнаяСтрока(МассивРезультирующихСтрок);
    
КонецФункции

   fisher
 
35 - 28.01.21 - 11:10
Вообще, это очень странно. Добавить в платформу функцию СтрНайтиИВыделитьОформлением(), но при этом не дать возможности этим самым оформлением управлять.
   Ёпрст
 
36 - 28.01.21 - 13:30
(35) ну да, могли бы добавить параметр оформления - цвет/шрифт/размер.. чего там еще штатненько можно в форматированную строку воткнуть..
Ну, хоть так


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.