| 
    
            
         
         | 
    
  | 
Оптимизация кода | ☑ | ||
|---|---|---|---|---|
| 
    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 
 | 
         
        Всем большое спасибо, особенно Зомби, быстрее стало работать     
         | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |