|   |   | 
| 
 | Ускорение работы запроса | ☑ | ||
|---|---|---|---|---|
| 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 | 
        ускорение работы процедуры Таблица.Свернуть()
 СтрокиАвтопеределов = ТаблицаПроизводства.НайтиСтроки(Новый Структура("ИзАвтопеределов", Истина)); ТаблицаАвтопеределов = ТаблицаПроизводства.Скопировать(СтрокиАвтопеределов, "НоменклатурнаяГруппа, Ингредиент, РецептураАвтопередела, ИзАвтопеределов, КоличествоИнгредиентаНорма, КоэффициентИнгредиента, ЕдиницаИзмеренияИнгредиента"); ТаблицаАвтопеределов.Свернуть("НоменклатурнаяГруппа, Ингредиент, РецептураАвтопередела, ИзАвтопеределов, КоэффициентИнгредиента, ЕдиницаИзмеренияИнгредиента", "КоличествоИнгредиентаНорма"); можно через запрос такое сделать? | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |