|
Ускорение работы запроса | ☑ | ||
---|---|---|---|---|
0
Coldboy
24.10.13
✎
16:37
|
Здравствуйте. Замерил производительность проведения документа и заметил, что документ проводится допустим 30 секунд, и самое большую часть времени его проведения занимает такая вещь (70% времени).
Функция ВыполнитьЗапросПоРасходам(Граница, Организация, ТаблицаФильтров, ТаблицаБлокировок = Неопределено) Экспорт УстановитьБлокировкиПоТаблицеФильтров("РасходыПриУСН", ТаблицаФильтров, ТаблицаБлокировок, Организация); ОбработатьТаблицуФильтров(ТаблицаФильтров); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Организация", Организация); Запрос.УстановитьПараметр("Граница", Граница); Для каждого Фильтр Из ТаблицаФильтров Цикл Запрос.УстановитьПараметр(Фильтр.ИмяПоля, Фильтр.ЗначениеПоля); КонецЦикла; Текст = "ВЫБРАТЬ | РасходыУСН.Организация, | РасходыУСН.ВидРасхода, | РасходыУСН.ЭлементРасхода, | РасходыУСН.СчетУчета, | РасходыУСН.Валюта, | РасходыУСН.ДоговорКонтрагента, | РасходыУСН.РасчетныйДокумент, | РасходыУСН.СтатусыПартийУСН, | РасходыУСН.Партия, | РасходыУСН.ОтражениеВУСН, | РасходыУСН.СтатусыОплатыРасходовУСН, | РасходыУСН.СтатусыОплатыРасходовУСН.Порядок КАК СтатусыОплатыРасходовУСНПорядок, | СУММА(РасходыУСН.КоличествоОстаток) КАК Количество, | СУММА(РасходыУСН.СуммаОстаток) КАК Сумма, | СУММА(РасходыУСН.НДСОстаток) КАК НДС, | РасходыУСН.НомерСтрокиДокумента КАК НомерСтрокиДокумента, | РасходыУСН.РеквизитыДокументаОплаты КАК РеквизитыДокументаОплаты, | РасходыУСН.Партия.Дата КАК ПартияДата, | РасходыУСН.РасчетныйДокумент.Дата КАК РасчетныйДокументДата |ИЗ | РегистрНакопления.РасходыПриУСН.Остатки(&Граница, Организация = &Организация"; Для каждого Фильтр Из ТаблицаФильтров Цикл Если Найти(Фильтр.Условие, "В") = 0 Тогда Текст = Текст + " И " + Фильтр.ИмяПоля + " " + Фильтр.Условие + " &" + Фильтр.ИмяПоля; Иначе Текст = Текст + " И " + Фильтр.ИмяПоля + " " + Фильтр.Условие + " (&" + Фильтр.ИмяПоля + ")"; КонецЕсли; КонецЦикла; Текст = Текст + ") КАК РасходыУСН | |СГРУППИРОВАТЬ ПО | РасходыУСН.Организация, | РасходыУСН.ВидРасхода, | РасходыУСН.ЭлементРасхода, | РасходыУСН.СчетУчета, | РасходыУСН.Валюта, | РасходыУСН.ДоговорКонтрагента, | РасходыУСН.РасчетныйДокумент, | РасходыУСН.СтатусыПартийУСН, | РасходыУСН.Партия, | РасходыУСН.ОтражениеВУСН, | РасходыУСН.СтатусыОплатыРасходовУСН, | РасходыУСН.НомерСтрокиДокумента, | РасходыУСН.РеквизитыДокументаОплаты | |ДЛЯ ИЗМЕНЕНИЯ | |УПОРЯДОЧИТЬ ПО | СтатусыОплатыРасходовУСНПорядок, | ПартияДата, | РасчетныйДокументДата, | НомерСтрокиДокумента"; Запрос.Текст = Текст; Возврат Запрос.Выполнить().Выгрузить(); Как это дело ускорить, мб что-нить можно сделать с регистром накопления, там доп галки индексацию ему выставить ? или взять остаточную таблицу? |
|||
63
vhl
24.10.13
✎
20:17
|
(58) У вас в РасходыУСН.Партия и РасходыУСН.РасчетныйДокумент сильно много различных видов документов хранится или все одного вида?
|
|||
64
hhhh
24.10.13
✎
20:38
|
(63) ну, все, которые вспомнишь, они все есть.
|
|||
65
H A D G E H O G s
24.10.13
✎
23:23
|
(62) Да.
Включить мозг и осилить (43). |
|||
66
Coldboy
25.10.13
✎
09:06
|
(58) штук 25.
(65) а что я не так в нем сделал я же скинул результирующий, и сказал что ругается на выбрать второе, что я забыл. |
|||
67
Ёпрст
25.10.13
✎
09:20
|
(50) забыл ";" между запросами
|
|||
68
Coldboy
25.10.13
✎
09:42
|
(67) а они же разве не вместе? это же все один текст запроса или нет?
|
|||
69
Coldboy
25.10.13
✎
09:48
|
Для каждого Фильтр Из ТаблицаФильтров Цикл
Если Найти(Фильтр.Условие, "В") = 0 Тогда Текст = Текст + " И " + Фильтр.ИмяПоля + " " + Фильтр.Условие + " &" + Фильтр.ИмяПоля; Иначе Текст = Текст + " И " + Фильтр.ИмяПоля + " " + Фильтр.Условие + " (&" + Фильтр.ИмяПоля + ")"; КонецЕсли; КонецЦикла; теперь это мешается, а они вообще нужны? хотя думаю да. |
|||
70
Coldboy
25.10.13
✎
10:19
|
анализируя модуль из типовой БП 2.0 пришел к выводу что код, идентичен за исключением состава измерений партий и тд, туда добавлены типовые раруса. сам замедление в выполнение запроса заключается в следующих строчках.
|УПОРЯДОЧИТЬ ПО | ПартияДата, | РасчетныйДокументДата убирая их скорость возрастает, как думаете, мб стоит сначала выгрузить запрос, а потом ТЗ.Сортировать("Партия.Дата,РАсчетныйДокумент.Дата"); ? |
|||
71
Ёпрст
25.10.13
✎
10:33
|
(68) Это вообще то пакетный запрос, каждый запрос в пакете разделяется ";"
|
|||
72
Coldboy
25.10.13
✎
10:34
|
(71) фильтры не подошли я ушел от этой идеи, появилась вот другая, нагрузку на железо кинуть.
|
|||
73
Coldboy
25.10.13
✎
10:35
|
а железо вроде должнго вытянуть эти сортировки.
|
|||
74
Coldboy
25.10.13
✎
10:45
|
а не ошибся, в субд и то быстрее было . вариант пока без | ПартияДата,
| РасчетныйДокументДата работает самый шустрый. со временными таблицами фильтры не подсунул ... |
|||
75
Ёпрст
25.10.13
✎
10:46
|
(72) Чой то ?
Там надо было просто ГДЕ Остатки.Организациядобавить в текст запроса ну и в условия: Для каждого Фильтр Из ТаблицаФильтров Цикл Если Найти(Фильтр.Условие, "В") = 0 Тогда Текст = Текст + " И Остатки." + Фильтр.ИмяПоля + " " + Фильтр.Условие + " &" + Фильтр.ИмяПоля; Иначе Текст = Текст + " И Остатки." + Фильтр.ИмяПоля + " " + Фильтр.Условие + " (&" + Фильтр.ИмяПоля + ")"; КонецЕсли; КонецЦикла; |
|||
76
Ёпрст
25.10.13
✎
10:47
|
(74) ясен пень, нет соединения со всеми табличками доков из составного типа.
Если знаешь, какие именно должны участвовать в выборке, можешь явно ограничить выборку только из них. |
|||
77
DimGan
25.10.13
✎
10:51
|
Запрос написан, болие или менее нормально. Нужно провести реиндексацию базы в скуле или файле.
|
|||
78
ptiz
25.10.13
✎
10:58
|
(66) "штук 25" - и все используются?
|
|||
79
Coldboy
25.10.13
✎
11:02
|
(76) не тока 5-6 документов вообще в конфигурации не используется ( не работают с ними пользователи).
(77) проводил, не сильно помогло. |
|||
80
GANR
25.10.13
✎
11:09
|
(0) Чтобы понять, как ускорить запрос форум должен видеть:
1. Текст условия, которое формирует цикл в топике 2. Структуры данных левой части, на которые сие условие накладывается 3. Много ли данных возвращает запрос в конце Если в левой части условия много точек - возможно замедление, если в левой части условия составной тип данных - тоже возможно замедление, если в правой части при условии "В" большой массив данных - также возможно замедление. Если этой информации нет - состав преступления отсутствует. Сразу могу сказать, что вот это РасходыУСН.Партия.Дата и это РасходыУСН.РасчетныйДокумент.Дата - соединение со всеми таблицами документов, коими может быть партия / платежка, со всеми вытекающими последствиями. Да и вот это РасходыУСН.Партия - тут, если нужно представление получить (скажем, при выводе документа в отчет/сообщение), известен идентификатор, а какой тип документа - не понятно системе, вот и опять идет запрос ко всем таблицам документов, коими может быть партия. |
|||
81
Coldboy
25.10.13
✎
11:12
|
(80)
1.запрос выкладывал, могу текст уже конечный выложить. 2. Тоже могу выложить все фильтры 3. Данные могут плавать количество так точно не скажу. |
|||
82
ptiz
25.10.13
✎
11:15
|
(74) "со временными таблицами фильтры не подсунул ..."
Всё-таки победи временные таблицы. А вот если не поможет (а это очень вероятно), то надо курить более сложные варианты. |
|||
83
Coldboy
25.10.13
✎
11:18
|
(82) надо еще фильтры подсунуть, да пробывал я со временными, время чуть чуть меньше, но не так как без упорядночить по тем 2 датам.
|
|||
84
GANR
25.10.13
✎
11:19
|
(81) Если заранее известны типы партии и расчетного документа, то можно добиться ускорения посредством
ВЫРАЗИТЬ(Партия КАК Документ.ПоступлениеТоваровУслуг) и в условиях виртуальной таблицы Партия ССЫЛКА Документ.ПоступлениеТоваровУслуг в этом случае система будет рассматривать только партии, которые сделаны ПТиУ - будет ускорение, но снижение универсальности. К слову: если использовать ИЛИ в фильтре - система не будет использовать индексы - тоже может быть замедление. В этом случае лучше строить запросы через ОБЪЕДИНИТЬ ВСЕ, если, конечно, индексы есть, если нет - то смысл теряется. |
|||
85
Coldboy
25.10.13
✎
11:28
|
индексы как их определить?
нет не тока поступление. |
|||
86
ptiz
25.10.13
✎
11:30
|
(83) Во сколько раз ускоряет запрос выключение упорядочивания?
|
|||
87
ptiz
25.10.13
✎
11:38
|
Макс.ускорение можно получить так:
1) получить общий список документов Партия и РасчетныйДокумент из результат запроса без упорядочивания - их не должно быть слишком много. Кстати, сколько у тебя получается? 2) программно построить текст запроса-объединения такого вида "ВЫБРАТЬ Ссылка, Дата ПОМЕСТИТЬ ДокиДаты Из Документ.ВидДокумента1 КАК Док ГДЕ Ссылка В (&МассивВсехДокументов) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Ссылка, Дата ПОМЕСТИТЬ ДокиДаты Из Документ.ВидДокумента2 КАК Док ГДЕ Ссылка В (&МассивВсехДокументов) ... ИНДЕКСИРОВАТЬ ПО ССЫЛКА" и т.д. по всем возможным видам документов (можно перебрать список видов из метаданных регистра). Тут мы получим все даты. И эту таблицу присоединить к первой (несортированной) и отсортировать. Всё это делается одним пакетным запросом. |
|||
88
Ёпрст
25.10.13
✎
11:42
|
(83) см.(75)
|
|||
89
Bober
25.10.13
✎
11:43
|
(0)
1. Нужно изменить алгоритм получения даты у партии и расчетного документа. 2. в запросе не нужно использовать сгруппировать, так как 1с уже это делает за счет получения данных из вирт. таблицы остатков. Для начала оставь все как есть, только убери: - группировку, - упорядочивание - получение данных через точку (Партия.Дата, РасчетныйДокумент.Дата) |
|||
90
ptiz
25.10.13
✎
11:50
|
(89) "получение данных через точку " - так ему нужна сортировка по дате. А взять её можно только из таблиц документов.
|
|||
91
Coldboy
25.10.13
✎
11:54
|
(87) извините, но чувствую будет не очень. общий список документов это выбрать все документы?
|
|||
92
famnam
25.10.13
✎
11:55
|
(0) в качестве теста: поля фильтра расположить в том порядке, как они заданы в конфигураторе. тогда субд будет оптимально использовать индексы
|
|||
93
Coldboy
25.10.13
✎
11:56
|
(75) не понял вас и не увидел сообщения.
|
|||
94
Coldboy
25.10.13
✎
11:57
|
(92) располжены где ?
|
|||
95
Coldboy
25.10.13
✎
11:57
|
(92) точнее это же там партия и тд и тп.
|
|||
96
Coldboy
25.10.13
✎
11:58
|
(89) убрал упорядочивание и скорость ВЫРОСЛА в разы же в 3 раза. вот и спрашиваю чем это черевато.
|
|||
97
Coldboy
25.10.13
✎
11:58
|
сделал так
|УПОРЯДОЧИТЬ ПО | СтатусыОплатыРасходовУСНПорядок, // | ПартияДата, // | РасчетныйДокументДата, | НомерСтрокиДокумента"; и скорость взлетела в 3 раза. |
|||
98
Bober
25.10.13
✎
11:58
|
(96) нужно смотреть дальше по коду. это из какой конфигурации?
|
|||
99
Coldboy
25.10.13
✎
11:59
|
поэтому спрашиваю, что ждать, соотвественро еще убрал
// | ПартияДата, // | РасчетныйДокументДата, из выбрать ибо лишние поля не нужны. |
|||
100
Coldboy
25.10.13
✎
11:59
|
Общепит 2.0, она на основе БП 2.0 там такой же запрос, но нет общепитдокументов (общепит это рарус).
|
|||
101
Bober
25.10.13
✎
11:59
|
(97) группировки и получение данных через точку тоже убирал?
|
|||
102
Bober
25.10.13
✎
12:00
|
(100) проведение по партиям?
|
|||
103
Coldboy
25.10.13
✎
12:00
|
"ВЫБРАТЬ
| РасходыУСН.Организация, | РасходыУСН.ВидРасхода, | РасходыУСН.ЭлементРасхода, | РасходыУСН.СчетУчета, | РасходыУСН.Валюта, | РасходыУСН.ДоговорКонтрагента, | РасходыУСН.РасчетныйДокумент, | РасходыУСН.СтатусыПартийУСН, | РасходыУСН.Партия, | РасходыУСН.ОтражениеВУСН, | РасходыУСН.СтатусыОплатыРасходовУСН, | РасходыУСН.СтатусыОплатыРасходовУСН.Порядок КАК СтатусыОплатыРасходовУСНПорядок, | СУММА(РасходыУСН.КоличествоОстаток) КАК Количество, | СУММА(РасходыУСН.СуммаОстаток) КАК Сумма, | СУММА(РасходыУСН.НДСОстаток) КАК НДС, | РасходыУСН.НомерСтрокиДокумента КАК НомерСтрокиДокумента, | РасходыУСН.РеквизитыДокументаОплаты КАК РеквизитыДокументаОплаты // | РасходыУСН.Партия.Дата КАК ПартияДата, // | РасходыУСН.РасчетныйДокумент.Дата КАК РасчетныйДокументДата |ИЗ | РегистрНакопления.РасходыПриУСН.Остатки(&Граница, Организация = &Организация"; Для каждого Фильтр Из ТаблицаФильтров Цикл Если Найти(Фильтр.Условие, "В") = 0 Тогда Текст = Текст + " И " + Фильтр.ИмяПоля + " " + Фильтр.Условие + " &" + Фильтр.ИмяПоля; Иначе Текст = Текст + " И " + Фильтр.ИмяПоля + " " + Фильтр.Условие + " (&" + Фильтр.ИмяПоля + ")"; КонецЕсли; КонецЦикла; Текст = Текст + ") КАК РасходыУСН | |СГРУППИРОВАТЬ ПО | РасходыУСН.Организация, | РасходыУСН.ВидРасхода, | РасходыУСН.ЭлементРасхода, | РасходыУСН.СчетУчета, | РасходыУСН.Валюта, | РасходыУСН.ДоговорКонтрагента, | РасходыУСН.РасчетныйДокумент, | РасходыУСН.СтатусыПартийУСН, | РасходыУСН.Партия, | РасходыУСН.ОтражениеВУСН, | РасходыУСН.СтатусыОплатыРасходовУСН, | РасходыУСН.НомерСтрокиДокумента, | РасходыУСН.РеквизитыДокументаОплаты | // |ДЛЯ ИЗМЕНЕНИЯ // | |УПОРЯДОЧИТЬ ПО | СтатусыОплатыРасходовУСНПорядок, // | ПартияДата, // | РасчетныйДокументДата, | НомерСтрокиДокумента"; |
|||
104
Coldboy
25.10.13
✎
12:00
|
(102) да есть партионный учет. ФИФО.
|
|||
105
Coldboy
25.10.13
✎
12:00
|
щас такое дело и летает ...
|
|||
106
vhl
25.10.13
✎
12:01
|
(97) смотри, как бы не получилось то что тебе в (57) сказали :)))
|
|||
107
Coldboy
25.10.13
✎
12:01
|
14 минут на проведения целого дня, а было 40 минут, разница есть? документ оборот растет.
|
|||
108
ptiz
25.10.13
✎
12:01
|
(91) Это будет:
ВЫБРАТЬ РАЗЛИЧНЫЕ Партия ПОМЕСТИТЬ ДокументыДляДаты // и эту ВТ будем использовать для отбора документов ИЗ Остатки ОБЪЕДИНИТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ РасчетныйДокумент ИЗ Остатки Чувствую, проще самому написать... |
|||
109
Coldboy
25.10.13
✎
12:01
|
(106) поэтому ищу алтернативу, чтобы не получилось как в (57) я уже понял, примерно зачем нужно упорядочивание , но не понимаю почему даты могут выйти в разброс )
|
|||
110
Coldboy
25.10.13
✎
12:02
|
(108) вообще никогда не использовал ВТ и во франче где раньше работал, открещивались, когда спрашивал про это.
|
|||
111
Bober
25.10.13
✎
12:03
|
(104) посмотри в конфигураторе сколько типов документов в измерении партий и сколько типов в расчетных документах
|
|||
112
Coldboy
25.10.13
✎
12:03
|
а типовой запрос, с не знаниями ВТ еще под ВТ крутить ну скажем не надежно )
|
|||
113
Coldboy
25.10.13
✎
12:03
|
(104) 21, 21 где то так.
|
|||
114
Bober
25.10.13
✎
12:03
|
(110) теперь все по-взрослому.
|
|||
115
Coldboy
25.10.13
✎
12:06
|
пробывать ВТ будут сам отдельно, но не в типовой и в рабочей конфигурации, с этим думаю на 3 месяца затянется, а решение надо щас прикинуть, правда попа моя от этого не горит, но емае обидно, если не поправлю. вроде нашел решение, но может выйти xFO. вот еще жду вариантов.
|
|||
116
vhl
25.10.13
✎
12:07
|
А еще можно в регистр добавить измерения "ПартияДата" и "РасчетныйДокументДата" и записывать их при проведении. Тогда у тебя сразу будут нужные даты и не будет разименовывания. Но тут вопрос - насколько далеко ты готов зайти ради оптимизации :))
|
|||
117
vhl
25.10.13
✎
12:07
|
(103) Ты тупо удалил разименовывание через точку. Это оно тормозило, а не упорядочивание.
|
|||
118
Bober
25.10.13
✎
12:14
|
(115) решение такое:
получение данных из регистра и поместить во временную таблицу, вторым запросом через объединение сделать получение дат из таблиц документов шаблон: ВЫБРАТЬ Док.Ссылка, Док.Дата ИЗ Документ.ИмяДокумента ГДЕ Док.Ссылка В (ВЫБРАТЬ РН.Партия ИЗ ДанныеИзРегистра КАК РН ГДЕ РН.Партия Ссылка Документ.ИмяДокумента) Или Док.Ссылка В (ВЫБРАТЬ РН.РАсчетный Документ ИЗ ДанныеИзРегистра КАК РН ГДЕ РН.РАсчетный Документ Ссылка Документ.ИмяДокумента) ОБЪЕДИНИТЬ ВСЕ ... и тд в конце установить ИНДЕКСИРОВАТЬ ПО Ссылка и так по все типам документов и потом в третьем запросе сделать левое соединение |
|||
119
Bober
25.10.13
✎
12:15
|
вроде уже такой вариант проскакивал. работы там на час. После этого все должно встать на свои места.
|
|||
120
Bober
25.10.13
✎
12:17
|
(103) в типовой бух там 44 типа документов в партии и 40 в расчетном документе, при получении данных через точку получается что в основному запросу (в котором 3 таблицы) присоединяются еще 84 таблицы. От такого запроса можно оживать все что угодно.
|
|||
121
ptiz
25.10.13
✎
12:27
|
Проверил, работает (только фильтры чуть по-другому написал, их не проверял :) )
Запрос = Новый Запрос; Запрос.УстановитьПараметр("Организация", Организация); Запрос.УстановитьПараметр("Граница", Граница); Для каждого Фильтр Из ТаблицаФильтров Цикл Запрос.УстановитьПараметр(Фильтр.ИмяПоля, Фильтр.ЗначениеПоля); КонецЦикла; ТекстФильтра = ""; Для каждого Фильтр Из ТаблицаФильтров Цикл Если Найти(Фильтр.Условие, "В") = 0 Тогда ТекстФильтра = ТекстФильтра + " И " + Фильтр.ИмяПоля + " " + Фильтр.Условие + " &" + Фильтр.ИмяПоля; Иначе ТекстФильтра = ТекстФильтра + " И " + Фильтр.ИмяПоля + " " + Фильтр.Условие + " (&" + Фильтр.ИмяПоля + ")"; КонецЕсли; КонецЦикла; Текст = "ВЫБРАТЬ | РасходыУСН.Организация, | РасходыУСН.ВидРасхода, | РасходыУСН.ЭлементРасхода, | РасходыУСН.СчетУчета, | РасходыУСН.Валюта, | РасходыУСН.ДоговорКонтрагента, | РасходыУСН.РасчетныйДокумент, | РасходыУСН.СтатусыПартийУСН, | РасходыУСН.Партия, | РасходыУСН.ОтражениеВУСН, | РасходыУСН.СтатусыОплатыРасходовУСН, | РасходыУСН.СтатусыОплатыРасходовУСН.Порядок КАК СтатусыОплатыРасходовУСНПорядок, | СУММА(РасходыУСН.КоличествоОстаток) КАК Количество, | СУММА(РасходыУСН.СуммаОстаток) КАК Сумма, | СУММА(РасходыУСН.НДСОстаток) КАК НДС, | РасходыУСН.НомерСтрокиДокумента КАК НомерСтрокиДокумента, | РасходыУСН.РеквизитыДокументаОплаты КАК РеквизитыДокументаОплаты |ПОМЕСТИТЬ Остатки |ИЗ | РегистрНакопления.РасходыПриУСН.Остатки( | &Граница, | Организация = &Организация | И &ТекстФильтра) КАК РасходыУСН | |СГРУППИРОВАТЬ ПО | РасходыУСН.Организация, | РасходыУСН.ВидРасхода, | РасходыУСН.ЭлементРасхода, | РасходыУСН.СчетУчета, | РасходыУСН.Валюта, | РасходыУСН.ДоговорКонтрагента, | РасходыУСН.РасчетныйДокумент, | РасходыУСН.СтатусыПартийУСН, | РасходыУСН.Партия, | РасходыУСН.ОтражениеВУСН, | РасходыУСН.СтатусыОплатыРасходовУСН, | РасходыУСН.НомерСтрокиДокумента, | РасходыУСН.РеквизитыДокументаОплаты, | РасходыУСН.СтатусыОплатыРасходовУСН.Порядок |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | Остатки.Партия КАК Ссылка |ПОМЕСТИТЬ ДокументыВсе |ИЗ | Остатки КАК Остатки | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ РАЗЛИЧНЫЕ | Остатки.РасчетныйДокумент |ИЗ | Остатки КАК Остатки |"; Текст = СтрЗаменить(Текст, "И &ТекстФильтра", ТекстФильтра); МассивИмен = Новый Массив; Для каждого Тип Из Метаданные.РегистрыНакопления.РасходыПриУСН.Измерения.Партия.Тип.Типы() Цикл ИмяМД = Метаданные.НайтиПоТипу(Тип).Имя; Если МассивИмен.Найти(ИмяМД) = Неопределено Тогда МассивИмен.Добавить(ИмяМД); КонецЕсли; КонецЦикла; ТекстДаты = ""; Для каждого ИмяМД Из МассивИмен Цикл ТекстДаты = ТекстДаты + ?(ТекстДаты = "", "", Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ") + Символы.ПС + "ВЫБРАТЬ Ссылка, Дата " + ?(ТекстДаты = "", "ПОМЕСТИТЬ ДокиДаты", "") + Символы.ПС + " ИЗ Документ." + ИмяМД + " КАК Док ГДЕ Ссылка В (ВЫБРАТЬ Ссылка ИЗ ДокументыВсе)" КонецЦикла; Текст = Текст + ";" + ТекстДаты + " |; | ВЫБРАТЬ | Остатки.Организация, | Остатки.ВидРасхода, | Остатки.ЭлементРасхода, | Остатки.СчетУчета, | Остатки.Валюта, | Остатки.ДоговорКонтрагента, | Остатки.РасчетныйДокумент, | ДатыРасчетныхДокументов.Дата КАК РасчетныйДокументДата, | Остатки.СтатусыПартийУСН, | Остатки.Партия, | ДатыПартий.Дата КАК ПартияДата, | Остатки.ОтражениеВУСН, | Остатки.СтатусыОплатыРасходовУСН, | Остатки.СтатусыОплатыРасходовУСНПорядок, | Остатки.Количество, | Остатки.Сумма, | Остатки.НДС, | Остатки.НомерСтрокиДокумента, | Остатки.РеквизитыДокументаОплаты |ИЗ | Остатки КАК Остатки |ЛЕВОЕ СОЕДИНЕНИЕ ДокиДаты КАК ДатыПартий | ПО Остатки.Партия = ДатыПартий.Ссылка |ЛЕВОЕ СОЕДИНЕНИЕ ДокиДаты КАК ДатыРасчетныхДокументов | ПО Остатки.РасчетныйДокумент = ДатыРасчетныхДокументов.Ссылка |УПОРЯДОЧИТЬ ПО | СтатусыОплатыРасходовУСНПорядок, | ПартияДата, | РасчетныйДокументДата, | НомерСтрокиДокумента |"; |
|||
122
H A D G E H O G s
25.10.13
✎
12:37
|
Херракс!
Функция ПолучитьТаблицуОстатков() Экспорт Запрос=Новый Запрос; МенеджерВТ=Новый МенеджерВременныхТаблиц; Запрос.МенеджерВременныхТаблиц=МенеджерВТ; Запрос.Текст= "ВЫБРАТЬ | РасходыУСН.Организация, | РасходыУСН.ВидРасхода, | РасходыУСН.ЭлементРасхода, | РасходыУСН.СчетУчета, | РасходыУСН.Валюта, | РасходыУСН.ДоговорКонтрагента, | РасходыУСН.РасчетныйДокумент, | РасходыУСН.СтатусыПартийУСН, | РасходыУСН.Партия, | РасходыУСН.ОтражениеВУСН, | РасходыУСН.СтатусыОплатыРасходовУСН, | РасходыУСН.КоличествоОстаток КАК Количество, | РасходыУСН.СуммаОстаток КАК Сумма, | РасходыУСН.НДСОстаток КАК НДС, | РасходыУСН.НомерСтрокиДокумента КАК НомерСтрокиДокумента, | РасходыУСН.РеквизитыДокументаОплаты КАК РеквизитыДокументаОплаты |ПОМЕСТИТЬ Остатки |ИЗ | РегистрНакопления.РасходыПриУСН.Остатки() КАК РасходыУСН |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | Остатки.РасчетныйДокумент КАК Документ, | 0 КАК НомерТипа |ИЗ | Остатки КАК Остатки | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ РАЗЛИЧНЫЕ | Остатки.Партия, | 0 |ИЗ | Остатки КАК Остатки"; ТаблицаДокументов=Запрос.Выполнить().Выгрузить(); СоответствиеНомераТипаИИмени=Новый Соответствие; ПоследнийНомерТипа=0; НомерТипа=0; Для Каждого СтрокаТЗ ИЗ ТаблицаДокументов Цикл Если Не ЗначениеЗаполнено(СтрокаТЗ.Документ) Тогда Продолжить; КонецЕсли; ИмяДокумента=СтрЗаменить(xmltypeof(СтрокаТЗ.Документ).ИмяТипа,"DocumentRef.",""); СтрокаСоответствия=СоответствиеНомераТипаИИмени.Получить(ИмяДокумента); Если СтрокаСоответствия=Неопределено Тогда НомерТипа=ПоследнийНомерТипа+1; СоответствиеНомераТипаИИмени.Вставить(ИмяДокумента,НомерТипа); ПоследнийНомерТипа=НомерТипа; Иначе НомерТипа=СтрокаСоответствия.Значение; КонецЕсли; СтрокаТЗ.НомерТипа=НомерТипа; КонецЦикла; Запрос.Текст= "ВЫБРАТЬ | ТаблицаДокументов.Документ, | ТаблицаДокументов.НомерТипа КАК НомерТипа |ПОМЕСТИТЬ ТаблицаДокументов |ИЗ | &ТаблицаДокументов КАК ТаблицаДокументов | |ИНДЕКСИРОВАТЬ ПО | НомерТипа |;"; Запрос.УстановитьПараметр("ТаблицаДокументов",ТаблицаДокументов); Префикс=""; Суффикс="ПОМЕСТИТЬ ДатыДокументов"; Для Каждого СтрокаСоответствия Из СоответствиеНомераТипаИИмени Цикл Запрос.УстановитьПараметр("НомерТипа"+Формат(СтрокаСоответствия.Значение,"ЧГ="),СтрокаСоответствия.Значение); ТекущееИмяДокумента=СтрокаСоответствия.Ключ; Запрос.Текст=Запрос.Текст+Префикс+" |ВЫБРАТЬ | ТаблицаДанных.Ссылка, | ТаблицаДанных.Дата |"+Суффикс+" |ИЗ | Документ."+ТекущееИмяДокумента+" КАК ТаблицаДанных | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДокументов КАК ТаблицаДокументов | ПО ТаблицаДанных.Ссылка = ТаблицаДокументов.Документ | И (ТаблицаДокументов.НомерТипа = &НомерТипа"+Формат(СтрокаСоответствия.Значение,"ЧГ=")+") |"; Суффикс=""; Префикс="ОБЪЕДИНИТЬ ВСЕ"; КонецЦикла; Запрос.Текст=Запрос.Текст+" |ИНДЕКСИРОВАТЬ ПО |ТаблицаДанных.Ссылка;"; Запрос.Текст=Запрос.Текст+ " |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Остатки.Организация, | Остатки.ВидРасхода, | Остатки.ЭлементРасхода, | Остатки.СчетУчета, | Остатки.Валюта, | Остатки.ДоговорКонтрагента, | Остатки.РасчетныйДокумент, | Остатки.СтатусыПартийУСН, | Остатки.Партия, | Остатки.ОтражениеВУСН, | Остатки.СтатусыОплатыРасходовУСН, | Остатки.СтатусыОплатыРасходовУСН.Порядок КАК СтатусыОплатыРасходовУСНПорядок, | Остатки.Количество, | Остатки.Сумма, | Остатки.НДС, | Остатки.НомерСтрокиДокумента КАК НомерСтрокиДокумента, | Остатки.РеквизитыДокументаОплаты, | ЕСТЬNULL(ДатыДокументовПартии.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ПартияДата, | ЕСТЬNULL(ДатыДокументовРасчетныхДокументов.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК РасчетныйДокументДата |ИЗ | Остатки КАК Остатки | ЛЕВОЕ СОЕДИНЕНИЕ ДатыДокументов КАК ДатыДокументовПартии | ПО Остатки.Партия = ДатыДокументовПартии.Ссылка | ЛЕВОЕ СОЕДИНЕНИЕ ДатыДокументов КАК ДатыДокументовРасчетныхДокументов | ПО Остатки.РасчетныйДокумент = ДатыДокументовРасчетныхДокументов.Ссылка | |УПОРЯДОЧИТЬ ПО | СтатусыОплатыРасходовУСНПорядок, | ПартияДата, | РасчетныйДокументДата, | НомерСтрокиДокумента"; ТЗ=Запрос.Выполнить().Выгрузить(); КонецФункции |
|||
123
H A D G E H O G s
25.10.13
✎
12:41
|
1) Фильтры на ВТ сами крутите.
2) Не уверен в связке ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДокументов КАК ТаблицаДокументов | ПО ТаблицаДанных.Ссылка = ТаблицаДокументов.Документ | И (ТаблицаДокументов.НомерТипа =&НомерТипа Будет ли тут задействованы индексы (2 простых, 1-ый - индекс на ссылку в таблицы шапки документа, 2-ой - индекс временной таблицы). 3) Лучше выполнять на сервере 4) Респект ptiz за идею! |
|||
124
Coldboy
25.10.13
✎
12:46
|
и кто же лучше сделал. спасибо большое буду прробывать оба варианта. результат потом расскажу.
|
|||
125
ptiz
25.10.13
✎
12:53
|
Небольшая поправка...
после цикла Для каждого Тип Из Метаданные.РегистрыНакопления.РасходыПриУСН.Измерения.Партия.Тип.Типы() Цикл ... КонецЦикла надо еще на всякий пожарный цикл по типам РасчетныйДокумент: Для каждого Тип Из Метаданные.РегистрыНакопления.РасходыПриУСН.Измерения.РасчетныйДокумент.Тип.Типы() Цикл ИмяМД = Метаданные.НайтиПоТипу(Тип).Имя; Если МассивИмен.Найти(ИмяМД) = Неопределено Тогда МассивИмен.Добавить(ИмяМД); КонецЕсли; КонецЦикла; Хотя оптимальнее по методу H A D G E H O G s обойти таблицу и добавить только задействованные типы в МассивИмен. |
|||
126
H A D G E H O G s
25.10.13
✎
12:54
|
(125) Это если на сервере, оптимальнее. А так - не уверен.
|
|||
127
Coldboy
25.10.13
✎
14:00
|
пробывал ваши оба варианта, ну скажем быстрее, но не так как с первым вариантом где идет упорядочивание ...
|
|||
128
Coldboy
25.10.13
✎
14:01
|
мб вариант (126) сделал не совсем правильно.
|
|||
129
H A D G E H O G s
25.10.13
✎
14:07
|
(127) Зато алгоритм правильный.
А в числовых показателях что? |
|||
130
Coldboy
25.10.13
✎
14:20
|
(129) а что в них? они по ОСВ не идут эти числа, по ОСВ вроде все в 0 закрывается, кроме 20 бываеют там по 0.01 копейки висят.
|
|||
131
Coldboy
25.10.13
✎
14:32
|
еще момент, есть общий модуль общепитовский, теперь он утягивает все это дело в следующей строчке
РегистрОстатков = РегистрыБухгалтерии.Хозрасчетный; СтрокаОстатков.Количество = РегистрОстатков.Остатки(МоментВремени,,СтруктураОтбора,"","Количество")[0].КоличествоОстатокДт; Если СтрокаОстатков.Количество < 0 Тогда СтрокаОстатков.Количество = 0; КонецЕсли; все это в цикле Для Каждого СтрокаПроизводства Из ТаблицаПроизводства Цикл КонецЦикла; как думаете из таблицыпроизводство взять номенклатуру все в запрос получить ТЗ и потом делать НайтиСтроки(), чем каждый раз искать |
|||
132
ptiz
25.10.13
✎
14:36
|
(131) Правильно мыслишь.
|
|||
133
H A D G E H O G s
25.10.13
✎
14:36
|
Жесть, жесть, жесть.
|
|||
134
Coldboy
25.10.13
✎
14:37
|
(133) что я так сильно туплю?
|
|||
135
ptiz
25.10.13
✎
14:37
|
(134) Нет, это разработчики это чуда тупили.
|
|||
136
H A D G E H O G s
25.10.13
✎
14:38
|
Мы напишем собственную Библию. Меньше Содомы, больше Гоморры.
|
|||
137
Coldboy
25.10.13
✎
14:39
|
ну у них свое было мнение. у вас свое.
РегистрОстатков.Остатки(МоментВремени,,СтруктураОтбора,"","Количество")[0].КоличествоОстатокДт; так быстрее работает или можно Запрос.Текст = "ТутаВозьмуОстаточную таблицу." |
|||
138
ptiz
25.10.13
✎
14:39
|
(127) Жаль у меня базы данных нет с большим этим регистром, чтобы проверить. На самом деле, большого ускорения и не должно было получиться, тут, скорее, спортивный интерес.
|
|||
139
piter3
25.10.13
✎
14:41
|
(137) запросом однозначно.
|
|||
140
H A D G E H O G s
25.10.13
✎
14:42
|
(138) Да ладно. Если остатки закрываются - должно помочь.
|
|||
141
Coldboy
25.10.13
✎
14:42
|
ну ваши варианты быстрее первоначального намного. причина очевидна этих выпуском, которые в партиях участвуют их в день по 200 штук где-то.
большое ускорение я вижу тока, когда упорядночить убираю эти 2 параметра и все. (138) меня интересует быстрая скорость ибо закрытие месяца(восстановление последовательности) на недели затягивается. |
|||
142
Coldboy
25.10.13
✎
14:44
|
(140) оставил варианта ptiz, т.к. в вашем чую я косякнул, ошибки не валит, но не верю я своим рукам )
|
|||
143
piter3
25.10.13
✎
14:48
|
+ к (139)
ВЫБРАТЬ ХозрасчетныйОстатки.КоличествоОстатокДт из РегистрБухгалтерии.Хозрасчетный.Остатки(&дата,Счет=&Счет,&видысубконто,Организация=&Организация и Субконто1=&Номенклатура и Субконто2=&склад) КАК ХозрасчетныйОстатки |
|||
144
Coldboy
25.10.13
✎
14:51
|
(143) тока Субконто1 В(&СписокНоменклатура)
тока один момент вместе даты, там моментвремени, а в момнете дата и документ, это как отразить. |
|||
145
Coldboy
25.10.13
✎
14:53
|
единственный момент в таблице производства номеклатура может троится и тд. а они видать каждый раз лазиют для контроля количества, если <0 может быть, то дальше в мниус не идти.
|
|||
146
Coldboy
25.10.13
✎
14:54
|
РегистрОстатков.Остатки(МоментВремени,,СтруктураОтбора,"","Количество")[0].КоличествоОстатокДт;
будет медленее работать , чем ВЫБРАТЬ ХозрасчетныйОстатки.КоличествоОстатокДт из РегистрБухгалтерии.Хозрасчетный.Остатки(&дата,Счет=&Счет,&видысубконто,Организация=&Организация и Субконто1=&Номенклатура и Субконто2=&склад) КАК ХозрасчетныйОстатки ? |
|||
147
piter3
25.10.13
✎
14:55
|
(144) смотря в каком месте смотреть.
СтруктураПараметров.МоментВремени |
|||
148
Coldboy
25.10.13
✎
14:56
|
ну вот РегистрОстатков.Остатки(МоментВремени,,СтруктураОтбора,"","Количество")[0].КоличествоОстатокДт; щас стало утягивать время, думаю как быть теперь
|
|||
149
piter3
25.10.13
✎
14:57
|
(146) еще как и чем больше объемы...
|
|||
150
piter3
25.10.13
✎
14:57
|
(148) запрос пишешь
|
|||
151
Coldboy
25.10.13
✎
14:59
|
там по 1000 строчек, и 1000 раз такая операция выполняется.
запрос. как ваш запрос все нормально, тока видысубконто как вы сделали я не понял, это в субконто да? вместо даты, моментвремени пойдет? |
|||
152
H A D G E H O G s
25.10.13
✎
15:00
|
(151) Почитай книжки.
|
|||
153
piter3
25.10.13
✎
15:07
|
(150) можешь сначала подготовить тз и подсунуть в параметры. для ингридентов по моему там еще есть замены, аналоги.смотри внимательно.
видысубконто=Новый СписокЗначений; видысубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура); видысубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.склад); |
|||
154
Coldboy
25.10.13
✎
15:08
|
Перед циклом вынес
Запрос = Новый Запрос; МоиВидыСубконто = Новый СписокЗначений; МоиВидыСубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура); МоиВидыСубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады); в цикле вместо РегистрОстатков.Остатки(МоментВремени,,СтруктураОтбора,"","Количество")[0].КоличествоОстатокДт; Запрос.Текст = "ВЫБРАТЬ ХозрасчетныйОстатки.КоличествоОстатокДт из РегистрБухгалтерии.Хозрасчетный.Остатки(&МоментВремени,Счет=&Счет,&видысубконто,Организация=&Организация и Субконто1=&Номенклатура и Субконто2=&склад) КАК ХозрасчетныйОстатки" Запрос.УстановитьПараметр("МоментВремени",МоментВремени); Запрос.УстановитьПараметр("Счет",СтруктураОтбора.Счет); Запрос.УстановитьПараметр("Организация",СтруктураОтбора.Организация); Запрос.УстановитьПараметр("Субконто1",СтруктураОтбора.Субконто1); Запрос.УстановитьПараметр("Субконто2",СтруктураОтбора.Субконто2); Запрос.УстановитьПараметр("видысубконто",МоиВидыСубконто); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда СтрокаОстатков.Количество = Выборка.КоличествоОстатокДт; Иначе СтрокаОстатков.Количество = 0; КОнецЕсли; |
|||
155
Coldboy
25.10.13
✎
15:09
|
тока параметры вметсе номенклатуры субконто1.
|
|||
156
piter3
25.10.13
✎
15:10
|
ХозрасчетныйОстатки.КоличествоОстатокДт оберни естьnull тогда
проверять в обходе не нужно будет. так все лучше чем рарус наваял |
|||
157
Coldboy
25.10.13
✎
15:11
|
а ЕстьNULL(ХозрасчетныйОстатки.КоличествоОстатокДт,0) Тогда можно сразу Выборка[0].КоличествоОстатокДт делать да?
|
|||
158
piter3
25.10.13
✎
15:12
|
(157) угу
|
|||
159
Coldboy
25.10.13
✎
15:21
|
ну пасибо прям то ли мне повезло то ли глючит один и тот же документ, на этом модуле, в 7 раз быстрее проходит все это.
|
|||
160
Coldboy
25.10.13
✎
15:22
|
с 14сек до 2 секунд сократилось.
|
|||
161
Coldboy
25.10.13
✎
15:24
|
хм еще бы их закрытый модуль по ключу защиты оптимизировать, вообще круто было бы.
|
|||
162
Coldboy
25.10.13
✎
16:57
|
ускорение работы процедуры Таблица.Свернуть()
СтрокиАвтопеределов = ТаблицаПроизводства.НайтиСтроки(Новый Структура("ИзАвтопеределов", Истина)); ТаблицаАвтопеределов = ТаблицаПроизводства.Скопировать(СтрокиАвтопеределов, "НоменклатурнаяГруппа, Ингредиент, РецептураАвтопередела, ИзАвтопеределов, КоличествоИнгредиентаНорма, КоэффициентИнгредиента, ЕдиницаИзмеренияИнгредиента"); ТаблицаАвтопеределов.Свернуть("НоменклатурнаяГруппа, Ингредиент, РецептураАвтопередела, ИзАвтопеределов, КоэффициентИнгредиента, ЕдиницаИзмеренияИнгредиента", "КоличествоИнгредиентаНорма"); можно через запрос такое сделать? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |