|
Оптимизация кода (обычное приложение) | ☑ | ||
---|---|---|---|---|
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) монописсально, сам то как думаешь?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |