Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Нужен совет как ускорить работу данного отчета

Нужен совет как ускорить работу данного отчета
Я
   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
вместо выборки использовать запрос?
   zak555
 
2 - 27.06.18 - 09:30
Вместо документов использовать регистры
   d4rkmesa
 
3 - 27.06.18 - 09:32
(0) Хехе, но согласитесь, тапками было бы вполне заслуженно.
   bolobol
 
4 - 27.06.18 - 10:07
Сойти со схемы 7.7, использовать 8
   bolobol
 
5 - 27.06.18 - 10:07
Там даже СКД есть - аналог кнопки "Сделать всё"
   mehfk
 
6 - 27.06.18 - 10:09
(0) Спасибо, поблевал.
   ptiz
 
7 - 27.06.18 - 10:12
(0) Запросы. Про выборки (в данном случае) - забыть. Про СокрЛП() и сравнение наименований - забыть.
   ColibriModern
 
8 - 27.06.18 - 11:24
Ну на счет тапок я и сам согласен, знаний у меня ноль, вот и узнаю у людей знающих, попробовал запросом , получилось криво, спецы на работе помогли и на скд составил адекватный отчет

ВЫБРАТЬ
    ВЫБОР
        КОГДА ХозрасчетныйОбороты.Счет В ИЕРАРХИИ (&Счет94)
            ТОГДА ХозрасчетныйОбороты.Субконто2
        ИНАЧЕ ХозрасчетныйОбороты.Субконто3
    КОНЕЦ КАК СтатьяЗатрат,
    ХозрасчетныйОбороты.Регистратор.Группа КАК Группа,
    ХозрасчетныйОбороты.СуммаОборот КАК Сумма,
    ХозрасчетныйОбороты.Регистратор
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&Начало, &Конец, Авто, Счет В ИЕРАРХИИ (&Счет94, &Счет20), , , , ) КАК ХозрасчетныйОбороты
ГДЕ
    НЕ ХозрасчетныйОбороты.Регистратор.Группа ЕСТЬ NULL
   los_hooliganos
 
9 - 27.06.18 - 11:29
(8) Это запрос из СКД?
   DrShad
 
10 - 27.06.18 - 11:30
(8) срочно сжечь этот запрос вместе с тем кто его писал
 
 Рекламное место пустует
   Borteg
 
11 - 27.06.18 - 12:03
(8) жесть
   breezee
 
12 - 27.06.18 - 12:11
(8) ОЙ-ой ой. У вас этот Счет В ИЕРАРХИИ все к херам повешает. Надо в 1 запросе выбать все по 94 счету, во втором по 20 счету и через ОБЪЕДИНИТЬ ВСЕ объединить результат
   novichok79
 
13 - 27.06.18 - 12:31
(0) пахнет как 7.7,    
это

ВыборкаДокументов=Документы.ПоступлениеТоваровУслуг.Выбрать(Дата1,КонецДня(Дата2)); 
    Пока ВыборкаДокументов.Следующий() Цикл 
        Если ПустаяСтрока(ВыборкаДокументов.Группа) Тогда
            Продолжить;
        КонецЕсли;
        Если Строка(ВыборкаДокументов.Группа)="Администрация" Тогда
            Продолжить;
        КонецЕсли;   

можно заменить запросом

это

ВЫБРАТЬ
    ВЫБОР
        КОГДА ХозрасчетныйОбороты.Счет В ИЕРАРХИИ (&Счет94)
            ТОГДА ХозрасчетныйОбороты.Субконто2
        ИНАЧЕ ХозрасчетныйОбороты.Субконто3
    КОНЕЦ КАК СтатьяЗатрат,
    ХозрасчетныйОбороты.Регистратор.Группа КАК Группа,
    ХозрасчетныйОбороты.СуммаОборот КАК Сумма,
    ХозрасчетныйОбороты.Регистратор
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&Начало, &Конец, Авто, Счет В ИЕРАРХИИ (&Счет94, &Счет20), , , , ) КАК ХозрасчетныйОбороты
ГДЕ
    НЕ ХозрасчетныйОбороты.Регистратор.Группа ЕСТЬ NULL

заменить на объединенную выборку по счет94 и счет20
в каждом из подзапросов установить параметр "ВидыСубконто" и объединение двух запросов

"спецам на работе" за выдергивание полей из регистраторов надо выдергивать ногти - там же присоединится over дофуя таблиц, чтобы нужные поля вытащить.
   ildary
 
14 - 27.06.18 - 12:44
(13) поясните пожалуйста новичку, какая альтернатива выдергиванию полей из регистратора? Кроме как его принудительная типизация в запросе?
   novichok79
 
15 - 27.06.18 - 12:50
(14) да альтернативы нет, только если отдельно вытаскивать из таблиц, по сути - повторять то же самое, что сделает платформа при обращении через точку. при проектировке такие поля надо в измерения выводить. но в (0) там только поступления, так что я бы отдельно такие поля вытащил во временную таблицу, а потом соединял с основной.
   sergeyshik
 
16 - 27.06.18 - 12:50
(12) Зачем объединение городить? Можно же задать параметр субконто у виртуальной таблицы оборотов?
   novichok79
 
17 - 27.06.18 - 12:51
(16) это если субконто есть в обоих счетах, иначе при указании несуществующих субконто запрос вернет пустую таблицу.
   youalex
 
18 - 27.06.18 - 12:58
(16)
тут , похоже,  ТС через ВЫБОР пытается достать одно и то же субконто с разных счетов, так что..

Список тем форума
Рекламное место пустует  Рекламное место пустует
Миста — веселый ресурс со своими эксклюзивными тараканами Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует