Имя: Пароль:
1C
1С v8
Помощь в оптимизации кода.
0 Март_1c
 
05.02.13
12:41
Помогите в оптимизации следующего кода для Ут.Данное решение существенно замедляет вывод Журнала Заказов ((((. Журнал Заказов - формаСписка - Добавлена колонка Сумма_К - заполнение при выводе строки.

Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   
   Если ТипЗнч(ДанныеСтроки.Ссылка) = Тип("ДокументСсылка.ЗаказПокупателя")и ДанныеСтроки.Ссылка.Проведен = Истина  Тогда
       
   Запрос = Новый Запрос;
   Запрос.Текст =  
   "ВЫБРАТЬ
   |    ЗаказыПокупателей.Регистратор КАК Регистратор,
   |    ЗаказыПокупателей.Номенклатура КАК Номенклатура,
   |    ЗаказыПокупателей.Количество КАК Количество,
   |    ЗаказыПокупателей.Цена КАК Цена,
   |    ЗаказыПокупателей.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов
   |ПОМЕСТИТЬ Вт_Корректировка
   |ИЗ
   |    РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
   |ГДЕ
   |    ЗаказыПокупателей.Регистратор.ЗаказПокупателя = &Регистратор
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ЗаказыПокупателей.Регистратор,
   |    ЗаказыПокупателей.Номенклатура,
   |    ЗаказыПокупателей.Количество,
   |    ЗаказыПокупателей.Цена,
   |    ЗаказыПокупателей.СуммаВзаиморасчетов
   |ПОМЕСТИТЬ Вт_Исходник
   |ИЗ
   |    РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
   |ГДЕ
   |    ЗаказыПокупателей.Регистратор = &Регистратор
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    Группировка_без_регистратора.Номенклатура,
   |    СУММА(Группировка_без_регистратора.Количество) КАК Количество,
   |    СУММА(Группировка_без_регистратора.Цена) КАК Цена,
   |    СУММА(Группировка_без_регистратора.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов
   |ИЗ
   |    (ВЫБРАТЬ
   |        Вт_Корректировка.Номенклатура КАК Номенклатура,
   |        Вт_Корректировка.Количество КАК Количество,
   |        Вт_Корректировка.Цена КАК Цена,
   |        Вт_Корректировка.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов
   |    ИЗ
   |        Вт_Корректировка КАК Вт_Корректировка
   |    
   |    ОБЪЕДИНИТЬ ВСЕ
   |    
   |    ВЫБРАТЬ
   |        Вт_Исходник.Номенклатура,
   |        Вт_Исходник.Количество,
   |        Вт_Исходник.Цена,
   |        Вт_Исходник.СуммаВзаиморасчетов
   |    ИЗ
   |        Вт_Исходник КАК Вт_Исходник) КАК Группировка_без_регистратора
   |
   |СГРУППИРОВАТЬ ПО
   |    Группировка_без_регистратора.Номенклатура
   |ИТОГИ
   |    СУММА(СуммаВзаиморасчетов)
   |ПО
   |    ОБЩИЕ";

   Запрос.УстановитьПараметр("Регистратор" ,ДанныеСтроки.Ссылка) ;

   Попытка
   Результат = Запрос.Выполнить().Выгрузить().Получить(0).СуммаВзаиморасчетов;
       
   
   ОформлениеСтроки.Ячейки.Сумма_К.УстановитьТекст(Строка(Результат));
   //ОформлениеСтроки.Ячейки.Сумма_К.ОтображатьТекст = Истина ;
   Исключение
   КонецПопытки;
   
КонецЕсли;
КонецПроцедуры
1 Ёпрст
 
05.02.13
12:42
В ПриПолученииДанных выполняй свой запрос с условием на список..
2 Лефмихалыч
 
05.02.13
12:42
При получении данных это делается
3 Ёпрст
 
05.02.13
12:43
а так то, зачет.. для каждой строки свой запрос с кучей временных табличек.
4 Ёпрст
 
05.02.13
12:44
ну и два раза зачет, это получение кучу полей в запросе, когда в итоге нужна только СуммаВзаиморасчетов.
5 AaNnDdRrEeYy
 
05.02.13
12:44
зачем две одинаковые временные таблицы?
Вт_Корректировка и Вт_Исходник
6 Ёпрст
 
05.02.13
12:44
как бэ, всё в топку.
7 Reset
 
05.02.13
12:45
Использовать виртуальные, а не физические таблицы + (1)(2)
8 AaNnDdRrEeYy
 
05.02.13
12:45
а вообще сделай реквизит в документе и заполняй его этими данными перед записью документа, вообще летать будет.
9 Килограмм
 
05.02.13
12:47
(8) - самый годный вариант. Это проще, чем осмыслять и перелапачивать весь этот код
10 Килограмм
 
05.02.13
12:48
Запрос в ПриВыводеСтроки это как запрос в цикле, только гораздо извращенней.
11 AaNnDdRrEeYy
 
05.02.13
12:52
в типовых это уже есть, реквизит называется СуммаДокумента в ней тупо итог по колонке сумма в таб части. Очень облегчает написание отчетов
12 Март_1c
 
05.02.13
12:53
Можно подробнее описать идею с выполнением когда в процедуре ПриПолученииДанных ?
13 Март_1c
 
05.02.13
20:06
Всем Спс за участие. Может кому то будет полезно .
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
   Попытка
       Для  Каждого Стр из ОформленияСтрок Цикл
           
           Если ТипЗнч(Стр.ДанныеСтроки.Ссылка) = Тип("ДокументСсылка.ЗаказПокупателя")и Стр.ДанныеСтроки.Ссылка.Проведен = Истина  Тогда
               
               Запрос = Новый Запрос;
               Запрос.Текст =  
               "ВЫБРАТЬ
               |    ЗаказыПокупателей.Регистратор КАК Регистратор,
               |    ЗаказыПокупателей.Номенклатура КАК Номенклатура,
               |    ЗаказыПокупателей.Количество КАК Количество,
               |    ЗаказыПокупателей.Цена КАК Цена,
               |    ЗаказыПокупателей.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов
               |ПОМЕСТИТЬ Вт_Корректировка
               |ИЗ
               |    РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
               |ГДЕ
               |    ЗаказыПокупателей.Регистратор.ЗаказПокупателя = &Регистратор
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               |    ЗаказыПокупателей.Регистратор,
               |    ЗаказыПокупателей.Номенклатура,
               |    ЗаказыПокупателей.Количество,
               |    ЗаказыПокупателей.Цена,
               |    ЗаказыПокупателей.СуммаВзаиморасчетов
               |ПОМЕСТИТЬ Вт_Исходник
               |ИЗ
               |    РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
               |ГДЕ
               |    ЗаказыПокупателей.Регистратор = &Регистратор
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               |    Группировка_без_регистратора.Номенклатура,
               |    СУММА(Группировка_без_регистратора.Количество) КАК Количество,
               |    СУММА(Группировка_без_регистратора.Цена) КАК Цена,
               |    СУММА(Группировка_без_регистратора.СуммаВзаиморасчетов) КАК СуммаВзаиморасчетов
               |ИЗ
               |    (ВЫБРАТЬ
               |        Вт_Корректировка.Номенклатура КАК Номенклатура,
               |        Вт_Корректировка.Количество КАК Количество,
               |        Вт_Корректировка.Цена КАК Цена,
               |        Вт_Корректировка.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов
               |    ИЗ
               |        Вт_Корректировка КАК Вт_Корректировка
               |    
               |    ОБЪЕДИНИТЬ ВСЕ
               |    
               |    ВЫБРАТЬ
               |        Вт_Исходник.Номенклатура,
               |        Вт_Исходник.Количество,
               |        Вт_Исходник.Цена,
               |        Вт_Исходник.СуммаВзаиморасчетов
               |    ИЗ
               |        Вт_Исходник КАК Вт_Исходник) КАК Группировка_без_регистратора
               |
               |СГРУППИРОВАТЬ ПО
               |    Группировка_без_регистратора.Номенклатура
               |ИТОГИ
               |    СУММА(СуммаВзаиморасчетов)
               |ПО
               |    ОБЩИЕ";
               
               Запрос.УстановитьПараметр("Регистратор" ,Стр.ДанныеСтроки.Ссылка) ;
               
               Результат = Запрос.Выполнить().Выгрузить().Получить(0).СуммаВзаиморасчетов;
               
               
               Если Не Стр.ДанныеСтроки.Сумма = Результат
                   Тогда
                   Стр.Ячейки.Сумма_К.Текст=Результат;
                   Стр.Ячейки.Сумма_К.ОтображатьТекст = Истина ;
               Иначе
                   продолжить
               Конецесли;
           КонецЕсли;
       КонецЦикла;
   Исключение
       Сообщить("При вычислении Суммы с учетом корректировок произошла ошибка.") ;
   КонецПопытки;
КонецПроцедуры
14 Bober
 
05.02.13
20:09
(13)
- Стр.ДанныеСтроки.Ссылка.Проведен - заменить на Стр.ДанныеСтроки.Проведен
 - заменить сумашедший запрос в цикле на один
15 Bober
 
05.02.13
20:11
(13)

|ГДЕ
|    ЗаказыПокупателей.Регистратор.ЗаказПокупателя = &Регистратор

Совсем туго с виртуальными таблицами?
замени хоть на

|ГДЕ
|    ЗаказыПокупателей.ЗаказПокупателя = &Регистратор
|    И ЗаказыПокупателей.Активность
|    И Не ЗаказыПокупателей.Регистратор Ссылка Документ.ЗаказПокупателя
16 Bober
 
05.02.13
20:13
(13) странно, что значение из запроса тебя не напрягает (что она больше сумма документа заказа клиента)
Независимо от того, куда вы едете — это в гору и против ветра!