Имя: Пароль:
1C
1С v8
Оптимизация кода (обычное приложение)
0 ErrorEd88
 
14.09.11
17:46
ShitКод рабочий. Но отчет формируется очень медленно, если в конфу введено много документов. Отчет выводит номенклатуру с детализацией по складам (по одному выбранному или всем) и по документам поступления (если поставлена галочка Расшифровка).

Процедура КнопкаСформироватьНажатие(Кнопка)
ЭлементыФормы.Результат.Очистить();
Запрос=Новый Запрос;
Запрос.УстановитьПараметр("Период", КонецДня(ЭтотОбъект.Дата));
Запрос.УстановитьПараметр("Организация", ЭтотОбъект.Организация);
Запрос.УстановитьПараметр("Склад", ЭтотОбъект.Склад);
Запрос.УстановитьПараметр("Номенклатура", ЭтотОбъект.Номенклатура);
Запрос.Текст="ВЫБРАТЬ
|    ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
|    ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) КАК Количество,
|    ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстаток, 0) КАК Сумма,
|    ХозрасчетныйОстатки.Субконто2 КАК Склад,
|    ХозрасчетныйОстатки.Субконто1.БазоваяЕдиницаИзмерения КАК Единица
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный.Остатки(
|            &Период,
|Счет.Родитель = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)
|ИЛИ Счет.Родитель = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы)
|ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ГотоваяПродукция),
|,
|Организация = &Организация
|" + ?(ЗначениеЗаполнено(ЭтотОбъект.Склад), "И (Субконто1 = &Склад ИЛИ Субконто2 = &Склад ИЛИ Субконто3 = &Склад)", "") + "
|" + ?(ЗначениеЗаполнено(ЭтотОбъект.Номенклатура), "И (Субконто1 = &Номенклатура Или Субконто1.Родитель = &Номенклатура)", "") + ") КАК ХозрасчетныйОстатки
|
|УПОРЯДОЧИТЬ ПО
|ХозрасчетныйОстатки.Субконто1
|АВТОУПОРЯДОЧИВАНИЕ";
   
Выборка=Запрос.Выполнить().Выбрать();
ТабДокумент = Новый ТабличныйДокумент;
   
Макет = ПолучитьМакет("СведенияОстатковТМЦ");                  
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ОбластьМакета.Параметры.Дата = Формат(ЭтотОбъект.Дата, "ДФ=dd.MM.yy");
ТабДокумент.Вывести(ОбластьМакета);

//Строка
ОбластьМакетаСтрока = Макет.ПолучитьОбласть("Строка");
Сч = 0;
ИтогоСумма=0;                                                                        Склады = Неопределено;
Субк = Неопределено;
   
Пока Выборка.Следующий() Цикл
       
Если ЗначениеЗаполнено(ЭтотОбъект.Склад) Тогда
           
 Сч=Сч+1;

  Если Сч < 2 Тогда
   ОбластьМакетаСтрока.Параметры.Склад = Выборка.Склад;
  Иначе ОбластьМакетаСтрока.Параметры.Склад = Неопределено;
  КонецЕсли;

  ОбластьМакетаСтрока.Параметры.НомерСтроки = Сч;
  ОбластьМакетаСтрока.Параметры.Номенклатура = Выборка.Номенклатура;
  ОбластьМакетаСтрока.Параметры.Единица = Выборка.Единица;
  ОбластьМакетаСтрока.Параметры.Количество = Выборка.Количество;
  ОбластьМакетаСтрока.Параметры.Сумма = Выборка.Сумма;
  ОбластьМакетаСтрока.Параметры.Примечание = Неопределено;
  ИтогоСумма = ИтогоСумма + Выборка.Сумма;
               
  ТабДокумент.Вывести(ОбластьМакетаСтрока);
 
//Расшифровка
 Если Субк <> Выборка.Номенклатура Тогда
  Субк = Выборка.Номенклатура;
               
   Если ЭтотОбъект.РасшифровкаПриход = Истина Тогда
    ЗапросРасш = Новый Запрос;
    ЗапросРасш.УстановитьПараметр("Субконто", Выборка.Номенклатура.Ссылка);
    ЗапросРасш.УстановитьПараметр("Период", КонецДня(Дата));
    ЗапросРасш.УстановитьПараметр("Организация", Организация);
    ЗапросРасш.УстановитьПараметр("Склад", ЭтотОбъект.Склад);
    ЗапросРасш.Текст = "ВЫБРАТЬ
   |    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
   |    ПоступлениеТоваровУслугТовары.Количество КАК Количество,
   |    ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
   |    ПоступлениеТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
   |    ПоступлениеТоваровУслугТовары.Ссылка.ДоговорКонтрагента КАК Договор,
   |    ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК ДатаДок
   |ИЗ
   |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
   |ГДЕ
   |    ПоступлениеТоваровУслугТовары.Ссылка.Дата <= &Период
   |    И ПоступлениеТоваровУслугТовары.Номенклатура = &Субконто
   |    И ПоступлениеТоваровУслугТовары.Ссылка.Склад = &Склад";
ВыборкаРасш = ЗапросРасш.Выполнить().Выбрать();
                   
Пока ВыборкаРасш.Следующий() Цикл
                           ОбластьМакетаСтрока.Параметры.Склад = Неопределено;                        ОбластьМакетаСтрока.Параметры.Номенклатура = Неопределено;                        ОбластьМакетаСтрока.Параметры.Единица = Неопределено;                        ОбластьМакетаСтрока.Параметры.Количество = ВыборкаРасш.Количество;                        ОбластьМакетаСтрока.Параметры.Сумма = ВыборкаРасш.Сумма;                        ОбластьМакетаСтрока.Параметры.Примечание = Строка(ВыборкаРасш.Контрагент) + ", " + ВыборкаРасш.Договор + ", от " + Формат(ВыборкаРасш.ДатаДок,"ДФ=dd.MM.yy");                        ОбластьМакетаСтрока.Область(строка(Сред(ОбластьМакетаСтрока.ТекущаяОбласть.Имя, 1, 3)+"2")+":"+строка(Сред(ОбластьМакетаСтрока.ТекущаяОбласть.Имя, 1, 3)+"44")).ЦветФона = Webцвета.ЗамшаСветлый;
ТабДокумент.Вывести(ОбластьМакетаСтрока);
                   
КонецЦикла;

КонецЕсли;
           
КонецЕсли;                
           
Иначе
           
//По всем складам
Если Выборка.Склад <> Склады Тогда
 Склады = Выборка.Склад;
 ЗапросСклад = Новый Запрос;
 ЗапросСклад.УстановитьПараметр("Период", КонецДня(ЭтотОбъект.Дата));
 ЗапросСклад.УстановитьПараметр("Организация", Организация);
 ЗапросСклад.УстановитьПараметр("Склад", Выборка.Склад);
 ЗапросСклад.УстановитьПараметр("Номенклатура", Номенклатура);
 ЗапросСклад.Текст = "ВЫБРАТЬ
 |    ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
 |    ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) КАК Количество,
 |    ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстаток, 0) КАК Сумма,
 |    ХозрасчетныйОстатки.Субконто2 КАК Склад,
 |    ХозрасчетныйОстатки.Субконто1.БазоваяЕдиницаИзмерения КАК Единица
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Период,
| Счет.Родитель = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)
| ИЛИ Счет.Родитель = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ГотоваяПродукция),
| ,
| Организация = &Организация
| И Субконто2 = &Склад
| " + ?(ЗначениеЗаполнено(ЭтотОбъект.Номенклатура), "И (Субконто1 = &Номенклатура Или Субконто1.Родитель = &Номенклатура)", "") + ") КАК ХозрасчетныйОстатки
|
|УПОРЯДОЧИТЬ ПО
|ХозрасчетныйОстатки.Субконто1
|АВТОУПОРЯДОЧИВАНИЕ";
ВыборкаСклад = ЗапросСклад.Выполнить().Выбрать();
               
СчСклад=0;
ИтогоСумма = 0;
Пока ВыборкаСклад.Следующий() Цикл
                   
 СчСклад = СчСклад + 1;

  Если СчСклад = 1 Тогда
   ОбластьМакетаСтрока.Параметры.Склад = ВыборкаСклад.Склад;
  Иначе ОбластьМакетаСтрока.Параметры.Склад = Неопределено;
  КонецЕсли;
                   ОбластьМакетаСтрока.Параметры.НомерСтроки = СчСклад;                ОбластьМакетаСтрока.Параметры.Номенклатура = ВыборкаСклад.Номенклатура;                    ОбластьМакетаСтрока.Параметры.Единица = ВыборкаСклад.Единица;                    ОбластьМакетаСтрока.Параметры.Количество = ВыборкаСклад.Количество;                    ОбластьМакетаСтрока.Параметры.Сумма = ВыборкаСклад.Сумма;                    ОбластьМакетаСтрока.Параметры.Примечание = Неопределено;
ИтогоСумма = ИтогоСумма + ВыборкаСклад.Сумма;
                   
ТабДокумент.Вывести(ОбластьМакетаСтрока);
                   
//Расшифровка (со всеми складам)
Если Субк <> ВыборкаСклад.Номенклатура Тогда
Субк = ВыборкаСклад.Номенклатура;
                       
 Если ЭтотОбъект.РасшифровкаПриход = Истина Тогда
 ЗапросРасш = Новый Запрос;
 ЗапросРасш.УстановитьПараметр("Субконто", ВыборкаСклад.Номенклатура.Ссылка);
 ЗапросРасш.УстановитьПараметр("Период", КонецДня(ЭтотОбъект.Дата));
 ЗапросРасш.УстановитьПараметр("Организация", Организация);
 ЗапросРасш.УстановитьПараметр("Склад", ВыборкаСклад.Склад);
 ЗапросРасш.Текст = "ВЫБРАТЬ
 |    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
 |    ПоступлениеТоваровУслугТовары.Количество КАК Количество,
 |    ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
 |    ПоступлениеТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
 |    ПоступлениеТоваровУслугТовары.Ссылка.ДоговорКонтрагента КАК Договор,
 |    ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК ДатаДок
 |ИЗ
 |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
|ГДЕ
|    ПоступлениеТоваровУслугТовары.Ссылка.Дата <= &Период
|    И ПоступлениеТоваровУслугТовары.Номенклатура = &Субконто
|    И ПоступлениеТоваровУслугТовары.Ссылка.Склад = &Склад";
ВыборкаРасш = ЗапросРасш.Выполнить().Выбрать();
                           
Пока ВыборкаРасш.Следующий() Цикл
                               ОбластьМакетаСтрока.Параметры.Склад = Неопределено;                        ОбластьМакетаСтрока.Параметры.Номенклатура = Неопределено;                            ОбластьМакетаСтрока.Параметры.Единица = Неопределено;                                ОбластьМакетаСтрока.Параметры.Количество = ВыборкаРасш.Количество;                                ОбластьМакетаСтрока.Параметры.Сумма = ВыборкаРасш.Сумма;                                ОбластьМакетаСтрока.Параметры.Примечание = Строка(ВыборкаРасш.Контрагент) + ", " + ВыборкаРасш.Договор + ", от " + Формат(ВыборкаРасш.ДатаДок,"ДФ=dd.MM.yy");                                ОбластьМакетаСтрока.Область(строка(Сред(ОбластьМакетаСтрока.ТекущаяОбласть.Имя, 1, 3)+"2")+":"+строка(Сред(ОбластьМакетаСтрока.ТекущаяОбласть.Имя, 1, 3)+"44")).ЦветФона = Webцвета.ЗамшаСветлый;                            ТабДокумент.Вывести(ОбластьМакетаСтрока);
               
КонецЦикла;
                           
КонецЕсли;

КонецЕсли;    
                   
КонецЦикла;

ОбластьМакетаИтого = Макет.ПолучитьОбласть("Итого");                ОбластьМакетаИтого.Параметры.ИтогоСумма = ИтогоСумма;
ТабДокумент.Вывести(ОбластьМакетаИтого);
               
КонецЕсли;

КонецЕсли;    

КонецЦикла;
   
Если ЗначениеЗаполнено(Склад) Тогда
ОбластьМакетаИтого = Макет.ПолучитьОбласть("Итого");
ОбластьМакетаИтого.Параметры.ИтогоСумма = ИтогоСумма;
ТабДокумент.Вывести(ОбластьМакетаИтого);
КонецЕсли;
   
ЭлементыФормы.Результат.Вывести(ТабДокумент);

КонецПроцедуры
1 mikecool
 
14.09.11
17:47
много буков, не осилил (
2 ErrorEd88
 
14.09.11
17:49
(1) Не важно, думаю разберусь. Тему для успокоения души создал.
3 Realist_x1
 
14.09.11
17:50
Запрос в цикле не есть гуд.
4 sergeante
 
14.09.11
17:51
Ну запросы в циклах, кагбэ...
5 ErrorEd88
 
14.09.11
18:01
Если сделаю функцию, в которой будет запрос, а потом пропишу её в процедуре - будет быстрей или также?
6 acsent
 
14.09.11
18:03
Субконто1.Родитель - очень суровый косяк
7 sergeante
 
14.09.11
18:25
кстати (6) дело говорит, там неебическое кол-во неявных соединений появляется
8 sergeante
 
14.09.11
18:26
(5) монописсально, сам то как думаешь?
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн