Имя: Пароль:
1C
1С v8
Оптимизация кода
,
0 deathogre
 
15.07.16
08:39
Процедура ТоварыНоменклатураОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;

    Если НЕ ПустаяСтрока(Текст) Тогда
        Список = НайтиНоменклатуру(Текст);
        ДанныеВыбора = Новый СписокЗначений;
        Для Каждого ТекЗначение Из Список Цикл
            ДанныеВыбора.Добавить(ТекЗначение.Значение);
        КонецЦикла;
    КонецЕсли;

КонецПроцедуры

Список = НайтиНоменклатуру(Текст); - вот эта строка очень долго выполняется. Можете подсказать почему?
1 deathogre
 
15.07.16
08:40
вызывается эта функция

&НаСервере
Функция НайтиНоменклатуру(Текст)

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
                    |    Номенклатура.Ссылка
                    |ИЗ
                    |    Справочник.Номенклатура КАК Номенклатура
                    |ГДЕ
                    |    Номенклатура.Код ПОДОБНО &Код";

    Запрос.УстановитьПараметр("Код", "%"+Текст+"%");

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Список = Новый СписокЗначений;
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Список.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
    КонецЦикла;

    Возврат Список;

КонецФункции
2 Lama12
 
15.07.16
08:40
(0) Смотри что это за функция.
3 deathogre
 
15.07.16
08:41
сама функция быстро выполняется
4 catena
 
15.07.16
08:42
Ленится
5 floody
 
15.07.16
08:42
Потому что ПОДОБНО. Перебор всей номенклатуры.
6 deathogre
 
15.07.16
08:43
(5) а чем можно заменить?
7 MrStomak
 
15.07.16
08:44
Потому что поиск идет по вхождению в любую часть кода, т.е. полный перебор всей номенклатуры.
8 oslokot
 
15.07.16
08:44
и еще, можно упростить:
Возврат Результат.Выбрать().Выгрузить().ВыгрузитьКолонку("Ссылка")
9 vicof
 
15.07.16
08:45
Статистику на сервере обнови
10 oslokot
 
15.07.16
08:45
(8) * выбрать() убрать кнечно же
11 vicof
 
15.07.16
08:45
И индексы пересчитай
12 DrZombi
 
гуру
15.07.16
08:45
(6) Используй еще.


&НаСервереБезКонтекста
Функция НайтиНоменклатуру(Знач Текст)
13 Asmody
 
15.07.16
08:46
Я бы, для начала, условие поставил:
Если СтрДлина(Текст)>=3 Тогда
14 Beretta
 
15.07.16
08:46
(0) &НаСервереБезКонтекста
15 Beretta
 
15.07.16
08:47
(13) +1
16 MrStomak
 
15.07.16
08:47
Если долго возврат на клиента происходит, то наверное очень много значений, ограничь список 20 где- нибудь, т.е. выбрать первые 20
17 Гипервизор
 
15.07.16
08:47
(0) ВЫБРАТЬ  ПЕРВЫЕ 50
Посмотри как в типовых сделано
18 DrZombi
 
гуру
15.07.16
08:49
(0)По коду

Результат = Запрос.Выполнить();
ТЗ = Результат.Выгрузить();
Массив = ТЗ.ВыгрузитьКолонку("Ссылка");
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(Массив);
Возврат Список;

Убрать код:
        Список = НайтиНоменклатуру(Текст);
        ДанныеВыбора = Новый СписокЗначений;
        Для Каждого ТекЗначение Из Список Цикл
            ДанныеВыбора.Добавить(ТекЗначение.Значение);
        КонецЦикла;

Оставить:
        ДанныеВыбора = НайтиНоменклатуру(Текст);
19 DrZombi
 
гуру
15.07.16
08:56
(0) А так, тебя ждет еще разочарование. Список будет выпадать еще через менеджер справочника, к которому ты обращаешься "Номенклатура"
20 бомболюк
 
15.07.16
09:30
сам по себе вызов сервера дело весьма небыстрое.
21 DrZombi
 
гуру
15.07.16
09:40
(20) Через "НаСервереБезКонтекста" и не будет летать твоя форма туда обратно.
22 DrZombi
 
гуру
15.07.16
09:40
+ Если еще и переменные функции уложишь в "Знач", то и они не будут возвращаться обратно на клиент
23 Chameleon1980
 
15.07.16
10:12
(22) +
24 deathogre
 
15.07.16
10:16
Всем большое спасибо, особенно Зомби, быстрее стало работать