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