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

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

Функция ПодсветитьСлова(ИсходнаяСтрока, МассивСловПодсветки, Знач ШрифтПодсветки = Неопределено, Знач ЦветПодсветки = Неопределено)
    
    МассивРезультирующихСтрок = Новый Массив;
    
    Если ШрифтПодсветки = Неопределено Тогда
        ШрифтПодсветки = Новый Шрифт(,, Истина); // жирный
    КонецЕсли;
    
    Если ЦветПодсветки = Неопределено Тогда
        ЦветПодсветки = Новый Цвет(0, 153, 0); // светло-зеленый из стандартной подсветки ввода по строке
    КонецЕсли;
    
    ИсходнаяСтрокаНормализованная = НРег(ИсходнаяСтрока); // нормализация
    ДлинаИсходнойСтроки = СтрДлина(ИсходнаяСтрокаНормализованная);
    
    // получим список диапазонов символов для подсветки
    СписокДиапазонов = Новый СписокЗначений;
    Для НомерСлова = 1 По МассивСловПодсветки.Количество() Цикл
        СловоПодсветки = НРег(МассивСловПодсветки[НомерСлова - 1]); // нормализация
        ПозицияНачалаСлова = 1;
        ДлинаСлова = СтрДлина(СловоПодсветки);
        Пока ПозицияНачалаСлова <> 0 И ПозицияНачалаСлова <= ДлинаИсходнойСтроки Цикл
            ПозицияНачалаСлова = СтрНайти(ИсходнаяСтрокаНормализованная, СловоПодсветки, , ПозицияНачалаСлова);
            Если ПозицияНачалаСлова > 0 Тогда
                МассивДиапазона = Новый Массив;
                МассивДиапазона.Добавить(ПозицияНачалаСлова);
                МассивДиапазона.Добавить(ПозицияНачалаСлова + ДлинаСлова - 1);
                СписокДиапазонов.Добавить(МассивДиапазона, Формат(ПозицияНачалаСлова, "ЧЦ=3; ЧВН="));
                ПозицияНачалаСлова = ПозицияНачалаСлова + ДлинаСлова;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    // отсортируем список диапазонов по возрастанию начал диапазонов
    СписокДиапазонов.СортироватьПоПредставлению();
    
    // сформируем массив результирующих строк с разным оформлением (подсветкой)
    СтартоваяПозиция = 1;
    Для Каждого ЭлементДиапазона Из СписокДиапазонов Цикл
        НачалоДиапазона = ЭлементДиапазона.Значение[0];
        КонецДиапазона = ЭлементДиапазона.Значение[1];
        Если НачалоДиапазона > СтартоваяПозиция Тогда // часть строки без подсветки
            ЧастьБезВыделения = Сред(ИсходнаяСтрока, СтартоваяПозиция, НачалоДиапазона - СтартоваяПозиция);
            МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(ЧастьБезВыделения));
            СтартоваяПозиция = НачалоДиапазона;
        КонецЕсли;
        Если КонецДиапазона >= СтартоваяПозиция Тогда // часть строки с подсветкой
            ЧастьВыделяемая = Сред(ИсходнаяСтрока, СтартоваяПозиция, КонецДиапазона - СтартоваяПозиция + 1);
            МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(ЧастьВыделяемая, ШрифтПодсветки, ЦветПодсветки));
            СтартоваяПозиция = КонецДиапазона + 1;
        КонецЕсли;
    КонецЦикла;
    
    Если СтартоваяПозиция <= ДлинаИсходнойСтроки Тогда // "хвост" без выделения
        Хвост = Сред(ИсходнаяСтрока, СтартоваяПозиция, ДлинаИсходнойСтроки - СтартоваяПозиция + 1);
        МассивРезультирующихСтрок.Добавить(Новый ФорматированнаяСтрока(Хвост));
    КонецЕсли;
    
    Возврат Новый ФорматированнаяСтрока(МассивРезультирующихСтрок);
    
КонецФункции
35 fisher
 
28.01.21
11:10
Вообще, это очень странно. Добавить в платформу функцию СтрНайтиИВыделитьОформлением(), но при этом не дать возможности этим самым оформлением управлять.
36 Ёпрст
 
28.01.21
13:30
(35) ну да, могли бы добавить параметр оформления - цвет/шрифт/размер.. чего там еще штатненько можно в форматированную строку воткнуть..
Ну, хоть так