Имя: Пароль:
1C
1С v8
Размещение колонок оплаты отгрузки в списке заказов
0 heavenly
 
09.11.11
12:30
Платформа 8.2.14.537
Комплексная Автоматизация 1.1.15.1

Как лучше переписать запрос, чтобы он быстрее выполнялся, а то подтармаживает прокрутка?

Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
   
   Если ЭлементыФормы.Список.Колонки.ОбособленныйУчет.Видимость Тогда
       УправлениеЗаказами.ВывестиПризнакОбособленныйУчетВФормуСписка(Элемент, ОформленияСтрок, новый Соответствие());
   КонецЕсли;
   
   Ссылки = Новый Массив;
   Соответствие = Новый Соответствие;
   
   Если Элемент.Колонки.Оплата.Видимость
       И Элемент.Колонки.Отгрузка.Видимость Тогда
       Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
           Ссылки.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка.ДоговорКонтрагента.Ссылка);
           Соответствие.Вставить(ОформлениеСтроки.ДанныеСтроки.Ссылка.ДоговорКонтрагента.Ссылка,ОформлениеСтроки);
       КонецЦикла;
       
       Запрос = Новый Запрос;
       Запрос.Текст =
       "ВЫБРАТЬ
       |    РасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
       |    ВЫБОР
       |        КОГДА РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход = 0
       |                ИЛИ РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход ЕСТЬ NULL
       |            ТОГДА """"
       |        КОГДА РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход >= РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход
       |            ТОГДА ""Оплачено полностью""
       |        ИНАЧЕ ""Оплачено частично""
       |    КОНЕЦ КАК СостояниеОплаты,
       |    ВЫБОР
       |        КОГДА ЗаказыПокупателейОстаткиИОбороты.КоличествоПриход = ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток
       |            ТОГДА """"
       |        КОГДА ЕСТЬNULL(ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток, 0) <= 0
       |            ТОГДА ""Отгружено полностью""
       |        ИНАЧЕ ""Отгружено частично""
       |    КОНЕЦ КАК СостояниеОтгрузки
       |ИЗ
       |    РегистрНакопления.РасчетыСКонтрагентами.Обороты КАК РасчетыСКонтрагентамиОбороты
       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты КАК ЗаказыПокупателейОстаткиИОбороты
       |        ПО РасчетыСКонтрагентамиОбороты.ДоговорКонтрагента = ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента
       |ГДЕ
       |    ЗаказыПокупателейОстаткиИОбороты.ДоговорКонтрагента В(&Ссылки)";
       
       Запрос.УстановитьПараметр("Ссылки", Ссылки);
       
       Выборка = Запрос.Выполнить().Выбрать();
       
       Пока Выборка.Следующий() Цикл
           
           ОформлениеСтроки = Соответствие[Выборка.ДоговорКонтрагента.Ссылка];
           
           ОформлениеСтроки.Ячейки.Оплата.УстановитьТекст(Выборка.СостояниеОплаты);
           ОформлениеСтроки.Ячейки.Отгрузка.УстановитьТекст(Выборка.СостояниеОтгрузки);
           
       КонецЦикла;
               
   КонецЕсли;
       
КонецПроцедуры
1 DrShad
 
09.11.11
12:34
а если заказов по договору будет несколько?
2 heavenly
 
09.11.11
12:40
(2) к счастью у каждого договора один заказ.
3 lxndr
 
09.11.11
12:40
1) нафига
РегистрНакопления.РасчетыСКонтрагентами.Обороты ?
и
РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты?
Бери остатки.
2) Отбор в параметры ВТ
3) соединить по заказу
4 lxndr
 
09.11.11
12:42
+(3) отбор лучше по заказам делать
5 heavenly
 
09.11.11
13:39
(1) (4) спасибо.
Переделал с отбором, стало намного быстрее.
А еще быстрее можно? ;)


Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
   
   Если ЭлементыФормы.Список.Колонки.ОбособленныйУчет.Видимость Тогда
       УправлениеЗаказами.ВывестиПризнакОбособленныйУчетВФормуСписка(Элемент, ОформленияСтрок, новый Соответствие());
   КонецЕсли;
   
   Ссылки = Новый Массив;
   Соответствие = Новый Соответствие;
   
   Если Элемент.Колонки.Оплата.Видимость
       ИЛИ Элемент.Колонки.Отгрузка.Видимость Тогда
       Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
           Ссылки.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);
           Соответствие.Вставить(ОформлениеСтроки.ДанныеСтроки.Ссылка,ОформлениеСтроки);
       КонецЦикла;
       
       Запрос = Новый Запрос;
       Запрос.Текст =
       "ВЫБРАТЬ
       |    ВЫБОР
       |        КОГДА РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход = 0
       |                ИЛИ РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход ЕСТЬ NULL
       |            ТОГДА """"
       |        КОГДА РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход >= РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход
       |            ТОГДА ""Оплачено полностью""
       |        ИНАЧЕ ""Оплачено частично""
       |    КОНЕЦ КАК СостояниеОплаты,
       |    ВЫБОР
       |        КОГДА ЗаказыПокупателейОстаткиИОбороты.КоличествоПриход = ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток
       |            ТОГДА """"
       |        КОГДА ЕСТЬNULL(ЗаказыПокупателейОстаткиИОбороты.КоличествоКонечныйОстаток, 0) <= 0
       |            ТОГДА ""Отгружено полностью""
       |        ИНАЧЕ ""Отгружено частично""
       |    КОНЕЦ КАК СостояниеОтгрузки,
       |    ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя
       |ИЗ
       |    РегистрНакопления.РасчетыСКонтрагентами.Обороты(, , , Сделка В (&Ссылки)) КАК РасчетыСКонтрагентамиОбороты
       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.ОстаткиИОбороты(, , , , ЗаказПокупателя В (&Ссылки)) КАК ЗаказыПокупателейОстаткиИОбороты
       |        ПО РасчетыСКонтрагентамиОбороты.Сделка = ЗаказыПокупателейОстаткиИОбороты.ЗаказПокупателя";
       
       Запрос.УстановитьПараметр("Ссылки", Ссылки);
       
       Выборка = Запрос.Выполнить().Выбрать();
       
       Пока Выборка.Следующий() Цикл
           
           ОформлениеСтроки = Соответствие[Выборка.ЗаказПокупателя.Ссылка];
           
           ОформлениеСтроки.Ячейки.Оплата.УстановитьТекст(Выборка.СостояниеОплаты);
           ОформлениеСтроки.Ячейки.Отгрузка.УстановитьТекст(Выборка.СостояниеОтгрузки);
           
       КонецЦикла;
               
   КонецЕсли;
       
КонецПроцедуры
6 lxndr
 
09.11.11
13:49
(5) я бы использовал таблицы остатков вместо оборотов и ОстаткиИОбороты
+ возможно, ускорит соединение с регистров с предварительно сформированной временной таблицей заказов
7 heavenly
 
10.11.11
13:22
А этот запрос можно еще быстрее заставить работать?

"ВЫБРАТЬ
       |    ЗаказыПокупателей.ЗаказПокупателя,
       |    МАКСИМУМ(ВЫРАЗИТЬ(РасчетыСКонтрагентами.Регистратор КАК Документ.ПлатежноеПоручениеВходящее).ДатаОплаты) КАК Оплата,
       |    МАКСИМУМ(ВЫРАЗИТЬ(ЗаказыПокупателей.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата) КАК Отгрузка
       |ИЗ
       |    РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСКонтрагентами КАК РасчетыСКонтрагентами
       |        ПО ЗаказыПокупателей.ЗаказПокупателя = РасчетыСКонтрагентами.Сделка
       |ГДЕ
       |    ЗаказыПокупателей.ЗаказПокупателя В(&Ссылки)
       |
       |СГРУППИРОВАТЬ ПО
       |    ЗаказыПокупателей.ЗаказПокупателя";
8 DrShad
 
10.11.11
13:23
(7) сколько?
9 heavenly
 
10.11.11
13:58
(8)Что сколько? Сколько выполняется по времени?
10 heavenly
 
10.11.11
13:59
(8) работа запроса опять-таки в контексте вывода в список заказов.
11 heavenly
 
10.11.11
19:29
(8)???
12 heavenly
 
17.11.11
20:41
(8) 100 рублей на телефон за увеличение скорости выполнения хотя бы на 25% ;)