Имя: Пароль:
1C
1С v8
Нужен совет как ускорить работу данного отчета
, , ,
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)
тут , похоже,  ТС через ВЫБОР пытается достать одно и то же субконто с разных счетов, так что..