|
Как ускорить запрос? | ☑ | ||
---|---|---|---|---|
0
Sorento
01.04.24
✎
11:15
|
По 1 позиции номенклатуры работает +- быстро , если ставить период 3 месяца тогда по 1 позиции выдает результат примерно через 10-15 сек, а если много позиций тогда будет вылезать ошибка недостаточно памяти. Как можно ускорить или оптимизировать данный код(Этот код отображает информацию за период по неделях):
ПодробностиВЫБРАТЬ 0 КАК Р ПОМЕСТИТЬ Разряды ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаНачала, НЕДЕЛЯ), НЕДЕЛЯ, Единицы.Р + Десятки.Р * 10 + Сотни.Р * 100 + Тысячи.Р * 1000) КАК Период ПОМЕСТИТЬ ТаблицаДат ИЗ Разряды КАК Единицы, Разряды КАК Десятки, Разряды КАК Сотни, Разряды КАК Тысячи ГДЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаНачала, НЕДЕЛЯ), НЕДЕЛЯ, Единицы.Р + Десятки.Р * 10 + Сотни.Р * 100 + Тысячи.Р * 1000) <= &ДатаОкончания ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Период, ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток ПОМЕСТИТЬ ВТ_Остатки ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , НЕДЕЛЯ, Движения, ) КАК ТоварыНаСкладахОстаткиИОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаДат.Период КАК ТДПериод, МАКСИМУМ(ВТ_Остатки.Период) КАК ПериодРО, ВТ_Остатки.Номенклатура ПОМЕСТИТЬ ВТ_БлижайшиеДатыОстатков ИЗ ТаблицаДат КАК ТаблицаДат ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки ПО ТаблицаДат.Период >= ВТ_Остатки.Период СГРУППИРОВАТЬ ПО ТаблицаДат.Период, ВТ_Остатки.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_БлижайшиеДатыОстатков.ТДПериод КАК ТДПериод, ВТ_Остатки.Номенклатура, ВЫБОР КОГДА НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Регистратор.Дата, НЕДЕЛЯ) <> ВТ_БлижайшиеДатыОстатков.ТДПериод ТОГДА 0 ИНАЧЕ ТоварыНаСкладахОбороты.КоличествоПриход КОНЕЦ КАК Приход, ВЫБОР КОГДА НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Регистратор.Дата, НЕДЕЛЯ) <> ВТ_БлижайшиеДатыОстатков.ТДПериод ТОГДА 0 ИНАЧЕ ТоварыНаСкладахОбороты.КоличествоРасход КОНЕЦ КАК Расход, ВТ_Остатки.КоличествоКонечныйОстаток, ВложенныйЗапрос.Цена, ВТ_Остатки.КоличествоКонечныйОстаток * ВложенныйЗапрос.Цена КАК СебестоимостьОстатка, ВЫБОР КОГДА НАЧАЛОПЕРИОДА(Продажи.Регистратор.Дата, НЕДЕЛЯ) <> ВТ_БлижайшиеДатыОстатков.ТДПериод ТОГДА 0 ИНАЧЕ Продажи.Количество КОНЕЦ КАК Продажа, ВЫБОР КОГДА НАЧАЛОПЕРИОДА(Продажи.Регистратор.Дата, НЕДЕЛЯ) <> ВТ_БлижайшиеДатыОстатков.ТДПериод ТОГДА 0 ИНАЧЕ Продажи.Количество * ВложенныйЗапрос.Цена КОНЕЦ КАК СебестоимостьПродаж ИЗ ВТ_БлижайшиеДатыОстатков КАК ВТ_БлижайшиеДатыОстатков ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, ) КАК ТоварыНаСкладахОбороты ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Продажи.Номенклатура КАК Номенклатура, Продажи.Количество КАК Количество, Продажи.Период КАК Период, Продажи.Регистратор КАК Регистратор ИЗ РегистрНакопления.Продажи КАК Продажи) КАК Продажи ПО ТоварыНаСкладахОбороты.Номенклатура = Продажи.Номенклатура И ТоварыНаСкладахОбороты.Период = Продажи.Период ПО (ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, НЕДЕЛЯ)) ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВложенныйЗапрос.Номенклатура КАК Номенклатура, ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК Цена, ЦеныНоменклатуры.Валюта КАК Валюта ИЗ (ВЫБРАТЬ ВложенныйЗапрос.Номенклатура КАК Номенклатура, МАКСИМУМ(ВложенныйЗапрос1.Период) КАК Период ИЗ (ВЫБРАТЬ ТоварыНаСкладах.Номенклатура КАК Номенклатура ИЗ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ЦеныНоменклатуры.Период КАК Период, ЦеныНоменклатуры.Номенклатура КАК Номенклатура ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ ЦеныНоменклатуры.ТипЦен = &ТипЦен) КАК ВложенныйЗапрос1 ПО ВложенныйЗапрос.Номенклатура = ВложенныйЗапрос1.Номенклатура СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Номенклатура) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ПО ВложенныйЗапрос.Номенклатура = ЦеныНоменклатуры.Номенклатура И ВложенныйЗапрос.Период = ЦеныНоменклатуры.Период ГДЕ ЕСТЬNULL(ЦеныНоменклатуры.ТипЦен, &ТипЦен) = &ТипЦен СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Номенклатура, ЦеныНоменклатуры.Валюта, ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0)) КАК ВложенныйЗапрос ПО ВТ_Остатки.Номенклатура = ВложенныйЗапрос.Номенклатура ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура УПОРЯДОЧИТЬ ПО ТДПериод |
|||
1
Timon1405
01.04.24
✎
11:11
|
может быть Продажи.Регистратор.Дата заменить на Период?
оно и по смыслу логичнее и данных через точку брать не будете |
|||
2
Волшебник
01.04.24
✎
11:16
|
(0) Что делает запрос по-вашему и что он должен делать?
|
|||
3
Sorento
01.04.24
✎
11:23
|
(2), Делает понедельный отчет по номенклатуре, запрос должен показывать период(ТДПериод), номенклатуру, конечный остаток(КоличествоКонечныйОстаток), Себестоимость конечного остатка (СебестоимостьОстатка), количество продаж (Продажа), и себестоимость продаж (СебестоимостьПродаж), Сейчас он все то же делает только для удобства показывает еще и цену, приход товара, и расход(реализация, перемещения между складом и т.д.)(Делал чтоб посмотреть правильно ли подтягивает данные продажа) ,
|
|||
4
Sorento
01.04.24
✎
11:23
|
Вот только проблема в том, что он очень долно это все делает
|
|||
5
Sorento
01.04.24
✎
11:27
|
(1), сейчас проверю
|
|||
6
Обработка
01.04.24
✎
11:27
|
(0) Зачем задавать вопроса не показывая самого запроса?
Все мы типа телепаты что ли? |
|||
7
Sorento
01.04.24
✎
11:30
|
(6), Что ты имеешь в виду?
|
|||
8
VS-1976
01.04.24
✎
11:33
|
1. Таблица дат, вы смотрели нет ли там дублей
2. Соединения в последнем запросе лучше делать через "объединить всё" с группировкой иначе при большем периоде ещё дольше будет отрабатывать. |
|||
9
Обработка
01.04.24
✎
11:34
|
(7) Пардон не увидел запроса. Свернутый был.
|
|||
10
Волшебник
01.04.24
✎
11:35
|
(6) Щёлкните по "Подробности", разверните тег DETAILS
|
|||
11
patapum
01.04.24
✎
11:36
|
Добавить регистр сведений, в который записывать данные по неделям. Заполнять регламентным заданием. Предусмотреть изменение даты актуальности, регламентное задание продвигает вперед, если обсчитало период, документы, проводимые задним числом, сдвигают назад на себя, надо пересчитать. Отчет строить по данным регистра.
|
|||
12
Sorento
01.04.24
✎
11:38
|
(1), не помогло
(8), Сейчас проверю |
|||
13
DimVad
01.04.24
✎
11:44
|
ТоварыНаСкладах.ОстаткиИОбороты(, , НЕДЕЛЯ
Это по всем движениям с начала времён ? Нельзя поставить НачалоПериода - КонецПериода ? Ну и не хватает памяти это конечно огромный подзапрос. Они создаются в оперативке. Лучше преобразовать в вт и подумать какие индексы надо создать для быстрого соединения. Подзапрос это вроде где "КАК ТоварыНаСкладахОбороты". Вообще во всех вт создайте индексы по полям по которым соединения делаете. |
|||
14
Sorento
01.04.24
✎
11:51
|
(13), да Вы правы, это по всем движениям с начала времён), даже не заметил что пропустил), спасибо, исправил
|
|||
15
VS-1976
01.04.24
✎
11:52
|
(12) У вас какой опыт написания запросов, по моему последний запрос это лютый треш. По поводу цен, вам последняя цена нужна? Если да, то возьмите срез последних на конец периода. Почему вы берёте все движения по складу? В общем запрос лютый треш. Есть же виртуальная таблица ОстаткиИОбороты для партий, там и остаток и себестоимость и понедельно можно построить, даже параметром передать неделя, месяц и т.д.
|
|||
16
VS-1976
01.04.24
✎
11:56
|
(15) Непонятно какую цену вы хотите вычислить, если цену продажи, то не проще ли взять сами продажи и вычислить цену, а если не было продаж, поставить цену из срез последних на конец периода?
|
|||
17
Sorento
01.04.24
✎
12:05
|
(15), (16). Недодумался... Опыт небольшой. Как только что-то начал делать в 1С - сразу же тут зарегистрировался, так как здесь нашёл много полезной информации. Именно с написания запросов примерно месяц
|
|||
18
Sorento
01.04.24
✎
12:08
|
(15,16), Периоды я скопировал вот отсюда: 'Книга знаний: Полные остатки по периоду во вложенном запросе&', а дальше уже начал крутить-вертеть.
|
|||
19
VS-1976
01.04.24
✎
12:09
|
(16) В общем берете периоды, продажи ( обороты понедельные ), а так же остатки и обороты по партиям ( себестоимость ) через объединенить всё
|
|||
20
Sorento
01.04.24
✎
12:10
|
(19), понял, спасибо Вам большое!
|
|||
21
DrZombi
гуру
01.04.24
✎
12:28
|
(0) Зачем вам обороты (остаток) на каждый день периода отчета?
|
|||
22
DrZombi
гуру
01.04.24
✎
12:31
|
+(0) Таблица где начинается беспредел - "ВТ_БлижайшиеДатыОстатков"
|
|||
23
VS-1976
01.04.24
✎
12:32
|
(19) Не забудьте среднюю цену в продажах понедельных вычислить сумма / количество
При объединении цена в других 0, потом объединяете дальше левое соединение с ценами срез последних на конец периода, по номенклатуре и цена 0 в движения, дальше в полях ставите естьnull( цена из среза, цена из остатков ) если null, тогда цена была в оборотах |
|||
24
DrZombi
гуру
01.04.24
✎
12:34
|
+(0) Тут вы решили взять всю возможную цену :)
(оптимальное использование ресурсов сервера :) Тут проблема. ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ЦеныНоменклатуры.Период КАК Период, ЦеныНоменклатуры.Номенклатура КАК Номенклатура ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ ЦеныНоменклатуры.ТипЦен = &ТипЦен) КАК ВложенныйЗапрос1 ПО ВложенныйЗапрос.Номенклатура = ВложенныйЗапрос1.Номенклатура |
|||
25
DrZombi
гуру
01.04.24
✎
12:34
|
+(24) Тут не проблема, одна, тут очередная проблема у вас:)
|
|||
26
Sorento
01.04.24
✎
12:34
|
(21)(22)(23), Спасибо сейчас буду разбираться в запросе
|
|||
27
VS-1976
01.04.24
✎
12:35
|
(21) Да он хочет получить оборотно сальдовую ведомость понедельную, с блэкджеком и шлюхами в виде цен на сколько я понял, а запрос такой, по тому что товарищ не знает что творит
|
|||
28
Sorento
01.04.24
✎
12:36
|
(25), да с ними я сорвал Джекпот в этот раз))
|
|||
29
DrZombi
гуру
01.04.24
✎
12:38
|
+(0) Вы берете всего неделю, зачем вам дни внутри недели? :)
ВЫБОР КОГДА НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Регистратор.Дата, НЕДЕЛЯ) <> ВТ_БлижайшиеДатыОстатков.ТДПериод ТОГДА 0 ИНАЧЕ ТоварыНаСкладахОбороты.КоличествоПриход КОНЕЦ КАК Приход, ВЫБОР КОГДА НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Регистратор.Дата, НЕДЕЛЯ) <> ВТ_БлижайшиеДатыОстатков.ТДПериод ТОГДА 0 ИНАЧЕ ТоварыНаСкладахОбороты.КоличествоРасход КОНЕЦ КАК Расход, |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |