Добрий ден. Підкажіть, в якій процедурі проходить стандарне заповнення випадаючого списку номенклатури, при введенні декількох букв
як підмінити стандартну процедуру і заповнити спиок своїми данними?
&НаСервереБезКонтекста
Функция РасходыНоменклатураНачалоВыбораНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура.Наименование УБЫВ";
тбУслуг = Новый ТаблицаЗначений;
тбУслуг = Запрос.Выполнить().Выгрузить();
спУслуг = Новый СписокЗначений;
спУслуг.ЗагрузитьЗначения(тбУслуг.ВыгрузитьКолонку("Ссылка"));
Возврат спУслуг;
КонецФункции
&НаКлиенте
Процедура РасходыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
спУслуг = РасходыНоменклатураНачалоВыбораНаСервере();
Если Не спУслуг.Количество() = 0 Тогда
ЭтаФорма.Элементы.РасходыНоменклатура.РежимВыбораИзСписка = Истина;
ЭтаФорма.Элементы.РасходыНоменклатура.СписокВыбора.ЗагрузитьЗначения(спУслуг.ВыгрузитьЗначения());
Иначе
ЭтаФорма.Элементы.РасходыНоменклатура.РежимВыбораИзСписка = Ложь;
КонецЕсли;
КонецПроцедуры
Процедура НашЭлементПоискаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
ТекстПоиска = ВРег(Текст);
Пока СтрНайти(ТекстПоиска, " ") > 0 Цикл
ТекстПоиска = СтрЗаменить(ТекстПоиска, " ", " ");
КонецЦикла;
ТекстПоиска = СокрЛП(ТекстПоиска);
ДлинаТекста = СтрДлина(ТекстПоиска);
Если ДлинаТекста = 0 Тогда
Возврат
КонецЕсли;
СтандартнаяОбработка = Ложь;
Шрифт = Новый Шрифт(,,Истина);
Цвет = WebЦвета.Зеленый;
ДанныеВыбора = Новый СписокЗначений;
МассивПодстрок = СтрРазделить(ТекстПоиска, " ");
Для Каждого Стр Из Элемент.СписокВыбора Цикл
Строка = Стр.Значение;
СтрокаВРег = ВРег(Строка);
ВхожденияНайдены = Истина;
Для Каждого Подстрока Из МассивПодстрок Цикл
Если Найти(СтрокаВРег, Подстрока) = 0 Тогда
ВхожденияНайдены = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ВхожденияНайдены Тогда
Продолжить
КонецЕсли;
ДлинаСтроки = СтрДлина(Строка);
Массив = Новый Массив(ДлинаСтроки);
Для Каждого Подстрока Из МассивПодстрок Цикл
ДлинаПодстроки = СтрДлина(Подстрока);
НачалоПоиска = 1;
Пока Истина Цикл
ПозицияПодстроки = СтрНайти(СтрокаВРег, Подстрока, , НачалоПоиска);
Если ПозицияПодстроки = 0 Тогда
Прервать;
КонецЕсли;
НачалоПоиска = ПозицияПодстроки + ДлинаПодстроки;
Для Сч = ПозицияПодстроки По НачалоПоиска - 1 Цикл
Массив[Сч - 1] = Истина;
КонецЦикла;
Если НачалоПоиска > ДлинаСтроки Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
МассивСтрок = Новый Массив;
Для Сч = 0 По Массив.ВГраница() Цикл
Символ = Сред(Строка, Сч + 1, 1);
Если Массив[Сч] = Неопределено Тогда
МассивСтрок.Добавить(Символ);
Иначе
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(Символ, Шрифт, Цвет));
КонецЕсли;
КонецЦикла;
ДанныеВыбора.Добавить(Строка, Новый ФорматированнаяСтрока(МассивСтрок));
Если ДанныеВыбора.Количество() = 50 Тогда
Прервать
КонецЕсли;
КонецЦикла;
КонецПроцедуры
МойОтбор1 = Новый СписокЗначений;
Если ОдноЧисло Тогда
СтрокаШаблона = "ЧЧЧ1\s{0,2}[mм][mм].?";
Иначе
СтрокаШаблона = "ЧЧЧ1\s{0,2}[xх\*\/]\s{0,2}ЧЧЧ2\s{0,2}[mм][mм].?";
КонецЕсли;
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = ЛОЖЬ; //Многострочный
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина; //Регистр верхний/нижний или не учитывать
/////////////////////////////
RegExp.Pattern = СокрЛП(СтрокаШаблона);
ВыборкаПродуктов = Справочники.Продукт.Выбрать();
Пока ВыборкаПродуктов.Следующий() Цикл
Matches=RegExp.Execute(СокрЛП(ВыборкаПродуктов.Наименование));
Если Matches.Count > 0 Тогда
МойОтбор1.Добавить(ВыборкаПродуктов.Ссылка);
КонецЕсли;
КонецЦикла;
НовыйЗапрос = РеквизитТекстЗапроса + "
|ГДЕ
|СправочникПродукт.Ссылка В(&МойОтбор1)";
Список.ПроизвольныйЗапрос = Истина;
Список.ТекстЗапроса = НовыйЗапрос;
Список.ОсновнаяТаблица = Список.ОсновнаяТаблица;
Список.ДинамическоеСчитываниеДанных = Истина;
Список.Параметры.УстановитьЗначениеПараметра("МойОтбор1", МойОтбор1);
Запрос.УстановитьПараметр("ИскомоеСодержимое", "%"+СокрЛП(ПоискПоИзвлеченномуТексту)+"%");
Для каждого тек Из тз_Отбора Цикл
НаимСЖ=СтрокаСжать(тек.Наименование);
Нашли="";
РезТек=НечеткоеСравнение(НаимСЖ,ИскСЖ,Нашли,Ранг);
РезТек=2*РезТек-СтрДлина(Нашли);
РезТек=Цел(100*РезТек/СтрДлина(ИскСЖ));
Если РезТек >= Достоверность Тогда
ДобавитьВРезультаты(Нашли,РезТек, Результаты2, тек.Ссылка, тЭлем, Искомое);
КонецЕсли;
Если ТекущаяДата()>=Лимит Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "ПРЕРВАНО! Перевищено тайм-аут!";
Сообщение.Сообщить();
Прервать;
КонецЕсли;
КонецЦикла;
//***************************
&НаСервере
Функция НечеткоеСравнение(Строка1,Строка2,Строка3,Ранг=0)
Дл=СтрДлина(Строка2);
Если Строка1=Строка2 Тогда
Если Строка3="" Тогда Строка3=Строка1 Иначе Строка3=Строка3+","+Строка1 КонецЕсли;
Возврат(Дл);
КонецЕсли;
Огр=Цел(Дл/10); Если Огр>2 Тогда Огр=2 КонецЕсли;
От=0;
Если Ранг>0 Тогда
От=Дл-Ранг;
КонецЕсли;
Для Сч1=От По Дл-2 Цикл
Для Сч2=1 По Сч1+1 Цикл
Иск=Сред(Строка2,Сч2,Дл-Сч1);
Если(Найти(Строка1,Иск)<>0) Тогда
Рез=СтрДлина(Иск);
Если Строка3="" Тогда
Строка3=Иск;
Иначе
Строка3=Строка3+","+Иск;
КонецЕсли;
Если (Рез>Огр) или ((Строка3<>Иск) и (Рез>2)) Тогда
Стр1=СтрЗаменить(Строка1,Иск,"");
Стр2=СтрЗаменить(Строка2,Иск,"");
Рез1=НечеткоеСравнение(Стр1,Стр2,Строка3,Рез);
Рез=Рез+Рез1;
КонецЕсли;
Возврат(Рез);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат(0);
КонецФункции
ТекстПоиск = "0";
Для Индекс = 1 По ДлинаСтроки - 3 Цикл
ТекстПоиск = ТекстПоиск + " + ВЫБОР КОГДА ИсточникДанных." + ИмяРеквизит + " ПОДОБНО ""%" + Сред(СтрокаПоиска, Индекс, 3) + "%"" ТОГДА 1 ИНАЧЕ 0 КОНЕЦ";
КонецЦикла;
ТекстДерево = Дерево("ИсточникДанных." + ИмяРеквизит, -1, 300);
ТекстРанг = "ВЫБОР КОГДА ПОДСТРОКА(ИсточникДанных." + ИмяРеквизит + ", " + (ДлинаСтроки + 1) + ", 3) = """" ТОГДА " + ДлинаСтроки + " ИНАЧЕ " + ТекстДерево + " КОНЕЦ";
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 500
| ИсточникДанных.Ссылка КАК Ссылка,
| ИсточникДанных." + ИмяРеквизит + " КАК Реквизит,
| 100*(" + ТекстПоиск + ")/(" + ТекстРанг + " - 2) КАК Ранг
//|ИЗ " + ЭтаФорма.ИмяИсточникДанных + " КАК ИсточникДанных
|ИЗ Справочник.Продукт КАК ИсточникДанных
|ГДЕ " + ТекстПоиск + " > 0
|УПОРЯДОЧИТЬ ПО
| Ранг УБЫВ";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Результат = "<html><body><table><tr><td><b>Ранг</b></td><td><b>Найденная строка<b></td></tr>";
Пока Выборка.Следующий() Цикл
Индекс = 1;
НайденнаяСтрока = Выборка.Реквизит;
Пока Индекс < ДлинаСтроки Цикл
Длина = 2;
Пока Индекс + Длина <= ДлинаСтроки Цикл
Если Найти(НайденнаяСтрока, Сред(СтрокаПоиска, Индекс, Длина + 1)) > 0 Тогда
Длина = Длина + 1;
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Если Длина > 2 Тогда
Подстрока = Сред(СтрокаПоиска, Индекс, Длина);
НайденнаяСтрока = СтрЗаменить(НайденнаяСтрока, Подстрока, "<b>" + Подстрока + "</b>");
Иначе
Длина = 0;
КонецЕсли;
Индекс = Индекс + Длина + 1;
КонецЦикла;
Результат = Результат + "<tr><td><button id=" + ЗначениеВСтрокуВнутр(Выборка.Ссылка) + ">...</button> ";
Результат = Результат + Цел(Выборка.Ранг);
Результат = Результат + "</td><td>";
Результат = Результат + НайденнаяСтрока;
Результат = Результат + "</td></tr>";
КонецЦикла;
Результат = Результат + "</table></body></html>";