Имя: Пароль:
1C
1C 7.7
v7: Долго ищет клиента, как оптимизировать запрос в ТиС, дисконт?
,
0 Neg
 
20.03.15
11:33
Функция глПриВыбореКлиента(Конт) Экспорт
    
    Дкнт = Конт.Клиент;
    Если Дкнт.Выбран()=1 Тогда
        Сумма = глСуммаДисконта(Дкнт.ТекущийЭлемент());
    КонецЕсли;
    Если ПустоеЗначение(Сумма)=1 Тогда
        Сумма=0;
    КонецЕсли;
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Без итогов;
    |Минимум = Справочник.ШкалаДисконтов.Минимум;
    |Максимум = Справочник.ШкалаДисконтов.Максимум;
    |Скидка = Справочник.ШкалаДисконтов.Скидка;
    |ТекущийЭлемент = Справочник.ШкалаДисконтов.ТекущийЭлемент;
    |Группировка Скидка без Групп;
    |Условие(Минимум < Сумма);
    |Условие(Максимум > Сумма);
    |Условие(ТекущийЭлемент.ПометкаУдаления() = 0);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат 0;
    КонецЕсли;
    
    Пока Запрос.Группировка() = 1 Цикл
        Скидка_ = Запрос.Скидка;
    КонецЦикла;
    
    Возврат Скидка_;
КонецФункции //глПриВыбореДисконта()

Функция глНайтиКлиентаДисконт(Карта) Экспорт
    Кл=СоздатьОбъект("Справочник.КлиентДисконт");
    Кд=Сред(Карта,1,13);
    Если Кл.НайтиПоРеквизиту("ШтрихкодК",Кд,1)=1 Тогда
        ВзКл=Кл.ТекущийЭлемент();
        Возврат ВзКл;
    Иначе
        ВзКл=0;
        Возврат ВзКл;
    КонецЕсли;
    
    
КонецФункции
1 Neg
 
20.03.15
11:37
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
    // Процедура разбирает штрих-код, считанный сканером
    // и заполняет строки накладной
    Перем Упаковка,ТекКоличество, Спецификация;
    Перем ВремТовар, ВремЕдиница, ВремКоличество, ВремЦена;
    
    Перем СтрокаВозврЦена;

Если Событие = "BarCodeValue" Тогда
        ПредположимЧтоКарта=Сред(Данные,1,2); //+д;
        Если (ПредположимЧтоКарта="33") или(ПредположимЧтоКарта="30")  Тогда // Это действительно карта клиента +д
        
            Карта=глНайтиКлиентаДисконт(Данные); //Ищем карту            
            Если Карта=0 Тогда
                Сообщить("Клиента нет в базе!");
            Иначе
                Клиент=Карта;
                ПриВыбореКлиента();
            КонецЕсли;
            
        // Обработка закончена. Готовы к получению нового штрихкода.
        глСканерПосылкаДанных(1);
    Иначе // ищем товар
2 Neg
 
20.03.15
11:41
товар ищет быстро, а вот клиента очень долго...
3 Vladal
 
20.03.15
11:49
Справочник ШкалаДисконтов - подчиненный клиентам?
4 Vladal
 
20.03.15
11:51
Попробуй переписать запрос на перебор элементов справочника. В 7.7 долго обрабатываются запросы.
Или используйте прямые запросы с помощью 1С++
5 Neg
 
20.03.15
11:51
(3) нет
6 Fragster
 
гуру
20.03.15
11:52
напротив ШтрихкодК в конфигураторе галка "индексировать" стоит?
7 Vladal
 
20.03.15
11:54
(6) В семерке?
8 Neg
 
20.03.15
11:56
(6) такого там нет :)
9 asady
 
20.03.15
11:57
(0) уточни что не устраивает по времени

Карта=глНайтиКлиентаДисконт(Данные);

или

ПриВыбореКлиента();

??
10 Neg
 
20.03.15
12:09
Не могу сейчас точно замерить/сказать, касса кричит долго. :) Народ идет...
11 Sserj
 
20.03.15
12:12
(7)(8) Он просто неправильно выразился, у реквизита есть стоит флажок "Сортировка". Это тоже самое что индексировать по научному.
12 Fragster
 
гуру
20.03.15
12:13
(7)(8) последний раз клюшками занимался лет 7 назад, так что может и забыл чего. но ЕМНИП, было.
А если нет - то добавить индексы в скуле/ДБФе ручками можно.
13 Neg
 
20.03.15
12:15
(11) (12) Сортировка стоит
14 Fragster
 
гуру
20.03.15
12:16
(13) попробуй сделать переиндексацию, или как там её в 7.7.
15 Neg
 
20.03.15
12:21
сейчас допустили, делаю.
16 МихаилМ
 
20.03.15
12:32
|Группировка Скидка без Групп;

+ без упорядовачивания.
17 Fragster
 
гуру
20.03.15
12:47
(16) вот мне кажется, что справочник со шкалами - очень маленький, и тупит не из-за него
18 МихаилМ
 
20.03.15
13:12
(17)
даже если справочник маленький

на каждый элемент

будет сделано 2 отдельных запроса

для упорядочивания и для  ПометкаУдаления()
19 Злопчинский
 
20.03.15
15:16
У товарища платный драйвер Атола, который дает задержку 10 сек...
не?
20 Злопчинский
 
20.03.15
15:20
прямой запрос на склайт на справочник без индексов на туеву хучу тысяч строк - отрабатывал вполне терпимо, порядка 10-20 секунд (у меня это редкоиспользуемая операция).

так что 1Сный запрос на справочник дисконта должен отработать быстро. а если как написано - на группировку и пометку удаления два отдельных запроса (хотя мне это сомнительно), то  проще получить выборку и пропустить удаленные при обходе выборки
21 Fragster
 
гуру
20.03.15
15:45
(19) ну, если по номенклатуре ищет бысро, то дело не в этом должно быть.
22 AliAksA
 
21.03.15
14:02
вот это может тормозить запрос:
|Условие(ТекущийЭлемент.ПометкаУдаления() = 0);
лучше проверять при обработке запроса
23 Абыр
 
21.03.15
14:32
сперва замером выяснить какой именно кусок тупит
24 Злопчинский
 
21.03.15
22:15
Упростить запрос максимально
Ксложнять по шагам
Смотреть как изменится время
25 Злопчинский
 
23.03.15
23:13
Автор умер в есте с задачей?
26 Neg
 
24.03.15
02:49
(25)  неее, просто на терминал перешел и проблема отпала. :)
27 Neg
 
24.03.15
02:53
а точнее он там и был, долбанные эксперементы...
28 155153144627
 
24.03.15
02:59
А почему поиск по шкале дисконта запросом, хотя я думаю там несколько элементов. А по клиентдисконт через найти реквизит?... Хотя наверняка количество дисконтных карт не одна сотня или тысяча.