|
Запрос в цикле к виртуальной таблице остатков (регистра накопления) | ☑ | ||
---|---|---|---|---|
0
Dmitriy_
Kolesnikov 26.09.19
✎
07:30
|
Задача следующая. Есть массив масМесяцы - массив дат, на которые мне надо получить остатки по регистру накопления. На каждую из этих дат надо взять остатки и поместить в таблицу.
Запрос простейший: ВЫБРАТЬ | ЗадолженностьПоУдержаниямФизическихЛиц.Организация КАК Организация, | ЗадолженностьПоУдержаниямФизическихЛиц.ФизическоеЛицо КАК ФизическоеЛицо, | ЗадолженностьПоУдержаниямФизическихЛиц.Удержание КАК Удержание, | ЗадолженностьПоУдержаниямФизическихЛиц.ДокументОснование КАК ДокументОснование, | ЗадолженностьПоУдержаниямФизическихЛиц.СуммаОстаток КАК Сумма | ИЗ | РегистрНакопления.ЗадолженностьПоУдержаниямФизическихЛиц.Остатки( | &МесяцНачисления, | Организация = &ГоловнаяОрганизация | И ФизическоеЛицо В (&СписокФизическихЛиц)) КАК ЗадолженностьПоУдержаниямФизическихЛиц | Вот тут &МесяцНачисления - мне надо перебрать все даты из моего массива. Можно ли как-то переделать запрос, чтобы не выполнять его в цикле? Для каждого МесяцНачисления из масМесяцы цикл Запрос.УстановитьПараметр("МесяцНачисления", МесяцНачисления); тзИсточник = Запрос.Выполнить().Выгрузить(); ОбъединитьТаблицы(тзПриемник, тзИсточник); КонецЦикла; |
|||
1
Dmitriy_
Kolesnikov 26.09.19
✎
08:37
|
Аналогичный вопрос про виртуальную таблицу РегистрСведений.СрезПоследних
|
|||
2
Cyberhawk
26.09.19
✎
08:38
|
Остаток на каждую дату - классика же
|
|||
3
Cyberhawk
26.09.19
✎
08:38
|
Загоняешь нужные даты в одну таблицу, к ней уже присоединяешь остатки по дате
|
|||
4
Консультант Баранов
26.09.19
✎
08:47
|
(1) Как то так
ВЫБРАТЬ АвансовыйОтчет.Дата КАК ДатаИзНекоегоМассиваДат ПОМЕСТИТЬ втНекийМассивДат ИЗ Документ.АвансовыйОтчет КАК АвансовыйОтчет СГРУППИРОВАТЬ ПО АвансовыйОтчет.Дата ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦеныНоменклатуры.Период КАК Период, ЦеныНоменклатуры.Номенклатура КАК Номенклатура, МАКСИМУМ(ЦеныНоменклатуры.Цена) КАК Цена ПОМЕСТИТЬ втРегистрСведений ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры СГРУППИРОВАТЬ ПО ЦеныНоменклатуры.Период, ЦеныНоменклатуры.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ взРезультат.ДатаИзНекоегоМассиваДат КАК ДатаИзНекоегоМассиваДат, взРезультат.Период КАК Период, взРезультат.Номенклатура КАК Номенклатура, взРезультат.Цена КАК Цена ИЗ (ВЫБРАТЬ взПоследнийПериодНаДату.ДатаИзНекоегоМассиваДат КАК ДатаИзНекоегоМассиваДат, втРегистрСведений.Период КАК Период, втРегистрСведений.Номенклатура КАК Номенклатура, втРегистрСведений.Цена КАК Цена ИЗ (ВЫБРАТЬ втНекийМассивДат.ДатаИзНекоегоМассиваДат КАК ДатаИзНекоегоМассиваДат, МАКСИМУМ(втРегистрСведений.Период) КАК ПоследнийПериодНаДату, втРегистрСведений.Номенклатура КАК Номенклатура ИЗ втНекийМассивДат КАК втНекийМассивДат ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРегистрСведений КАК втРегистрСведений ПО втНекийМассивДат.ДатаИзНекоегоМассиваДат >= втРегистрСведений.Период СГРУППИРОВАТЬ ПО втНекийМассивДат.ДатаИзНекоегоМассиваДат, втРегистрСведений.Номенклатура) КАК взПоследнийПериодНаДату ВНУТРЕННЕЕ СОЕДИНЕНИЕ втРегистрСведений КАК втРегистрСведений ПО взПоследнийПериодНаДату.Номенклатура = втРегистрСведений.Номенклатура И взПоследнийПериодНаДату.ПоследнийПериодНаДату = втРегистрСведений.Период) КАК взРезультат |
|||
5
Cyberhawk
26.09.19
✎
08:49
|
(4) Ты с трехэтажными вложенными запросами пришел к нам из эпохы блинных HDD? )
|
|||
6
Консультант Баранов
26.09.19
✎
08:56
|
(5) А в чем проблема? Тут нет соединения нескольких вложенных запросов.
|
|||
7
Cyberhawk
26.09.19
✎
08:57
|
(6) Проблема в читаемости
|
|||
8
Консультант Баранов
26.09.19
✎
09:05
|
(7) Не соглашусь. Слишком много виртуальных таблиц ухудшает читабельность.
Если некую законченную операцию можно сделать в рамках одной вирт таблицы, с помощью вложенных запросов, ИМХО, так и надо поступать. |
|||
9
Birmingem
26.09.19
✎
09:38
|
(3)"Загоняешь нужные даты в одну таблицу, к ней уже присоединяешь остатки по дате"
А есть пример? |
|||
10
ptiz
26.09.19
✎
10:16
|
Пример "на каждый день", только надо переделать "на каждый месяц"
ВЫБРАТЬ РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Период ПОМЕСТИТЬ Дни ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь ГДЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Движения.Номенклатура КАК Номенклатура, ДНИ.Период КАК Период, СУММА(ВЫБОР КОГДА Движения.Период = &НачалоПериода ТОГДА Движения.КоличествоКонечныйОстаток ИНАЧЕ ВЫБОР КОГДА Движения.Период <= ДНИ.Период ТОГДА Движения.КоличествоОборот ИНАЧЕ 0 КОНЕЦ КОНЕЦ) КАК КоличествоКонечныйОстаток ИЗ Дни КАК ДНИ, РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , Номенклатура = &Номенклатура) КАК Движения СГРУППИРОВАТЬ ПО Движения.Номенклатура, ДНИ.Период УПОРЯДОЧИТЬ ПО Номенклатура, Период |
|||
11
Birmingem
26.09.19
✎
10:32
|
(10)Спасибо за пример!
Еще не очень силен в запросах. Можешь пояснить, правильно ли я понимаю этот запрос? - КОГДА Движения.Период = &НачалоПериода это вроде понятно, берем самый первый остаток на начало периода - КОГДА Движения.Период <= ДНИ.Период ТОГДА Движения.КоличествоОборот а здесь, прибавляем к предыдущему остатку сумму оборотов, таким образом считаем остаток на следующий день. Верно? |
|||
12
3achem
26.09.19
✎
10:54
|
(0) Создаёшь ТЗ с нужными датами, соединяешь со своей таблицей
|
|||
13
Dmitriy_
Kolesnikov 26.09.19
✎
13:04
|
(4) запросы с трехэтажной вложенностью трудно читаемы.
Временные таблицы в 100500 раз проще. Ответ на вопрос нашел здесь: https://helpf.pro/faq8/view/1499.html |
|||
14
ptiz
26.09.19
✎
15:22
|
(11) Верно.
|
|||
15
ptiz
26.09.19
✎
15:23
|
(11) Эта катавасия из-за того, что таблица ОстаткиИОбороты не выдается остатки за периоды, в которых не было движений.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |