Имя: Пароль:
1C
1С v8
Кто-нибудь пробовал переделывать стандартный отчет "ОСВ по счету"?
,
0 Fergus
 
21.06.15
14:35
Всем привет. Есть стандартный отчет "ОСВ по счету". Сам отчет по счету, допустим 29 со всеми вкл. субконто на вкладке "Детализация" с отбором по складу за период допустим Год делается 1-2 часа.
Замер производительности показывает, что проблема в двух местах:
1. ВывестиГруппировкуОборотноСальдовойВедомостиПоСчету(ОбъектОтчета, Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, СтруктураПараметров.МассивГруппировок[ИндексТекущейГруппировки + 1]),
    ИндексТекущейГруппировки + 1, СтруктураПараметров);
2. РезультатЗапроса = Запрос.Выполнить();

Первый исполняется - 4200сек
Второй - 802сек

Через конструктор запросов (запрос выполняется) - 6,97 сек. Те же параметры
Через свой самодельный внешний отчет, который выводит те же данные - 126 сек

Что можете подсказать? Может стоить сесть и переписать стандартный отчет ОСВ по счету? и заменить его своим? Просто там затра...ся с расшифровками?
1 Звездец
 
21.06.15
15:12
Лучше сразу БП пишите, а то 3,0 особо быстродействием не балует
2 Рус Иван
 
21.06.15
15:16
(1)зато интерфейс красивый
3 GROOVY
 
21.06.15
15:19
А ТС говорил о 3.0?
4 Рус Иван
 
21.06.15
15:25
(0) был случай, когда ОСВ по счету формировалась более часа, проблему удалось решить с пом. тестирования и исправления инф. базы. БП 2.0.
5 Звездец
 
21.06.15
15:25
(3) нет, но если у него не 3,0, то там его жде много удивительного в быстродействии
6 Fergus
 
21.06.15
15:31
Сейчас пытаюсь перенести исполнения кода (см выше) на сервер. Не все гладко!
1. Создал модуль с галкой "Сервер"
2. Создал экспортную функцию "ОСВПоСчетуСервер"
3. Пытаюсь передать туда параметры, сохранить результат в хранилищезначений
4. Вытащить макет из хранилища
Что думаете?
7 Рус Иван
 
21.06.15
15:33
(6)Вы бы версию бухгалтерии озвучили
8 hhhh
 
21.06.15
15:33
если в бп 2.0, то имеет смысл сохраненные настройки чистить. Они со временем забиваются. Долго грузятся. Удаление настроек увеличивает скорость отчета в 10 раз. И то же самое в 7.7.
9 hhhh
 
21.06.15
15:36
(8) у вас не программа там а похоже монстр какой-то. У меня осв за 10 лет больше минуты ни разу не выполнялась. На 7.7 было, но и то пару раз всего.
10 Рус Иван
 
21.06.15
15:39
(7) + попробуйте сформировать стандартную осв по счету по другим счетам
11 Fergus
 
21.06.15
15:41
(7) Версия БП 1.6
(10) по другим счетам летает
(9) че поделать страхование ОСАГО база большая
12 Рус Иван
 
21.06.15
15:45
(11) пробуйте тестирование и исправление, только не на рабочей базе
13 Звездец
 
21.06.15
15:47
1.6 и вариант случаем не файловый? что с железом?
14 Fergus
 
21.06.15
15:47
(11) ТИИБ сделал, управление итогами рассчитаны, в SQL повесил План обслуживания (реиндексация, дефрагментация и пр)
15 Fergus
 
21.06.15
15:57
Железо норм
1. 20Гб ОЗУ
2. Intel(R) Xeon(R) CPU E5-2640
3. Hard 3Тб
16 Славен
 
21.06.15
16:07
(15) как определил что норм?
17 Fergus
 
21.06.15
16:12
(15) а что не норм?
18 RomanYS
 
21.06.15
17:39
(11) "че поделать страхование ОСАГО база большая"
переписать данный участок на регистры накопления, субконто снести или укрупнить.
19 Fergus
 
21.06.15
18:48
(11) лучше разобраться с отчетом, чем переходить на крайности, в конце концов проблем в чем? В том, что стандартный отчет "ОСВ по счету" не может нормально выводить огромные количество записей.
А если в конфигурации допустим есть счета с 4-мя и более количество субконто? и по ним есть внушительные таблицы данных. Тоже переписывать на регистры?
20 RomanYS
 
21.06.15
19:08
(19) зачем вообще "выводить огромные количество записей"? что можно делать с отчетом из 10^5 записей?
"допустим есть счета с 4-мя и более количество субконто" - это и есть крайности, которые не совместимы с "большими" данными. Такие варианты нельзя даже рассматривать, тогда не придется ничего переписывать.

Удачи в переписывании ОСВ
21 Fergus
 
21.06.15
21:05
А тема то оказывается больная!
v8: Максимальное число строк в макете (табличный документ)
чувак тоже мучался выводить 600 000 строк в таб док.
22 DrShad
 
21.06.15
21:22
Ну как перепишите, создайте тему потеснив ваше мега произведение
23 DrShad
 
21.06.15
21:23
А за 4-е субконто уже нужно на кол сажать, не говоря уже про 5 и т.д.
24 Маленький Вопросик
 
21.06.15
21:23
я переделывал, в чем проблема? по опредленным счетам (группе счетов)
25 Fergus
 
21.06.15
21:42
(22)(23) ваш предел 1 субконто или вообще без субконто? не понял!? Если есть инструмент в 1С, который называется ПланВидовХарактеристик почему им нельзя пользоваться? Тогда пусть 1С официально заявит что 3 субконто это ПРЕДЕЛ, а еще лучше вообще без субконто...
Короче фигню несете. Даже если я буду делать на регистрах накопления, все равно открытым остается вопрос как вывести БЫСТРО в табдок сотни тысяч строк...
26 Fergus
 
21.06.15
21:47
нашел на ИТС такую вешь, обработка порциями:
ВсеОбработано = Ложь;
Пока Истина Цикл
Запрос = Новый Запрос;
Запрос.Текст =
  "ВЫБРАТЬ ПЕРВЫЕ 1000
  | Номенклатура.Ссылка,
  | Номенклатура.Наименование,
  | Номенклатура.ВидНоменклатуры
  |ИЗ
  | Справочник.Номенклатура КАК Номенклатура
  |ГДЕ
  | <условие выборки необработанных записей>";

Суть переиначал - "Если объём данных, с которыми работает бизнес-логика, сам по себе ничем не ограничен, его нужно ограничивать искусственно, обрабатывая данные порциями"
попробую выводить ОСВ по счету по 100000 записей
27 ДенисЧ
 
21.06.15
21:56
ОСВ больше 100 записей смысла не имееет
28 Lama12
 
21.06.15
21:58
(25) Читай ИТС там написано про 3 субконто.
29 hhhh
 
21.06.15
22:01
(26) а итоги на новый месяц пересчитываете всегда?
30 Fergus
 
21.06.15
22:13
(26) итоги пересчитаны, регулярно делаются
(27) ОСВ больше 100 записей смысла не имеет - отличная мысль, завтра пойду к начальству и скажу, а знаете, оказывается если больше 100 записей, то ОСВ не имеет смысла, сокращайте деятельность, нужно уложиться в 100 записей :)
31 Armando
 
21.06.15
22:19
Результат замера слабое место где показывает?
32 Fergus
 
21.06.15
22:26
(31) на самом верху моего поста
33 Armando
 
21.06.15
22:37
(32) точно)
34 hhhh
 
21.06.15
22:55
(32) переходите на бп 2.0. Там осв быстрее. Я на 1.6 тоже осв переделывал.  У меня субконто договоры тормозило. Потому что договоров десятки тысяч.
35 Armando
 
22.06.15
00:11
Подозрительно большая разница во времени выполнения запросов: 800 и 7 секунд. Есть ли там условие В ИЕРАРХИИ?
У нас ОСВ оптимизирована: если у счета есть субсчета, то будет условие В ИЕРАРХИИ, иначе будет =
36 hhhh
 
22.06.15
04:15
(35) да, вспоминаю. Я как раз в договорах убирал условие В ИЕРАРХИИ.
37 Necessitudo
 
22.06.15
08:13
(25) Это знаешь на что похоже - вот в торговле 10.3 есть функционал по прикреплению файликов к номенклатуре. По умолчанию файлики хранятся прямо в базе. Говоришь народу -   не вкладывайте туда файлы по 200-300 мегабайт! - а тебе отвечают, что мол функционал же в 1С есть, значит им нужно пользоваться.
38 miliko
 
22.06.15
08:22
при чем здесь железо, сделать обычный запрос к SQL
39 Fergus
 
29.06.15
07:36
Тема закрыта. Кому интересно выкладываю как была решена эта задачка
Итак у нас есть некий счет с 3-мя субконто, причем 3-е субконто это "ДоговорыКонтрагентов". Договоров много, очень много, и ОСВ по счету за период "год" зависал конкретно. Формировался отчет примерно часов 3-4, иногда вылетало с ошибкой: "Сеанс был принудительно разорван администраторм и т.д., и т.п.".
Решение:
Опытным путем (отлаживая код, замеряя скорость) мы выяснили, что сам запрос выполняется в приемлемое время, но вот код:
Выборка = РезультатЗапроса.Выбрать()
оказался именно тем камнем, куда 1С спотыкалась, потому что в выборке было более 900 000 записей (это только по 3-му субконто) за период "год". Если быть точным, то узким место стало Выборка3. Я примерно покажу код обхода,чтобы было понятно:
Выборка1 = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Субконто1")
Выборка2 = Выборка1.Выбрать(ОбходРезультатЗапроса.ПоГруппировкам,"Субконто2")
Выборка3 = Выборка2.Выбрать(ОбходРезультатЗапроса.ПоГруппировкам,"Субконто3")
Субконто1 - это ПодразделениеОрганизации здесь проблем нет, поскольку в этой выборке всего ничего записей
Субконто2 - это Контрагенты, здесь тоже проблем нет, записей не более 100 000
Но вот Субконто3 - ДоговоыКонтрагентов, здесь АТАС, записей набралось аж более 900 000.
Чтобы ускорить вывод отчета, мы скопировали макет отчета "ОСВ по счету", убрали вертикальные секции "Счет","Числа" разбили запрос на 2 запроса в пакете. 1-й запрос по 2-м субконто, 2-й запрос только по 3-му субконто. Далее выгружаем результа 2-го запроса в тз, проиндексируем колонку "Субконто2Владелец", короче вот код:
1. для кнопки Сформировать
    МсекНачала = обMSScriptControl.eval("new Date().getTime()");;
    Если Флажок1 Тогда
        ОбновитьОтчет2();
    Иначе
        ОбновитьОтчет();
    КонецЕсли;
    МсекКонца = обMSScriptControl.eval("new Date().getTime()");;
    Сообщить("Время выполнения: " + СокрЛП((МсекКонца - МсекНачала)/1000) + " сек. (" + СокрЛП(Окр((МсекКонца - МсекНачала)/1000/60,2)) + " мин.)");    

2. сама процедура
        ДокументРезультат.Очистить();
        
        Макет = ПолучитьМакет("Макет1");
        Шапка = Макет.ПолучитьОбласть("Шапка");
        Строки = Макет.ПолучитьОбласть("Строки");
        Подвал = Макет.ПолучитьОбласть("Подвал");
        ШрифтГрупп1 = Новый Шрифт(Макет.Область("Строки").Шрифт,,Истина);
        ШрифтГрупп2 = Новый Шрифт(Макет.Область("Строки").Шрифт,,Ложь);
        
        БухгалтерскиеОтчеты.СформироватьИВывестиЗаголовокОтчета(ЭтотОбъект, ДокументРезультат, ВысотаЗаголовка, ПоказыватьЗаголовок, Истина);
        
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    ОстаткиИОбороты.СуммаНачальныйОстатокДт КАК НачальныйОстатокДт,
        |    ОстаткиИОбороты.СуммаНачальныйОстатокКт КАК НачальныйОстатокКт,
        |    ОстаткиИОбороты.СуммаОборотДт КАК ОборотДт,
        |    ОстаткиИОбороты.СуммаОборотКт КАК ОборотКт,
        |    ОстаткиИОбороты.СуммаКонечныйОстатокДт КАК КонечныйОстатокДт,
        |    ОстаткиИОбороты.СуммаКонечныйОстатокКт КАК КонечныйОстатокКт,
        |    ОстаткиИОбороты.Субконто2 КАК Субконто2,
        |    ПРЕДСТАВЛЕНИЕ(ОстаткиИОбороты.Субконто2) КАК Субконто2Представление,
        |    ОстаткиИОбороты.Субконто2.Владелец
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
        |            &ДатаНач,
        |            &ДатаКон,
        |            ,
        |            ,
        |            Счет = &Счет,
        |            ,
        |            Организация = &Организация
        |                И Субконто3 В ИЕРАРХИИ (&Значение3)) КАК ОстаткиИОбороты
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    ОстаткиИОбороты.СуммаНачальныйОстатокДт КАК НачальныйОстатокДт,
        |    ОстаткиИОбороты.СуммаНачальныйОстатокКт КАК НачальныйОстатокКт,
        |    ОстаткиИОбороты.СуммаОборотДт КАК ОборотДт,
        |    ОстаткиИОбороты.СуммаОборотКт КАК ОборотКт,
        |    ОстаткиИОбороты.СуммаКонечныйОстатокДт КАК КонечныйОстатокДт,
        |    ОстаткиИОбороты.СуммаКонечныйОстатокКт КАК КонечныйОстатокКт,
        |    ОстаткиИОбороты.Субконто3 КАК Субконто3,
        |    ПРЕДСТАВЛЕНИЕ(ОстаткиИОбороты.Субконто3) КАК Субконто3Представление,
        |    ОстаткиИОбороты.Субконто1 КАК Субконто1,
        |    ПРЕДСТАВЛЕНИЕ(ОстаткиИОбороты.Субконто1) КАК Субконто1Представление
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
        |            &ДатаНач,
        |            &ДатаКон,
        |            ,
        |            ,
        |            Счет = &Счет,
        |            ,
        |            Организация = &Организация
        |                И Субконто3 В ИЕРАРХИИ (&Значение3)) КАК ОстаткиИОбороты
        |ИТОГИ
        |    СУММА(НачальныйОстатокДт),
        |    СУММА(НачальныйОстатокКт),
        |    СУММА(ОборотДт),
        |    СУММА(ОборотКт),
        |    СУММА(КонечныйОстатокДт),
        |    СУММА(КонечныйОстатокКт)
        |ПО
        |    ОБЩИЕ,
        |    Субконто3,
        |    Субконто1
        |АВТОУПОРЯДОЧИВАНИЕ";
        
        Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач));
        Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон));
        Запрос.УстановитьПараметр("Организация", Организация);
        Запрос.УстановитьПараметр("Счет", Счет);
        Запрос.УстановитьПараметр("Значение3", ПостроительОтчета.Отбор.Субконто3.Значение);
        
        РезультатЗапроса = Запрос.ВыполнитьПакет();
        Выборка = РезультатЗапроса[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Субконто3");
        Выборка2 = РезультатЗапроса[0].Выгрузить();
        Выборка2.Индексы.Добавить("Субконто2Владелец");
        
        тзОтбор = Новый ТаблицаЗначений;
        тзОтбор.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
        тзОтбор.Колонки.Добавить("ПутьКДанным", Новый ОписаниеТипов("Строка"));
        тзОтбор.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
        тзОтбор.Колонки.Добавить("ВидСравнения", Новый ОписаниеТипов("ВидСравнения"));
        тзОтбор.Колонки.Добавить("Значение");
        ДокументРезультат.НачатьАвтогруппировкуСтрок();
        Пока Выборка.Следующий() Цикл
            тзОтбор.Очистить();
            Строки.Параметры.Заполнить(Выборка);
            Строки.Параметры.СубконтоПредставление = Выборка.Субконто3Представление;
            
            НС = тзОтбор.Добавить();
            НС.Имя = "Субконто3";
            НС.ПутьКДанным = "Субконто3";
            НС.Представление = "";
            НС.ВидСравнения = ВидСравнения.ВИерархии;
            НС.Значение = Выборка.Субконто3;
            
            Строки.Параметры.Расшифровка = ВернутьСписокРасшифровка(тзОтбор);
            Строки.Область("R1C2").Отступ = 1;
            Строки.Область("R1").Шрифт = ШрифтГрупп1;
            ДокументРезультат.Вывести(Строки,1);
            Выборка1 = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Субконто1");
            Пока Выборка1.Следующий() Цикл
                тзОтбор.Очистить();
                Строки.Параметры.Заполнить(Выборка1);
                Строки.Параметры.СубконтоПредставление = Выборка1.Субконто1Представление;
                
                НС = тзОтбор.Добавить();
                НС.Имя = "Субконто3";
                НС.ПутьКДанным = "Субконто3";
                НС.Представление = "";
                НС.ВидСравнения = ВидСравнения.ВИерархии;
                НС.Значение = Выборка.Субконто3;
                
                НС = тзОтбор.Добавить();
                НС.Имя = "Субконто1";
                НС.ПутьКДанным = "Субконто1";
                НС.Представление = "";
                НС.ВидСравнения = ВидСравнения.Равно;
                НС.Значение = Выборка1.Субконто1;
                
                Строки.Параметры.Расшифровка = ВернутьСписокРасшифровка(тзОтбор);
                Строки.Область("R1C2").Отступ = 2;
                Строки.Область("R1").Шрифт = ШрифтГрупп2;
                ДокументРезультат.Вывести(Строки,2);
                нСтр = Выборка2.НайтиСтроки(Новый Структура("Субконто2Владелец",Выборка1.Субконто1));
                Для к = 0 По нСтр.ВГраница() Цикл
                    тзОтбор.Очистить();
                    Выборка21 = нСтр[к];
                    Строки.Параметры.Заполнить(Выборка21);
                    Строки.Параметры.СубконтоПредставление = Выборка21.Субконто2Представление;
                    
                    НС = тзОтбор.Добавить();
                    НС.Имя = "Субконто3";
                    НС.ПутьКДанным = "Субконто3";
                    НС.Представление = "";
                    НС.ВидСравнения = ВидСравнения.ВИерархии;
                    НС.Значение = Выборка.Субконто3;
                    
                    НС = тзОтбор.Добавить();
                    НС.Имя = "Субконто1";
                    НС.ПутьКДанным = "Субконто1";
                    НС.Представление = "";
                    НС.ВидСравнения = ВидСравнения.Равно;
                    НС.Значение = Выборка1.Субконто1;
                    
                    НС = тзОтбор.Добавить();
                    НС.Имя = "Субконто2";
                    НС.ПутьКДанным = "Субконто2";
                    НС.Представление = "";
                    НС.ВидСравнения = ВидСравнения.Равно;
                    НС.Значение = Выборка21.Субконто2;
                    
                    Строки.Параметры.Расшифровка = ВернутьСписокРасшифровка(тзОтбор);
                    Строки.Область("R1C2").Отступ = 3;
                    Строки.Область("R1").Шрифт = ШрифтГрупп2;
                    ДокументРезультат.Вывести(Строки,3);
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
        ДокументРезультат.ЗакончитьАвтогруппировкуСтрок();
        
        Выборка = РезультатЗапроса[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ОБЩИЕ");
        Выборка.Следующий();
        Подвал.Параметры.Заполнить(Выборка);
        ДокументРезультат.Вывести(Подвал);
        
        // Заполним общую расшифровку:
        СтруктураНастроекОтчета = СформироватьОбщуюСтруктуруДляРасшифровки();
        СтруктураНастроекОтчета.Вставить("ПоказыватьЗаголовок", ПоказыватьЗаголовок);
        
        ДокументРезультат.Область(1,1).Расшифровка = СтруктураНастроекОтчета;

P.S.
Забыл сказать, что в первоначальном варианте Субконто3 было ПодразделениеОрганизации, потом мы сдвинули на 1-е место. Решение не универсальное, но теперь отчет формируется менее чем за 10 мин за период "год" и с иерархией