Имя: Пароль:
1C
1С v8
Оптимизация запроса для отчета.
,
0 asder117
 
12.03.19
16:13
Доброго времени суток.
Строю отчет по товарам на складах со стоимостью на базе универсального.
В нем добавлен такой запрос:
ТекстЗапроса = "ВЫБРАТЬ
                   |    ТоварыНаСкладахОстаткиИОбороты.Склад,
                   |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
                   |    ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
                   |    ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
                   |    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
                   |    ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход,
                   |    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
                   |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьНачальныйОстаток КАК СтоимостьНачальныйОстаток,
                   |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход КАК СтоимостьПриход,
                   |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьРасход КАК СтоимостьРасход,
                   |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьКонечныйОстаток КАК СтоимостьКонечныйОстаток,
                   |    НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, МЕСЯЦ) КАК ПериодМесяц,
                   |    НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОстаткиИОбороты.Период, МЕСЯЦ) КАК ПериодМесяцСумма,
                   |    ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.СтоимостьКонечныйОстаток КАК СтоимостьКонечныйОстатокБух,
                   |    НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Период, МЕСЯЦ) КАК ПериодМесяцБух
                   |{ВЫБРАТЬ
                   |    Склад.*,
                   |    Номенклатура.*,
                   |    ХарактеристикаНоменклатуры.*,
                   |    КоличествоНачальныйОстаток,
                   |    КоличествоКонечныйОстаток,
                   |    КоличествоПриход,
                   |    КоличествоРасход,
                   |    СтоимостьНачальныйОстаток,
                   |    СтоимостьКонечныйОстаток,
                   |    СтоимостьКонечныйОстатокБух,
                   |    СтоимостьПриход,
                   |    СтоимостьРасход,
                   |    ПериодМесяц,
                   |    ПериодМесяцСумма,
                   |    ПериодМесяцБух}
                   |ИЗ
                   |    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Месяц, , ) КАК ТоварыНаСкладахОстаткиИОбороты
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Месяц, , ) КАК ПартииТоваровНаСкладахОстаткиИОбороты
                   |        ПО ТоварыНаСкладахОстаткиИОбороты.Склад = ПартииТоваровНаСкладахОстаткиИОбороты.Склад
                   |            И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура
                   |            И ТоварыНаСкладахОстаткиИОбороты.Качество = ПартииТоваровНаСкладахОстаткиИОбороты.Качество
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Месяц, , ) КАК ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты
                   |        ПО ТоварыНаСкладахОстаткиИОбороты.Склад = ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Склад
                   |            И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Номенклатура
                   |            И ТоварыНаСкладахОстаткиИОбороты.Качество = ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Качество
                   |{ГДЕ
                   |    ТоварыНаСкладахОстаткиИОбороты.Склад.*,
                   |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура.*}
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
                   |    ТоварыНаСкладахОстаткиИОбороты.Склад,
                   |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
                   |    ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
                   |    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,
                   |    ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
                   |    ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
                   |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьНачальныйОстаток,
                   |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьКонечныйОстаток,
                   |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход,
                   |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьРасход,
                   |    НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, МЕСЯЦ),
                   |    НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОстаткиИОбороты.Период, МЕСЯЦ),
                   |    ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.СтоимостьКонечныйОстаток,
                   |    НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Период, МЕСЯЦ)
                   |{УПОРЯДОЧИТЬ ПО
                   |    Склад.*,
                   |    Номенклатура.*,
                   |    ПериодМесяц,
                   |    ПериодМесяцСумма,
                   |    ПериодМесяцБух}
                   |ИТОГИ
                   |    СУММА(КоличествоНачальныйОстаток),
                   |    СУММА(КоличествоПриход),
                   |    СУММА(КоличествоРасход),
                   |    СУММА(КоличествоКонечныйОстаток),
                   |    СУММА(СтоимостьНачальныйОстаток),
                   |    СУММА(СтоимостьПриход),
                   |    СУММА(СтоимостьРасход),
                   |    СУММА(СтоимостьКонечныйОстаток),
                   |    СУММА(СтоимостьКонечныйОстатокБух)
                   |ПО
                   |    ОБЩИЕ
                   |{ИТОГИ ПО
                   |    Склад.*,
                   |    Номенклатура.*,
                   |    ПериодМесяц,
                   |    ПериодМесяцСумма,
                   |    ПериодМесяцБух}
                   |АВТОУПОРЯДОЧИВАНИЕ";

Отчет долго работает и если период поставить больше 3 месяцев вообще выплевывает "недостаточно памяти". Может его как-то с оптимизировать. У меня как вариант убрать из него управленческую составляющую и оставить только БУ.
Кто что подскажет заранее спасибо.
1 Жан Пердежон
 
12.03.19
16:16
(0) подскажу почитать про оптимизацию запросов хоть что-нибудь;
инфы море  (тот же ИТС)
2 asder117
 
12.03.19
16:18
(1) читал, но что-то в голову ничего не пришло...Это было первое куда я смотрел
3 Ёпрст
 
12.03.19
16:18
Группировать по ресурсам, это пять
4 sqr4
 
12.03.19
16:23
Связи по характеристикам нету
5 asder117
 
12.03.19
16:30
(3) Может вообще ее убрать лучше?
(4) может убыстрить если добавить?
6 sqr4
 
12.03.19
16:31
Ном 1 Хар 1
ном 1 хар 2

Ном 1 Хар 1
Ном 2 Хар 2

сколько записей будет при левом соединении?
7 sqr4
 
12.03.19
16:31
Если связываться толкьо по номенклатуре?
8 Sapiens_bru
 
12.03.19
16:33
Пиши контакты сюда или на почту [email protected] , подключусь, раскидаем отчёт консолькой, найдем причину медленной работы.
Бесплатно в рамках моей подготовки к 1С Эксперт
9 asder117
 
12.03.19
16:35
(7) НЕ пробовал
10 asder117
 
12.03.19
16:54
Еще может какие варианты есть??
11 Ёпрст
 
12.03.19
17:00
(10) есть. Весь запрос в топку
12 breezee
 
12.03.19
17:07
Постройте запрос к одному регистру и поместите во временную таблицу и ко второму, тоже во временную и сойденятесь. Используйте СКД. Практика показывает, что СКД быстрее и удобней универсального отчета.
С периодичностью месяц, наверное, не надо дату приводить к началу месяца (но это не точно)
13 DrWatson
 
12.03.19
17:07
(0) Отборы не в ГДЕ, а в параметрах виртуальной таблицы.
14 sqr4
 
12.03.19
17:10
(13) а где ГДЕ?)
15 Ботаник Гарден Меран
 
12.03.19
17:18
(14)
{ГДЕ
                   |    ТоварыНаСкладахОстаткиИОбороты.Склад.*,
                   |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура.*}
16 palsergeich
 
12.03.19
17:18
Всё тлен.
Использование ОстаткиИОбороты - чтение всей таблицы за период.
1 оценить количество данных в каждом запросе соединения.
2 нарушена одна из рекомендаций 1с не соединять 2 и более виртуальных таблиц. Скорее всего оптимизатор лазает.
Что бы я сделал: разделил каждую Вирт таблицу в отдельный пакет и потом соединил бы уже пакеты
17 palsergeich
 
12.03.19
17:20
Если записей в регистрах очень много и разделение на пакеты не возможно, то принципиально переделывать архитектуру.
18 palsergeich
 
12.03.19
17:21
(16) и при чем не факт что оптимизатор не ошибется
19 Ёпрст
 
12.03.19
17:21
У него и так дублирующая инфа в этих вт. В партиях поди, количество уже есть - не надо тащить ТоварыНаСкладах ну и т.д
20 palsergeich
 
12.03.19
17:23
Конфа не известна и может быть из партий не очень то и достанешь.
21 DrWatson
 
12.03.19
17:25
(17) Вот именно, временные таблицы могут быть большими. Это же отчет, возьмут пользователи и не поставят отборы. Тут можно подумать о замене соединения объединением с группировкой.
22 palsergeich
 
12.03.19
17:25
Конкретно в этом случае ещё как вариант - запрос объединение.
В первой части получить остатки начальные конечные.
Во второй части - обороты из реальной таблицы.
23 palsergeich
 
12.03.19
17:27
В принципе для того что бы сделать через объединение никаких препятствий не вижу, будет быстрее
24 asder117
 
12.03.19
17:35
(20) УПП
25 asder117
 
12.03.19
17:35
(23) Как вариант попробую
26 asder117
 
12.03.19
17:41
что самое интересное надо выводить помесячно.
(12)стоимость если я привожу к началупериода НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОстаткиИОбороты.Период, МЕСЯЦ), то он берет начало следующего месяца
27 Homer
 
12.03.19
18:05
Если это УПП, то автор совсем плох в знаниях
1. РегистрНакопления.ТоварыНаСкладах - он должен равняться РегистрНакопления.ПартииТоваровНаСкладах.
2. Как уже было сказано объединение тут рулит.
3. Если это через универсальный отчет, то где характеристики?
28 asder117
 
12.03.19
18:18
(27) Это я знаю просто в некоторых случаях у нас не совпадает вот и было решено 2 регистар использовать.
Боюсь при объединение периоды потерять. в первом регистре период на начало месяца к примеру а во втором несколько дат в месяце..
Характеристики добавил - но это не помогло. попробую объединением попробовать а второй регистр остатки с приведением периода к началу периода
29 asder117
 
12.03.19
18:19
(19) в некоторых позициях разнятся
30 asder117
 
12.03.19
21:13
вообщем через объединение сделал дальше смотрю