Имя: Пароль:
1C
1С v8
Помогите с запросом
0 demart-omsk
 
12.11.12
15:12
Подскажите, как повысить производительность у кода (Объединял 2 запроса, терялись незакрытые заказы и все равно быстродействие не увеличилось).

СуммаПродаж=0;
   запрос = Новый Запрос;
   запрос.УстановитьПараметр("ДисконтнаяКарта", ДисконтнаяКарта);
   запрос.Текст=
   "ВЫБРАТЬ
   |    ЗаказПокупателя.ДисконтнаяКарта,
   |    ЗаказПокупателя.СуммаДокумента,
   |    ЗаказПокупателя.Ссылка
   |ИЗ
   |    Документ.ЗаказПокупателя КАК ЗаказПокупателя
   |ГДЕ
   |    ЗаказПокупателя.ДисконтнаяКарта = &ДисконтнаяКарта";
   результат=запрос.Выполнить();
   выгрузка=результат.Выгрузить();
   запрос1 = Новый Запрос;
   запрос1.УстановитьПараметр("ДисконтнаяКарта", ДисконтнаяКарта);
   запрос1.Текст= "ВЫБРАТЬ
                  |    ЗакрытиеЗаказовПокупателейЗаказы.ЗаказПокупателя,
                  |    ЗакрытиеЗаказовПокупателейЗаказы.ПричинаЗакрытияЗаказа
                  |ИЗ
                  |    Документ.ЗакрытиеЗаказовПокупателей.Заказы КАК ЗакрытиеЗаказовПокупателейЗаказы
                  |        ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗакрытиеЗаказовПокупателей КАК ЗакрытиеЗаказовПокупателей
                  |        ПО ЗакрытиеЗаказовПокупателейЗаказы.НомерСтроки = ЗакрытиеЗаказовПокупателей.Номер
                  |ГДЕ
                  |    ЗакрытиеЗаказовПокупателейЗаказы.ЗаказПокупателя.ДисконтнаяКарта = &ДисконтнаяКарта";
   результат1=запрос1.Выполнить();
   выгрузка1=результат1.Выгрузить();    
   для каждого стр из выгрузка цикл
       

   для каждого стр1 из выгрузка1 цикл
       Если стр.ссылка = стр1.ЗаказПокупателя и стр1.ПричинаЗакрытияЗаказа = Справочники.ПричиныЗакрытияЗаказов.НайтиПоНаименованию("Отказ от заказа") тогда
       СуммаПродаж=СуммаПродаж-стр.суммадокумента;    
       КонецЕсли;
   КонецЦикла;
       Если ТипЗнч(СуммаПродаж)= Тип("Null") Тогда
           СуммаПродаж=0;
       КонецЕсли;
         СуммаПродаж=СуммаПродаж+стр.суммадокумента;
   КонецЦикла;
   Если Результат.Пустой() Тогда
       Предупреждение("Не выбрана дисконтная карта");
   Иначе              
       Выборка= Результат.Выбрать();
       Выборка.Следующий();
       Если СуммаПродаж<30000 Тогда
           Скидка=3;
       ИначеЕсли СуммаПродаж<50000   Тогда
           Скидка = 5;
       ИначеЕсли СуммаПродаж <100000 Тогда
           Скидка = 7
       Иначе Скидка=10;
       КонецЕсли;    
   КонецЕсли;    
   а=100-Скидка;
   Для каждого строки из товары цикл
   строки.ПроцентАвтоматическихСкидок=Скидка;
   строки.Сумма=(строки.цена*строки.Количество) / 100 * а;
   КонецЦикла;
1 pavelul73
 
12.11.12
15:13
Так может лучше объединить эти 2 запроса в один?
2 Undefined vs NULL
 
12.11.12
15:13
(0) скажите, как это развидеть?
3 demart-omsk
 
12.11.12
15:14
при объединении теряются незакрытые заказы
4 pavelul73
 
12.11.12
15:16
куда они теряются?
5 viktor_vv
 
12.11.12
15:21
А полное соединение там зачем ?

Документ.ЗакрытиеЗаказовПокупателей.Заказы КАК ЗакрытиеЗаказовПокупателейЗаказы
                  |        ПОЛНОЕ СОЕДИНЕНИЕ Документ.ЗакрытиеЗаказовПокупателей КАК ЗакрытиеЗаказовПокупателей
6 palpetrovich
 
12.11.12
15:22
(0) неправильно объединял раз "терялись", покажи как
...а то что в (0) - срочно выбрось!
7 Cunni
 
12.11.12
15:23
тормоза идут отсюда:
<1c>для каждого стр из выгрузка цикл
для каждого стр1 из выгрузка1 цикл
Если стр.ссылка = стр1.ЗаказПокупателя и стр1.ПричинаЗакрытияЗаказа = Справочники.ПричиныЗакрытияЗаказов.НайтиПоНаименованию("Отказ от заказа") тогда
       СуммаПродаж=СуммаПродаж-стр.суммадокумента;    
       КонецЕсли;
   КонецЦикла;
       Если ТипЗнч(СуммаПродаж)= Тип("Null") Тогда
           СуммаПродаж=0;
       КонецЕсли;
         СуммаПродаж=СуммаПродаж+стр.суммадокумента;
   КонецЦикла;
</1c> Дело не в запросе. Но это не означает, что второй запрос бредовый и весь последующий код надо выбросить, затем написать все заново.
8 demart-omsk
 
12.11.12
15:23
запрос = Новый Запрос;
   запрос.УстановитьПараметр("ДисконтнаяКарта", ДисконтнаяКарта);
   запрос.Текст=
   "ВЫБРАТЬ
   |    ЗаказПокупателя1.ДисконтнаяКарта,
   |    ЗаказПокупателя1.СуммаДокумента,
   |    ЗаказПокупателя1.Ссылка,
   |    ВложенныйЗапрос.ЗаказПокупателя,
   |    ВложенныйЗапрос.ПричинаЗакрытияЗаказа
   |ИЗ
   |    Документ.ЗаказПокупателя КАК ЗаказПокупателя1,
   |    (ВЫБРАТЬ
   |        ЗакрытиеЗаказовПокупателейЗаказы.ЗаказПокупателя КАК ЗаказПокупателя,
   |        ЗакрытиеЗаказовПокупателейЗаказы.ПричинаЗакрытияЗаказа КАК ПричинаЗакрытияЗаказа
   |    ИЗ
   |        Документ.ЗакрытиеЗаказовПокупателей.Заказы КАК ЗакрытиеЗаказовПокупателейЗаказы
   |            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗакрытиеЗаказовПокупателей КАК ЗакрытиеЗаказовПокупателей
   |            ПО ЗакрытиеЗаказовПокупателейЗаказы.НомерСтроки = ЗакрытиеЗаказовПокупателей.Номер) КАК ВложенныйЗапрос
   |ГДЕ
   |    ЗаказПокупателя1.ДисконтнаяКарта = &ДисконтнаяКарта
   |    И ВложенныйЗапрос.ЗаказПокупателя.Ссылка = ЗаказПокупателя1.Ссылка";
   результат=запрос.Выполнить();
   выгрузка=результат.Выгрузить();
9 demart-omsk
 
12.11.12
15:24
При таком раскладе незакрытый заказ теряется из выгрузки
10 Undefined vs NULL
 
12.11.12
15:24
регистры накопления для трусов?
11 GANR
 
12.11.12
15:26
Стоп! Для начала поставь задачу на уровне Исходные таблицы - Результирующие таблицы. Тогда желающие составят оптимальное решение "в один запрос". А что до (0) - так почему это должно работать быстро???
12 palpetrovich
 
12.11.12
15:27
(9) запрос вообще должен быть не по документам, а по РН "ЗаказыПокупателей". Кста будет все проще :)
13 GANR
 
12.11.12
15:28
+(8) Чтобы ещё улучшить - нужно ПЕРЕД, а не после соединением таблиц отфильтровать их.
14 palpetrovich
 
12.11.12
15:35
+(12) нечто типа этого:
ВЫБРАТЬ
   ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя,
   ЗаказыПокупателейОстаткиИОбороты.Регистратор,
   ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток,
   ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовПриход,
   ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовРасход,
   ЗаказыПокупателейОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток
ИЗ
   РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты({&НачалоПериода}, {&КонецПериода}, Регистратор, ,
   {ЗаказыПокупателейОстаткиИОбороты.ДисконтнаяКарта = &ДисконтнаяКарта}) КАК ЗаказыПокупателейОстаткиИОбороты
15 demart-omsk
 
12.11.12
15:35
Спасибо, буду думать
16 demart-omsk
 
13.11.12
14:41
запрос = Новый Запрос;
   запрос.УстановитьПараметр("ДК", ДисконтнаяКарта);
   запрос.УстановитьПараметр("ПричинаЗакрытияЗаказа", Справочники.ПричиныЗакрытияЗаказов.НайтиПоНаименованию("Отказ от заказа"));
   запрос.Текст=
    "ВЫБРАТЬ
    |    СУММА(ЗаказыПокупателейОбороты.СуммаВзаиморасчетовПриход) КАК Сумма
    |ИЗ
    |    РегистрНакопления.ЗаказыПокупателей.Обороты(, , , ЗаказПокупателя.ДисконтнаяКарта = &ДК) КАК ЗаказыПокупателейОбороты
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    -ПричиныЗакрытияЗаказов.СуммаВзаиморасчетов
    |ИЗ
    |    РегистрСведений.ПричиныЗакрытияЗаказов КАК ПричиныЗакрытияЗаказов
    |ГДЕ
    |    ПричиныЗакрытияЗаказов.Заказ.ДисконтнаяКарта = &ДК
    |    И ПричиныЗакрытияЗаказов.ПричинаЗакрытияЗаказа = &ПричинаЗакрытияЗаказа
    |ИТОГИ ПО
    |    ОБЩИЕ";
   результат=запрос.Выполнить();
   выгрузка=результат.Выгрузить();
   
   СуммаПродаж = выгрузка[0].Сумма;
   Если СуммаПродаж<30000 Тогда
       Скидка=3;
   ИначеЕсли СуммаПродаж<50000   Тогда
       Скидка = 5;
   ИначеЕсли СуммаПродаж <100000 Тогда
       Скидка = 7
   Иначе Скидка=10;
   КонецЕсли;    
                   а=100-Скидка;
   Для каждого строки из товары цикл
       строки.ПроцентАвтоматическихСкидок=Скидка;
       строки.Сумма=(строки.цена*строки.Количество) / 100 * а;
   КонецЦикла;
17 demart-omsk
 
13.11.12
14:42
по регистрам работает отлично
18 palpetrovich
 
13.11.12
15:09
(16) прикольно, получаетя с вами выгодно работать если СуммаПродаж<30000 или СуммаПродаж>100000  :)))
19 demart-omsk
 
13.11.12
15:10
внимательно посмотри, все верно
20 demart-omsk
 
13.11.12
15:11
выложил, для тех, кому пригодится
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn