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