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

можно через запрос такое сделать?
AdBlock убивает бесплатный контент. 1Сергей