|
Нужен совет как ускорить работу данного отчета | ☑ | ||
---|---|---|---|---|
0
ColibriModern
27.06.18
✎
09:26
|
Добрый день, есть вот такой отчет, требуется его ускорить ибо долго собирается и клиент требует более быстрой работы. Вот такая вот портянка, заранее спасибо.
ПЫ.СЫ прошу тапками не кидаться я не так давно занялся 1с и в частности программированием и если сможете объяснить простым языком буду очень благодарен Процедура ПоСтатьямЗатрат(ТабДок,Дата1,Дата2) Экспорт Макет=ОтчетОбъект.ПолучитьМакет("ПоСтатьямЗатрат"); Дол=Справочники.Валюты.НайтиПоКоду("840"); ТЗ=Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Дат"); ТЗ.Колонки.Добавить("Группа"); ТЗ.Колонки.Добавить("СтЗатрат"); ТЗ.Колонки.Добавить("Сумма"); //------------------------------------------------------------------------------------------------------------------------ ВыборкаДокументов=Документы.ПоступлениеТоваровУслуг.Выбрать(Дата1,КонецДня(Дата2)); Пока ВыборкаДокументов.Следующий() Цикл Если ПустаяСтрока(ВыборкаДокументов.Группа) Тогда Продолжить; КонецЕсли; Если Строка(ВыборкаДокументов.Группа)="Администрация" Тогда Продолжить; КонецЕсли; Для Каждого ТекСтр Из ВыборкаДокументов.Услуги Цикл НовСтр=ТЗ.Добавить(); НовСтр.Дат=ВыборкаДокументов.Дата; НовСтр.Группа=ВыборкаДокументов.Группа; Если ТекСтр.СчетЗатрат.Родитель=ПланыСчетов.Хозрасчетный.СчетаУчетаРасходовПериода ИЛИ ТекСтр.СчетЗатрат=ПланыСчетов.Хозрасчетный.ОбщепроизводственныеРасходы Тогда НовСтр.СтЗатрат=ТекСтр.Субконто2; ИначеЕсли ТекСтр.СчетЗатрат=ПланыСчетов.Хозрасчетный.ОсновноеПроизводство Тогда НовСтр.СтЗатрат=ТекСтр.Субконто3; КонецЕсли; Если ВыборкаДокументов.ДоговорКонтрагента.ВалютаВзаиморасчетов=Дол Тогда НовСтр.Сумма=Число(ТекСтр.Сумма)*ОбщегоНазначения.ПолучитьКурсВалюты(Дол,ВыборкаДокументов.Дата).Курс; Иначе НовСтр.Сумма=Число(ТекСтр.Сумма); КонецЕсли; КонецЦикла; КонецЦикла; //-------------------------------------------------------------------------------------------------------------------------------------------------------------- ТЗ.Свернуть("Группа,СтЗатрат","Сумма"); ТЗ.Сортировать("Группа"); ТЗСтЗат=ТЗ.Скопировать(); ТЗСтЗат.Свернуть("СтЗатрат","Сумма"); ТЗГр=ТЗ.Скопировать(); ТЗГр.Свернуть("Группа","Сумма"); ОбластьШапка=Макет.ПолучитьОбласть("ШапкаТаблицы|Область1"); ОбластьШапкаСтЗат=Макет.ПолучитьОбласть("ШапкаТаблицы|Область2"); ОбластьШапкаИтог=Макет.ПолучитьОбласть("ШапкаТаблицы|Область6"); ТабДок.Очистить(); ТабДок.Вывести(ОбластьШапка); Для Каждого ТекСтр Из ТЗСтЗат Цикл ОбластьШапкаСтЗат.Параметры.СтЗат=ТекСтр.СтЗатрат ; ТабДок.Присоединить(ОбластьШапкаСтЗат); КонецЦикла; ТабДок.Присоединить(ОбластьШапкаИтог); ОбластьДетали=Макет.ПолучитьОбласть("Детали|Область3"); ОбластьДеталиСтЗат=Макет.ПолучитьОбласть("Детали|Область4"); ОбластьИтогГруппа=Макет.ПолучитьОбласть("Детали|Область5"); Для Каждого ТекСтр1 Из ТЗГр Цикл ОбластьДетали.Параметры.Группа=ТекСтр1.Группа; ТабДок.Вывести(ОбластьДетали); Для Каждого ТекСтр2 Из ТЗСтЗат Цикл ОбластьДеталиСтЗат.Параметры.Сумма=0; Для Каждого ТекСтр3 Из ТЗ Цикл Если (ТекСтр3.Группа=ТекСтр1.Группа) И (ТекСтр3.СтЗатрат=ТекСтр2.СтЗатрат) Тогда Сум=ТекСтр3.Сумма; Если Сум>0 Тогда ОбластьДеталиСтЗат.Параметры.Сумма=Сум; Иначе ОбластьДеталиСтЗат.Параметры.Сумма=0; КонецЕсли; Продолжить; КонецЕсли; КонецЦикла; ТабДок.Присоединить(ОбластьДеталиСтЗат); КонецЦикла; ОбластьИтогГруппа.Параметры.ИтогГруппа=ТекСтр1.Сумма; ТабДок.Присоединить(ОбластьИтогГруппа); КонецЦикла; ОбластьПодвалТаблицы=Макет.ПолучитьОбласть("ПодвалТаблицы|Область3"); ОбластьПодвалТаблицыСтЗат=Макет.ПолучитьОбласть("ПодвалТаблицы|Область4"); ТабДок.Вывести(ОбластьПодвалТаблицы); Для Каждого ТекСтр2 Из ТЗСтЗат Цикл ОбластьПодвалТаблицыСтЗат.Параметры.ИтогСумма=ТекСтр2.Сумма; ТабДок.Присоединить(ОбластьПодвалТаблицыСтЗат); КонецЦикла; ОбластьИтогВсего=Макет.ПолучитьОбласть("ПодвалТаблицы|Область5"); ОбластьИтогВсего.Параметры.ИтогВсего=ТЗ.Итог("Сумма"); ТабДок.Присоединить(ОбластьИтогВсего); ТабДок.Показать(); |
|||
1
фросия
27.06.18
✎
09:28
|
вместо выборки использовать запрос?
|
|||
2
zak555
27.06.18
✎
09:30
|
Вместо документов использовать регистры
|
|||
3
d4rkmesa
27.06.18
✎
09:32
|
(0) Хехе, но согласитесь, тапками было бы вполне заслуженно.
|
|||
4
bolobol
27.06.18
✎
10:07
|
Сойти со схемы 7.7, использовать 8
|
|||
5
bolobol
27.06.18
✎
10:07
|
Там даже СКД есть - аналог кнопки "Сделать всё"
|
|||
6
mehfk
27.06.18
✎
10:09
|
(0) Спасибо, поблевал.
|
|||
7
ptiz
27.06.18
✎
10:12
|
(0) Запросы. Про выборки (в данном случае) - забыть. Про СокрЛП() и сравнение наименований - забыть.
|
|||
8
ColibriModern
27.06.18
✎
11:24
|
Ну на счет тапок я и сам согласен, знаний у меня ноль, вот и узнаю у людей знающих, попробовал запросом , получилось криво, спецы на работе помогли и на скд составил адекватный отчет
ВЫБРАТЬ ВЫБОР КОГДА ХозрасчетныйОбороты.Счет В ИЕРАРХИИ (&Счет94) ТОГДА ХозрасчетныйОбороты.Субконто2 ИНАЧЕ ХозрасчетныйОбороты.Субконто3 КОНЕЦ КАК СтатьяЗатрат, ХозрасчетныйОбороты.Регистратор.Группа КАК Группа, ХозрасчетныйОбороты.СуммаОборот КАК Сумма, ХозрасчетныйОбороты.Регистратор ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(&Начало, &Конец, Авто, Счет В ИЕРАРХИИ (&Счет94, &Счет20), , , , ) КАК ХозрасчетныйОбороты ГДЕ НЕ ХозрасчетныйОбороты.Регистратор.Группа ЕСТЬ NULL |
|||
9
los_hooliganos
27.06.18
✎
11:29
|
(8) Это запрос из СКД?
|
|||
10
DrShad
27.06.18
✎
11:30
|
(8) срочно сжечь этот запрос вместе с тем кто его писал
|
|||
11
Borteg
27.06.18
✎
12:03
|
(8) жесть
|
|||
12
breezee
27.06.18
✎
12:11
|
(8) ОЙ-ой ой. У вас этот Счет В ИЕРАРХИИ все к херам повешает. Надо в 1 запросе выбать все по 94 счету, во втором по 20 счету и через ОБЪЕДИНИТЬ ВСЕ объединить результат
|
|||
13
novichok79
27.06.18
✎
12:31
|
(0) пахнет как 7.7,
это ВыборкаДокументов=Документы.ПоступлениеТоваровУслуг.Выбрать(Дата1,КонецДня(Дата2)); Пока ВыборкаДокументов.Следующий() Цикл Если ПустаяСтрока(ВыборкаДокументов.Группа) Тогда Продолжить; КонецЕсли; Если Строка(ВыборкаДокументов.Группа)="Администрация" Тогда Продолжить; КонецЕсли; можно заменить запросом это ВЫБРАТЬ ВЫБОР КОГДА ХозрасчетныйОбороты.Счет В ИЕРАРХИИ (&Счет94) ТОГДА ХозрасчетныйОбороты.Субконто2 ИНАЧЕ ХозрасчетныйОбороты.Субконто3 КОНЕЦ КАК СтатьяЗатрат, ХозрасчетныйОбороты.Регистратор.Группа КАК Группа, ХозрасчетныйОбороты.СуммаОборот КАК Сумма, ХозрасчетныйОбороты.Регистратор ИЗ РегистрБухгалтерии.Хозрасчетный.Обороты(&Начало, &Конец, Авто, Счет В ИЕРАРХИИ (&Счет94, &Счет20), , , , ) КАК ХозрасчетныйОбороты ГДЕ НЕ ХозрасчетныйОбороты.Регистратор.Группа ЕСТЬ NULL заменить на объединенную выборку по счет94 и счет20 в каждом из подзапросов установить параметр "ВидыСубконто" и объединение двух запросов "спецам на работе" за выдергивание полей из регистраторов надо выдергивать ногти - там же присоединится over дофуя таблиц, чтобы нужные поля вытащить. |
|||
14
ildary
27.06.18
✎
12:44
|
(13) поясните пожалуйста новичку, какая альтернатива выдергиванию полей из регистратора? Кроме как его принудительная типизация в запросе?
|
|||
15
novichok79
27.06.18
✎
12:50
|
(14) да альтернативы нет, только если отдельно вытаскивать из таблиц, по сути - повторять то же самое, что сделает платформа при обращении через точку. при проектировке такие поля надо в измерения выводить. но в (0) там только поступления, так что я бы отдельно такие поля вытащил во временную таблицу, а потом соединял с основной.
|
|||
16
sergeyshik
27.06.18
✎
12:50
|
(12) Зачем объединение городить? Можно же задать параметр субконто у виртуальной таблицы оборотов?
|
|||
17
novichok79
27.06.18
✎
12:51
|
(16) это если субконто есть в обоих счетах, иначе при указании несуществующих субконто запрос вернет пустую таблицу.
|
|||
18
youalex
27.06.18
✎
12:58
|
(16)
тут , похоже, ТС через ВЫБОР пытается достать одно и то же субконто с разных счетов, так что.. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |