Имя: Пароль:
1C
1C 7.7
v7: При установке ТА на док. Время проведения сильно возростает!
0 FatOFF
 
13.12.11
14:10
Вообщем имеется документ "Взаимозачет", 476 строк. При установке ТА на документ он проводит его 1ч. 20мин. При этом неимоверно разрастется файл "templog.ldf" (2,5-3Гб). Замер производительности показал что практически всё время тратится на функцию ВыгрузитьИтоги(). Если ТА рассчитать на более поздний документ, он проводится за 30 секунд! Данная проблема существует только на SQL ных базах, причём на всех (2000, 2005, 2008). Никто не сталкивался с такой проблемой?
1 FN
 
13.12.11
14:18
предположение:
1.эти документом (а может несколькими в этот же день) был "свернут" очень сильно распухший регистр. Соотвесвенно итогов на документ - 100 тыс строк, после документа - 500 строк.
2.+криво написан код
2 Ёпрст
 
13.12.11
14:22
ставлю на 2.
3 orefkov
 
13.12.11
14:24
SQL-ным профайлером смотри, что делается.
4 orefkov
 
13.12.11
14:28
Хотя Ёпрст наверняка прав, и в коде какойнить косяк с ИтогиАктуальны + ВременныйРасчет
5 Ёпрст
 
13.12.11
14:29
(4) или.. расчет итогов и их выгрузка в цикле :)
6 FatOFF
 
13.12.11
14:31
Регистр НДСПоПриобретённымЦенностям сам по себе не маленький, итоги естественно актуальны и временный расчёт не используется... Документ стандартный да и криво написать там сложно... Устанавливается фильтр, затем выгружаются итоги... И потом, в ДБФ-е проблем таких нету с этим же документом...
7 FN
 
13.12.11
14:32
код засвети
8 FatOFF
 
13.12.11
14:39
Процедура глЗачетНДС(Конт, ТаблицаЗачетаНДС) Экспорт

   Если ТаблицаЗачетаНДС.КоличествоСтрок() = 0 Тогда
       Возврат;
   КонецЕсли;

   СписокСчетовФактур = СоздатьОбъект("СписокЗначений");
   ТаблицаЗачетаНДС.Выгрузить(СписокСчетовФактур, , , "СчетФактура");
   СписокКонтрагентов = СоздатьОбъект("СписокЗначений");
   ТаблицаЗачетаНДС.Выгрузить(СписокКонтрагентов, , , "Контрагент");
   СписокКонтрагентов.ДобавитьЗначение(ПолучитьПустоеЗначение("Справочник.Контрагенты"));

   Регистры = СоздатьОбъект("Регистры");
   НДСпоПриобретеннымЦенностям = Регистры.НДСпоПриобретеннымЦенностям;
   НДСпоПриобретеннымЦенностям.УстановитьЗначениеФильтра("СчетФактура", СписокСчетовФактур, 2);
   НДСпоПриобретеннымЦенностям.УстановитьЗначениеФильтра("Контрагент", СписокКонтрагентов, 2);

   Если Конт.ИтогиАктуальны() = 0 Тогда

       НДСпоПриобретеннымЦенностям.ВременныйРасчет(1);
       Регистры.Актуальность(1);
       Регистры.РассчитатьРегистрыНа(Конт.ТекущийДокумент());

   КонецЕсли;
   
   ВключатьвКнигуПокупок = 1;
   Если Конт.Вид() = "Взаимозачет" Тогда
       Если Конт.ТипХозОперации = 2 Тогда
           ВключатьвКнигуПокупок = Конт.ВключатьвКнигуПокупок;
       ИначеЕсли Конт.ТипХозОперации = 4 Тогда
           ВключатьвКнигуПокупок = 0;
       КонецЕсли;
   КонецЕсли;
   
   ТаблицаЗачетаНДС.ВыбратьСтроки();
   Пока ТаблицаЗачетаНДС.ПолучитьСтроку() = 1 Цикл
       
       Если (ТаблицаЗачетаНДС.ОплатаБазаНДС = 0) Тогда
           Продолжить;
       КонецЕсли;

       ТаблицаНДС = СоздатьОбъект("ТаблицаЗначений");
       НДСпоПриобретеннымЦенностям.УстановитьЗначениеФильтра("СчетФактура", ТаблицаЗачетаНДС.СчетФактура, 1);
       НДСпоПриобретеннымЦенностям.ВыгрузитьИтоги(ТаблицаНДС);
------------
9 zak555
 
13.12.11
14:40
erh &
10 zak555
 
13.12.11
14:40
*урк ?
11 zak555
 
13.12.11
14:40
**укр ?
12 orefkov
 
13.12.11
14:41
(6)
На скл бывало, что если фильтр большой, то это было хуже, чем даже без фильтра.
Попробуй например отключи установку фильтров.
13 FatOFF
 
13.12.11
14:42
А что он вообще в файл "templog.ldf" может ложить, что его так разсирает???
14 FN
 
13.12.11
14:43
Регистры.Актуальность(1); - очень надо?
15 Ёпрст
 
13.12.11
14:45
:))))))))))))))))))))))))))))))))))))))))))))))

Я угадал.. Выгрузка итогов в цикле..
16 FN
 
13.12.11
14:45
(15) блин, точно
17 FN
 
13.12.11
14:46
причем УстановитьЗначениеФильтра после РассчитатьРегистрыНа по идее ничего не дает...
18 Ёпрст
 
13.12.11
14:50
(17) дает.
19 Ёпрст
 
13.12.11
14:51
И.. так как это не весь код, я думаю, там еще есть чего интересного по другим регистрам.
20 FatOFF
 
13.12.11
14:59
)))
Во-первых "Регистры.Актуальность(1)" конечно очень надо! на случай если итоги не актуальны! Но так как у нас итоги актуальны он туда не заходит!
Во-вторых причём тут выгрузка итогов внутри цикла? По другому никак не сделаешь, т.к. нужно получить итог с соответствующим фильтром!
Я конечно могу прислать код хоть всего глобального модуля... Да только проблема мне кажется не в этом..
21 Ёпрст
 
13.12.11
15:07
(20) ну , если тебе кажется, наблюдайте дальше.
22 FatOFF
 
13.12.11
15:14
(21)Ну тогда предложи что нибудь...
Можно конечно переписать и сделать выборку итогов через запрос, но тут вопрос в другом, почему если точку актуальности сместить хотябы на документ вперёд он нормально проводит без заморочек... Ведь по идеи ТА на документ должна облегчать выгрузку итогов, ну никак её не усложнять...
23 viktor_vv
 
13.12.11
15:15
(20) На случай если итоги не актулаьны есть Конт.ИтогиАктуальны(). Регистры.Актуальность(1) означает что временные итоги будут поддерживаться в актуальном состоянии при дальнейшем движении по регистрам, а это требует ресурсов.

Хотя в товем случае получается, что задним числом на временном расчете он проводится быстрее, чем на актуальных итогах.
24 viktor_vv
 
13.12.11
15:15
(23)+ *Чем на ТА.
25 Ёпрст
 
13.12.11
15:16
(22) а чего предлагать то ? Это только 1 регистр с явно неоптимальным кодом. У тебя их еще несколько.
Что там в модуле проведения -хз.
Судя по этому куску кода - ничего хорошего.
26 FatOFF
 
13.12.11
15:16
(12) Фильтр нужен)
Ну и ответа на пост (13) никто не знает?
27 MagTux
 
13.12.11
15:18
(26) Сначала выгружаешь всё, потом фильтруешь.
28 MagTux
 
13.12.11
15:18
+(27) Вернее не всё, а по списку.
29 FatOFF
 
13.12.11
15:18
(25) вот скажи что тебе конкретно не нравится в выбранном отрезке кода?
Я стандартные процедуры стараюсь переписывать в крайне редких случаях...
30 Ёпрст
 
13.12.11
15:19
(29) читай (15).
31 Ёпрст
 
13.12.11
15:20
И.. это явно не "стандартная процедура"..
По крайней мере, в типовых россейских конфах такого не встречал.
32 FatOFF
 
13.12.11
15:23
(31) Ты наверное с ПУБ-ом не разу не работал...
33 Steel_Wheel
 
13.12.11
15:24
(15) жесть жестяная.... это же так изнасиловать БД
34 FatOFF
 
13.12.11
15:27
(30) Читал, и отвечал...
А на (16) пост никто ответа не знает?
35 Steel_Wheel
 
13.12.11
15:32
>> (15) блин, точно
Какой ответ нужен?
36 MagTux
 
13.12.11
15:32
(35) На 13. Опечатался он.
37 MagTux
 
13.12.11
15:32
(34) 476 раз дёргать регистры потому что фильтр нужен - это неразумно. Выгружай всё после фильтра по спискам в ТЗ и делай с ней что угодно.
38 FatOFF
 
13.12.11
15:33
(36) Точно)))
39 FatOFF
 
13.12.11
15:36
(37) Да понятно что не разумно... Но ещё раз повторюсь, стандартная процедура ПУБа, которая отлично работает если ТА стоит не на документ... причём на ДБФ-е летает независимо от точки актуальности...
40 MagTux
 
13.12.11
15:44
(39) 1С 7.7 не умеет работать с SQL Server.
41 FatOFF
 
13.12.11
16:16
(40)Спасибо за дельный ответ!
42 Ёпрст
 
13.12.11
16:17
Что говорит товарищь отладчик и замер производительности ?
Что говорит товарищь профайлер ?
Обновление статистики, реиндекс, дефрагментация и т.д хоть настроена на скуле ?..
Как часто ?
43 kunashir
 
13.12.11
16:26
У меня тоже было подобное.
Наше такой код:

Склады.УстановитьЗначениеФильтра("МестоХранения", РегСклад.МестоХранения, 1);
Склады.УстановитьЗначениеФильтра("МПЗ", МПЗ, 1);

Склады.ВыбратьИтоги();
Склады.ПолучитьИтог();
Ост = Склады.Количество;

заменил на:

Склады.УстановитьЗначениеФильтра("МестоХранения", РегСклад.МестоХранения, 1);
Склады.УстановитьЗначениеФильтра("МПЗ", МПЗ, 1);
ТаблицаИтогов = СоздатьОбъект("ТаблицаЗначений");
//Склады.ВыбратьИтоги();
//Склады.ПолучитьИтог();
Склады.ВыгрузитьИтоги (ТаблицаИтогов, 1, 1);
//ТаблицаИтогов.ПолучитьСтрокуПоНомеру(1);
Ост = ТаблицаИтогов.Итог("Количество");//Склады.Количество;

Раньше восстановление последовательности за месяц не успевала за 12 часов, а теперь часов 6 хватает.
44 viktor_vv
 
13.12.11
16:27
Попробуй еще добавить фильтр на контрагента.

НДСпоПриобретеннымЦенностям.УстановитьЗначениеФильтра("Контрагент", ТаблицаЗачетаНДС.Контаргент, 1);
НДСпоПриобретеннымЦенностям.УстановитьЗначениеФильтра("СчетФактура", ТаблицаЗачетаНДС.СчетФактура, 1);
       НДСпоПриобретеннымЦенностям.ВыгрузитьИтоги(ТаблицаНДС);

Потому как на ТА установленные фиильтры по списку не действуют. А отбор итогов по СчветФактура по умолчанию не стоит.
45 Ёпрст
 
13.12.11
16:27
(43) а заменил бы на Остаток() - еще быстрее было бы.
46 viktor_vv
 
13.12.11
16:28
(44)+ *Установленные ранее фильтры по списку.
47 Ёпрст
 
13.12.11
16:32
(44) еще как действуют
48 viktor_vv
 
13.12.11
16:38
(47) Применительно к его коду, если на ТА он не зайдет в условие Если Конт.ИтогиАктуальны() = 0 Тогда.

По крайней мере в профайлере для кода

   РегВзаиморасчеты.УстановитьЗначениеФильтра("Клиент",СписокЗначений,2);
   //РегВзаиморасчеты.ВременныйРасчет(1);
   //
   //Рег.РассчитатьРегистрыНа(ПолучитьДатуТА()-1,);
   
   //РегВзаиморасчеты.УстановитьЗначениеФильтра("Клиент",фасКлиент,1);
   РегВзаиморасчеты.УстановитьЗначениеФильтра("Заказ",фасСделка,1);
   
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   РегВзаиморасчеты.ВыгрузитьИтоги(ТЗ);

я не увидел никаких действий по формированию и использованию условия по списку. Получается простой запрос с условием по периоду и одному измерению.
49 MagTux
 
13.12.11
16:42
(48) Я может ляпну не в тему, но накой нужен фильтр по клиенту (и тем более списку), если заказ относится к единственному клиенту?
50 viktor_vv
 
13.12.11
16:43
А потому как без клиента он в индекс не попадет.
51 FatOFF
 
13.12.11
16:43
Да там вообще нафиг не нужен ещё один фильтр... Он выгружает по конкретному документу, который в единственном числе там!
52 viktor_vv
 
13.12.11
16:48
(44) и (48) не читайте. (47) прав, это я че-то не так смотрел :).
53 Злой Бобр
 
13.12.11
16:50
(0) Не видя конфы и базы - сложно сказать что и как. Может у тебя документ с пустой датой где-то, или еще что-то. Отладчик в руки. Находишь узкое место. Дальше смотришь что говорит товарищ профайлер. Проверяешь что именно в фильтре. Ну и т.д.
А вот за такое нужно ***:

   Пока ТаблицаЗачетаНДС.ПолучитьСтроку() = 1 Цикл
       ...
       НДСпоПриобретеннымЦенностям.ВыгрузитьИтоги(ТаблицаНДС);
       ...

При таком коде я уже ничему неудивляюсь. Еще б для полного ахтунга транзакцию туда.
54 viktor_vv
 
13.12.11
16:55
Осталось еще только условия по спсикам перенести внутрь

Если Конт.ИтогиАктуальны() = 0 Тогда

а то эти условия при проведении на ТА при каждом

НДСпоПриобретеннымЦенностям.ВыгрузитьИтоги(ТаблицаНДС);

фигачат временные таблицы по спискам, отсюда может и лог растет.
55 FatOFF
 
13.12.11
16:57
Тут дело не в коде... Да, конечно оптимизировать можно постараться разными способами! Но с точкой актуальности в скуле какая то ХРЕНЬ!!! Я уже не первый раз встречаюсь с этим. У меня например частенько бывал такой случай когда например при списании из эксплуатации он не видит остатка, если точка актуальности стоит не на документе... Объяснения этому кроме как слово глюк я не нашёл...

(53) Да! Я думаю стоит *** того чувака из фирмы 1С который написал ПУБ))))
56 Злой Бобр
 
13.12.11
16:58
(54) Дык не может а так и есть. Проведение документа это одна транзакция. А поскольку курсоры неосвобождаются то в цикле такой код дает увеличение лога.
57 FatOFF
 
13.12.11
16:59
(56) Ну а почему всё тормозит только тогда когда ТА на документ стоит?
58 Mikeware
 
13.12.11
17:01
(55) Это не глюк, это стандартная ситуация при очень большом отношении радиусов...
(53) так проведение дока - это кк раз неявная транзакция... Потому лог и растет...
59 viktor_vv
 
13.12.11
17:02
(57) Потому что когда не на ТА, то фильтры по списку применятются только для расчета итогов, а дальше

НДСпоПриобретеннымЦенностям.ВыгрузитьИтоги(ТаблицаНДС);

уже идет из временной таблицы итогов с наложением только условия по сделке.
Это опять же предположение.
60 Mikeware
 
13.12.11
17:03
(59) плюс поддержка актуальности итогов...
61 FatOFF
 
13.12.11
17:07
Mikeware дружище, я чувтсвую что ты мне один можешь помочь... Что за большое отношение радиусов?
62 MagTux
 
13.12.11
17:08
(61) Он про руки )))
63 Злой Бобр
 
13.12.11
17:08
(58) Привет. Да я об этом уже сказал. Но прикинь, было б классно еще и в цикл транзакцию вкинуть. Сейчас в коде такой же беспредел как в цикле дергать один и тот же запрос. Почему так - меня не спрашивай, автору виднее.
ПУБ веселая конфа. Но если уж связались с ней то запасайтесь стимуляторами. Не вы первые, не вы последние.
64 FatOFF
 
13.12.11
17:16
(63) На счёт конфы без вариантов! в 50 раз повторяю, что в любых других случаях работает без задержек!
65 Злой Бобр
 
13.12.11
17:25
(64) Эх ... Код кривой у тебя. Или еще раз объяснять то что и так понятно.

   НДСпоПриобретеннымЦенностям.ВключитьSQL(1);
   ТаблицаЗачетаНДС.ВыбратьСтроки();
   Пока ТаблицаЗачетаНДС.ПолучитьСтроку() = 1 Цикл
       ...
       НДСпоПриобретеннымЦенностям.ВыгрузитьИтоги(ТаблицаНДС);
       ...
66 MagTux
 
13.12.11
17:25
(64) А этот документ полностью типовый? Процедура глЗачетНДС тоже полностью типовая?
67 Злой Бобр
 
13.12.11
17:27
+65 Надеюсь ВключитьSQL(1) виден.
68 viktor_vv
 
13.12.11
17:38
(64) Так ты пробовал убрать фильтры по списку при проведении на ТА ?
69 kunashir
 
13.12.11
17:43
Что прикольно, это

НДСпоПриобретеннымЦенностям.ВключитьSQL(1);
   ТаблицаЗачетаНДС.ВыбратьСтроки();
   Пока ТаблицаЗачетаНДС.ПолучитьСтроку() = 1 Цикл
       ...
       НДСпоПриобретеннымЦенностям.ВыгрузитьИтоги(ТаблицаНДС);
       ...

Это код из релиза 2.8, в 2.1 такого не было.
70 viktor_vv
 
13.12.11
17:52
(67) Ты хотел сказать ВключитьSQL(0) .
71 MagTux
 
13.12.11
18:18
С ВключитьSQL() я вообще не догнал.
1) ВключитьSQL(1) разве не по-умолчанию?
2) Если ВключитьSQL(0), то нафига?
72 MagTux
 
13.12.11
18:19
Или это юмор такой?
73 viktor_vv
 
13.12.11
18:27
ВключитьSQL(0) переведет работу с регистром на алгоритмы работы в DBF базе. Иногда это помогает.
74 MagTux
 
13.12.11
18:34
(73) Я всегда думал, что ВключитьSQL(0) помогает обойти проблемы, а не ускорить работу.
Хотя, если честно, никогда его не пользовал.
75 FatOFF
 
14.12.11
10:10
(69) А процедура то не стандартная... Во я косяк... и тебе и себе написал...
(72) Юмор такой, почти как у тебя... Так что можешь поржать)))
(69) Удачи! Я думаю от тебя и от ёпрст3 ничего полезного я здесь не услышу...
76 Ёпрст
 
14.12.11
10:15
(75) на (42) есть ответ ?
77 MagTux
 
14.12.11
11:14
(75) Ты когда читаешь ветку ты по порядку читай, а не выборочно.
78 1Сергей
 
14.12.11
12:08
(8) НДСпоПриобретеннымЦенностям.ВыгрузитьИтоги(ТаблицаНДС,1);
79 FatOFF
 
14.12.11
16:54
(76) Товаришь отладчик с замером производительности сказал что долго думает когда выгружает в таблицу значений (пост (0)), профайлер пока не применял, дефрагментация стоит, хотя дефрагментировать нечего там, новая машина с новым ПО с только что загруженной базой для теста... Реиндекс не стали ставить т.к. много отрицательной хрени про неё написано в нете... Но что то мне подсказывает что хочешь в очередной раз сказать что у меня не правильно настроен SQL или что то в этом роде... Есть какая нибудь конкретика привязки точки актуальности с функцией ВыгрузитьИтоги()? Хотя если никто с такими глюками не сталкивался я думаю сложно будет что то подсказать...
Вообщем уезжаю на неделю, приеду, если будет время помучаю профайлер...Хотя если честно думаю что врятли правду тут найду, SQL работает немного по другому с базой, и проблема эта я думаю никак не решится, даже если что то накопаю, тут уж действительно проще изменить код...
Спасибо всем кто откликнулся...
80 Ёпрст
 
14.12.11
17:18
(79) ну ёпта, сам скуль никто не настраивал..гы, и эти люди утверждают, что 2000 быстрее 2008.
:))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
81 FatOFF
 
14.12.11
22:21
(80) Ну-ну. что и требовалось доказать... Сколько раз читал твои коменты ещё ни одного стоящего не видел.... По делу давай по делу... А если сказать нечего нефиг тут какать...
82 Ёпрст
 
14.12.11
22:41
(81) Дык сделай реиндекс, обнови статистику, порежь логи, сделай дефрагментацию индексов, это для начала.
Во-вторых сделай замеры производительности самого скуля
В-третьих, я хз, сколько ты памяти выделил скулю, сколько процов, на какой винт поместил саму базу, логи, темпдб и т.д.
В-четвертых, проверь саму ИБ на ошибки (z1 выкладывал скрипты)
В-пятых, ты не указал ни размеры бд, ни период хранения останков,
ни-че-гоооо.

Даже замеры не предоставил.

И что нам остаётся ?
Правильно - только стебаться над тобой.
83 Ёпрст
 
14.12.11
22:44
да хоть бы итоги пересчитал, для начала
84 FatOFF
 
14.12.11
23:13
Не вижу смысла вступать с тобой в очередную бесполезную полемику!
85 Ёпрст
 
14.12.11
23:15
(83) Тогда нефик писать обиженные посты вроде (81).
86 ДенисЧ
 
14.12.11
23:15
мда... Автор ТП мужского роду...
Ему дают советы, он их игнорит и упорно долбит своё...
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс