Имя: Пароль:
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
А почему поиск по шкале дисконта запросом, хотя я думаю там несколько элементов. А по клиентдисконт через найти реквизит?... Хотя наверняка количество дисконтных карт не одна сотня или тысяча.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn