|
Раскидать сумму по месяцам. | ☑ | ||
---|---|---|---|---|
0
sw_sw
07.02.20
✎
08:56
|
О боги 1с, помогите!
Отчет в СКД. Имеем регистр сведений с полями: ДатаНач ДатаКон Сумма Надо получить колонки месяцев и разбить сумму по этим месяцам. Сумму разбить поровну независимо от количества дней. Например: ДатаНач 15.01.2020 ДатаКон 20.04.2020 Сумма 100 Итог из четырех колонок (янв, фев, март и апр) с суммами по 25. Программно как бы сделать не проблема, но надо в СКД. Есть ли какие-либо способы? |
|||
1
vicof
07.02.20
✎
09:10
|
Соединить даты с суммами и разделить сумму на количество различных месяцев
|
|||
2
Ненавижу 1С
гуру
07.02.20
✎
09:11
|
в итоге то, что получить надо? а так есть производственные календари
|
|||
3
sw_sw
07.02.20
✎
09:29
|
(1) чет не совсем понял. Как это соединить даты с суммами. И как получить различные месяца?
|
|||
4
sw_sw
07.02.20
✎
09:33
|
(2) Итог из четырех колонок (янв, фев, март и апр) с суммами по 25.
на счет календаря надо подумать |
|||
5
vicof
07.02.20
✎
09:35
|
(3) внутренним или левым соединением в зависимости от задачи
|
|||
6
Vadim_37
07.02.20
✎
10:13
|
Держи:
ВЫБРАТЬ РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаНач, МЕСЯЦ), КОНЕЦПЕРИОДА(&ДатаКон, МЕСЯЦ), МЕСЯЦ) + 1 КАК Поле1 ПОМЕСТИТЬ ВТЧислоМесяцев ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ 1 КАК Поле1 ПОМЕСТИТЬ ВТМесяца ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 10 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 11 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 12 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВЫБОР КОГДА ВТМесяца.Поле1 <= ВТЧислоМесяцев.Поле1 ТОГДА ВТМесяца.Поле1 ИНАЧЕ NULL КОНЕЦ КАК Поле1 ПОМЕСТИТЬ ВТПериоды ИЗ ВТМесяца КАК ВТМесяца, ВТЧислоМесяцев КАК ВТЧислоМесяцев ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТПериоды.Поле1 КАК Поле1 ПОМЕСТИТЬ ВТНашиПериоды ИЗ ВТПериоды КАК ВТПериоды ГДЕ НЕ ВТПериоды.Поле1 ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МЕСЯЦ(ДОБАВИТЬКДАТЕ(&ДатаНач, МЕСЯЦ, ВТНашиПериоды.Поле1 - 1)) КАК Поле1, &ОбщаяСумма / ВТЧислоМесяцев.Поле1 КАК Поле2 ИЗ ВТНашиПериоды КАК ВТНашиПериоды, ВТЧислоМесяцев КАК ВТЧислоМесяцев |
|||
7
sw_sw
07.02.20
✎
15:02
|
(6) Выглядит как велосипед, но работает! Спасибо тебе большое!
|
|||
8
_Дайвер_
07.02.20
✎
15:14
|
Херня, в СКД можно по полю даты раскидать все по месяцам
|
|||
9
lodger
07.02.20
✎
15:15
|
(7) ты ж проблему решить должен не в запросе, а в скд. не?
в скд это делается 2мя наборами данных со связью через параметр Период. и вычисляемым полем \ итогами. |
|||
10
sw_sw
07.02.20
✎
15:18
|
(8) Больше информации, больше, пжста!
|
|||
11
sw_sw
07.02.20
✎
15:19
|
(9) Надо переварить это. К вечеру уже туго соображаю.
|
|||
12
Said_We
07.02.20
✎
15:26
|
(0) Еще надо копейки округления раскидать. Например в первую строку с месяцем.
Месяцев может быть и не 12, а любое количество, но это количество не огромно, максим, например 120 (10 лет). |
|||
13
sw_sw
07.02.20
✎
15:52
|
(12) Это да
|
|||
14
pechkin
07.02.20
✎
16:00
|
лучше не делать это в запросе
|
|||
15
Said_We
07.02.20
✎
16:04
|
(14) Можно и в запросе.
|
|||
16
_Дайвер_
07.02.20
✎
16:09
|
Могу набросать обработку для примера, или вот читай
https://its.1c.ru/db/metod8dev/content/1587/hdoc |
|||
17
_Дайвер_
07.02.20
✎
16:10
|
Для "Надо получить колонки месяцев и разбить сумму по этим месяцам. Сумму разбить поровну независимо от количества дней."
Используй вычисляемые поля |
|||
18
Vadim_37
07.02.20
✎
16:16
|
(16) надо регистр периодический. В (0) нет такой инфы
|
|||
19
Джинн
07.02.20
✎
16:18
|
(6) Зачет такой изврат? Собрать ВТ с месяцами и соединить ее с основной таблицей по началу периода месяц.
|
|||
20
Said_We
07.02.20
✎
16:38
|
Набросал без сильной проверки и тестирования:
ВЫБРАТЬ 0 КАК А ПОМЕСТИТЬ ВТ_Два ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 11 ВТ_Два.А * 3 + ВТ_Два1.А * 2 + ВТ_Два2.А КАК А ПОМЕСТИТЬ ВТ_Десять ИЗ ВТ_Два КАК ВТ_Два, ВТ_Два КАК ВТ_Два1, ВТ_Два КАК ВТ_Два2 УПОРЯДОЧИТЬ ПО А ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ВТ_Два ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 37 ВТ_Десять.А * 10 + ВТ_Десять1.А КАК А ПОМЕСТИТЬ ВТ_36 ИЗ ВТ_Десять КАК ВТ_Десять, ВТ_Десять КАК ВТ_Десять1 УПОРЯДОЧИТЬ ПО А ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ВТ_Десять ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДАТАВРЕМЯ(2020, 1, 1) КАК ДатаН, ДАТАВРЕМЯ(2020, 6, 1) КАК ДатаК, 100.05 КАК Сумма ПОМЕСТИТЬ ВТ_ВходныеДанные ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.А КАК А, ВложенныйЗапрос.ДатаН КАК ДатаН, ВложенныйЗапрос.ДатаК КАК ДатаК, ВложенныйЗапрос.Сумма КАК Сумма, ВложенныйЗапрос.Месяц КАК Месяц ПОМЕСТИТЬ ВТ_ПоМесяцам ИЗ (ВЫБРАТЬ ВТ_36.А КАК А, ВТ_ВходныеДанные.ДатаН КАК ДатаН, ВТ_ВходныеДанные.ДатаК КАК ДатаК, ВТ_ВходныеДанные.Сумма КАК Сумма, ДОБАВИТЬКДАТЕ(ВТ_ВходныеДанные.ДатаН, МЕСЯЦ, ВТ_36.А) КАК Месяц ИЗ ВТ_ВходныеДанные КАК ВТ_ВходныеДанные, ВТ_36 КАК ВТ_36) КАК ВложенныйЗапрос ГДЕ ВложенныйЗапрос.Месяц <= КОНЕЦПЕРИОДА(ВложенныйЗапрос.ДатаК, МЕСЯЦ) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_ПоМесяцам.Месяц) КАК Месяц ПОМЕСТИТЬ ВТ_КоличествоМесяцев ИЗ ВТ_ПоМесяцам КАК ВТ_ПоМесяцам ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ПоМесяцам.А КАК А, ВТ_ПоМесяцам.ДатаН КАК ДатаН, ВТ_ПоМесяцам.ДатаК КАК ДатаК, ВТ_ПоМесяцам.Сумма КАК Сумма, ВТ_ПоМесяцам.Месяц КАК Месяц, ВЫРАЗИТЬ(ВЫБОР КОГДА ВТ_КоличествоМесяцев.Месяц = 0 ТОГДА 0 ИНАЧЕ ВТ_ПоМесяцам.Сумма / ВТ_КоличествоМесяцев.Месяц КОНЕЦ КАК ЧИСЛО(15, 2)) КАК СуммаМесяц ПОМЕСТИТЬ ВТ_СуммаПоМесяцам ИЗ ВТ_ПоМесяцам КАК ВТ_ПоМесяцам, ВТ_КоличествоМесяцев КАК ВТ_КоличествоМесяцев ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_СуммаПоМесяцам.Сумма - СУММА(ВТ_СуммаПоМесяцам.СуммаМесяц) КАК Дельта ПОМЕСТИТЬ ВТ_Дельта ИЗ ВТ_СуммаПоМесяцам КАК ВТ_СуммаПоМесяцам СГРУППИРОВАТЬ ПО ВТ_СуммаПоМесяцам.Сумма ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.А КАК А, ВложенныйЗапрос.Копейка КАК Копейка ПОМЕСТИТЬ ВТ_КопейкиОкругленияПоМесяцам ИЗ (ВЫБРАТЬ ВложенныйЗапрос.А КАК А, ВложенныйЗапрос.Копейка КАК Копейка, ВЫБОР КОГДА ВложенныйЗапрос.Дельта >= 0 ТОГДА (ВложенныйЗапрос.А + 1) * ВложенныйЗапрос.Копейка <= ВложенныйЗапрос.Дельта ИНАЧЕ (ВложенныйЗапрос.А + 1) * ВложенныйЗапрос.Копейка >= ВложенныйЗапрос.Дельта КОНЕЦ КАК УсловиеВыполняется ИЗ (ВЫБРАТЬ ВЫБОР КОГДА ВТ_Дельта.Дельта >= 0 ТОГДА 0.01 ИНАЧЕ -0.01 КОНЕЦ КАК Копейка, ВТ_36.А КАК А, ВТ_Дельта.Дельта КАК Дельта ИЗ ВТ_36 КАК ВТ_36, ВТ_Дельта КАК ВТ_Дельта) КАК ВложенныйЗапрос) КАК ВложенныйЗапрос ГДЕ ВложенныйЗапрос.УсловиеВыполняется ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_СуммаПоМесяцам.А КАК А, ВТ_СуммаПоМесяцам.ДатаН КАК ДатаН, ВТ_СуммаПоМесяцам.ДатаК КАК ДатаК, ВТ_СуммаПоМесяцам.Сумма КАК Сумма, ВТ_СуммаПоМесяцам.Месяц КАК Месяц, ВТ_СуммаПоМесяцам.СуммаМесяц + ЕстьNULL(ВТ_КопейкиОкругленияПоМесяцам.Копейка, 0) КАК СуммаМесяц, ВТ_КопейкиОкругленияПоМесяцам.Копейка КАК Копейка ИЗ ВТ_СуммаПоМесяцам КАК ВТ_СуммаПоМесяцам ЛЕВОЕ СОЕДИНЕНИЕ ВТ_КопейкиОкругленияПоМесяцам КАК ВТ_КопейкиОкругленияПоМесяцам ПО ВТ_СуммаПоМесяцам.А = ВТ_КопейкиОкругленияПоМесяцам.А ИТОГИ МАКСИМУМ(Сумма), СУММА(СуммаМесяц), СУММА(Копейка) ПО ОБЩИЕ |
|||
21
Said_We
07.02.20
✎
16:39
|
(20) Без оптимизации и индексов, без удаления не используемых таблиц, без удаления лишних полей в виртуальных таблицах
|
|||
22
Said_We
07.02.20
✎
16:44
|
(20) (21) Это только как вариант, как это можно сделать. Понятно что в (0) не только даты и сумма, а есть ещё какие-то ключевые поля, по которым эти даты и суммы. Соответственно в запрос это счастье добавлять надо и дорисовывать. И там где есть связь по этим полям будут не просто декартово умножение, а левое соединение и т.д.
|
|||
23
Said_We
07.02.20
✎
17:24
|
(0) А в СКД это будет или не в СКД - какая разница?
|
|||
25
Said_We
07.02.20
✎
18:11
|
(19) А как ты по месяцам будешь бить в запросе. Вместо одной строки надо получить несколько. Для этого надо эти несколько строк иметь. Для этого порождающий запрос на столько строк сколько достаточно.
|
|||
26
Said_We
10.02.20
✎
08:51
|
(17) Копейки округления с помощью вычисляемых полей как будешь раскидывать?
На вскидку даже не придумаю как. |
|||
27
Said_We
10.02.20
✎
13:47
|
(0) В (20) проверил код? Подойдет?
|
|||
28
Said_We
10.02.20
✎
16:09
|
(16), (18) в периоидическом РС поле период есть. Тут другие названия полей. Сделал вывод что речь о простой таблице. Скорее всего план за период, необходимо раскидать по месяцам.
|
|||
29
seevkik
10.02.20
✎
16:40
|
А чё, разность дат уже отменили?
|
|||
30
seevkik
10.02.20
✎
16:43
|
Что-то типа
сумма / разностьдат(&начало периода, &окончаниепериода, месяц) |
|||
31
seevkik
10.02.20
✎
16:45
|
Аа, дело то в дополнении пустыми датами - этого дела в интернете пруд пруди, выбирай не хочу
|
|||
32
Said_We
10.02.20
✎
16:51
|
(30) Как количество месяцев считать, не важно. В (20) алгоритм как разбросать копейки. Опять же это просто вариант без оптимизации - как правильнее количество месяцев посчитать и т.д. Это совсем не основная часть.
|
|||
33
seevkik
10.02.20
✎
16:57
|
(32) сильно, но для скд подойдёт округление до рубля пожалуй, схороню)
|
|||
34
sdf
10.02.20
✎
19:23
|
||||
35
Said_We
10.02.20
✎
21:45
|
(34) Да полно подобного кода распределения сумм.
|
|||
36
sw_sw
12.02.20
✎
14:43
|
(20) Огромное, огромное спасибо!!! Прямо супер! Сам бы я до такого не дошел. Жму руку!
Немного подправил под себя, так как в примере не учитывается возможность нескольких строк с исходными данными. В остальном ничего не менял. Всё работает! |
|||
37
sw_sw
12.02.20
✎
14:51
|
У меня вот в таком варианте:
ВЫБРАТЬ 0 КАК А ПОМЕСТИТЬ ВТ_Два ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 11 ВТ_Два.А * 3 + ВТ_Два1.А * 2 + ВТ_Два2.А КАК А ПОМЕСТИТЬ ВТ_Десять ИЗ ВТ_Два КАК ВТ_Два, ВТ_Два КАК ВТ_Два1, ВТ_Два КАК ВТ_Два2 УПОРЯДОЧИТЬ ПО А ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ВТ_Два ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 37 ВТ_Десять.А * 10 + ВТ_Десять1.А КАК А ПОМЕСТИТЬ ВТ_36 ИЗ ВТ_Десять КАК ВТ_Десять, ВТ_Десять КАК ВТ_Десять1 УПОРЯДОЧИТЬ ПО А ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ВТ_Десять ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ "Объект1" КАК Поле1, ДАТАВРЕМЯ(2020, 1, 1) КАК ДатаН, ДАТАВРЕМЯ(2020, 6, 1) КАК ДатаК, 100.05 КАК Сумма ПОМЕСТИТЬ ВТ_ВходныеДанные ОБЪЕДИНИТЬ ВЫБРАТЬ "Объект2", ДАТАВРЕМЯ(2020, 3, 1), ДАТАВРЕМЯ(2020, 7, 1), 300.06 ОБЪЕДИНИТЬ ВЫБРАТЬ "Объект3", ДАТАВРЕМЯ(2020, 1, 1), ДАТАВРЕМЯ(2020, 3, 1), 300.02 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.А КАК А, ВложенныйЗапрос.Поле1 КАК Поле1, ВложенныйЗапрос.ДатаН КАК ДатаН, ВложенныйЗапрос.ДатаК КАК ДатаК, ВложенныйЗапрос.Сумма КАК Сумма, ВложенныйЗапрос.Месяц КАК Месяц ПОМЕСТИТЬ ВТ_ПоМесяцам ИЗ (ВЫБРАТЬ ВТ_36.А КАК А, ВТ_ВходныеДанные.Поле1 КАК Поле1, ВТ_ВходныеДанные.ДатаН КАК ДатаН, ВТ_ВходныеДанные.ДатаК КАК ДатаК, ВТ_ВходныеДанные.Сумма КАК Сумма, ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ВТ_ВходныеДанные.ДатаН, МЕСЯЦ), МЕСЯЦ, ВТ_36.А) КАК Месяц ИЗ ВТ_ВходныеДанные КАК ВТ_ВходныеДанные, ВТ_36 КАК ВТ_36) КАК ВложенныйЗапрос ГДЕ ВложенныйЗапрос.Месяц <= КОНЕЦПЕРИОДА(ВложенныйЗапрос.ДатаК, МЕСЯЦ) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ПоМесяцам.А КАК А, ВТ_ПоМесяцам.Поле1 КАК поле1, ВТ_ПоМесяцам.ДатаН КАК ДатаН, ВТ_ПоМесяцам.ДатаК КАК ДатаК, ВТ_ПоМесяцам.Сумма КАК Сумма, ВТ_ПоМесяцам.Месяц КАК Месяц, ВЫРАЗИТЬ(ВТ_ПоМесяцам.Сумма / РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ВТ_ПоМесяцам.ДатаН, МЕСЯЦ), ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(ВТ_ПоМесяцам.ДатаК, МЕСЯЦ), СЕКУНДА, 1), МЕСЯЦ) КАК ЧИСЛО(15, 2)) КАК СуммаМесяц ПОМЕСТИТЬ ВТ_СуммаПоМесяцам ИЗ ВТ_ПоМесяцам КАК ВТ_ПоМесяцам ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_СуммаПоМесяцам.поле1, ВТ_СуммаПоМесяцам.Сумма - СУММА(ВТ_СуммаПоМесяцам.СуммаМесяц) КАК Дельта ПОМЕСТИТЬ ВТ_Дельта ИЗ ВТ_СуммаПоМесяцам КАК ВТ_СуммаПоМесяцам СГРУППИРОВАТЬ ПО ВТ_СуммаПоМесяцам.Сумма, ВТ_СуммаПоМесяцам.поле1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.поле1, ВложенныйЗапрос.А КАК А, ВложенныйЗапрос.Копейка КАК Копейка ПОМЕСТИТЬ ВТ_КопейкиОкругленияПоМесяцам ИЗ (ВЫБРАТЬ ВложенныйЗапрос.поле1 КАК поле1, ВложенныйЗапрос.А КАК А, ВложенныйЗапрос.Копейка КАК Копейка, ВЫБОР КОГДА ВложенныйЗапрос.Дельта >= 0 ТОГДА (ВложенныйЗапрос.А + 1) * ВложенныйЗапрос.Копейка <= ВложенныйЗапрос.Дельта ИНАЧЕ (ВложенныйЗапрос.А + 1) * ВложенныйЗапрос.Копейка >= ВложенныйЗапрос.Дельта КОНЕЦ КАК УсловиеВыполняется ИЗ (ВЫБРАТЬ ВТ_Дельта.поле1 КАК поле1, ВЫБОР КОГДА ВТ_Дельта.Дельта >= 0 ТОГДА 0.01 ИНАЧЕ -0.01 КОНЕЦ КАК Копейка, ВТ_36.А КАК А, ВТ_Дельта.Дельта КАК Дельта ИЗ ВТ_36 КАК ВТ_36, ВТ_Дельта КАК ВТ_Дельта) КАК ВложенныйЗапрос) КАК ВложенныйЗапрос ГДЕ ВложенныйЗапрос.УсловиеВыполняется ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_СуммаПоМесяцам.поле1 КАК Поле1, ВТ_СуммаПоМесяцам.ДатаН КАК ДатаН, ВТ_СуммаПоМесяцам.ДатаК КАК ДатаК, ВТ_СуммаПоМесяцам.Сумма КАК Сумма, ВТ_СуммаПоМесяцам.Месяц КАК Месяц, ВТ_СуммаПоМесяцам.СуммаМесяц + ЕСТЬNULL(ВТ_КопейкиОкругленияПоМесяцам.Копейка, 0) КАК СуммаМесяц, ВТ_КопейкиОкругленияПоМесяцам.Копейка КАК Копейка ИЗ ВТ_СуммаПоМесяцам КАК ВТ_СуммаПоМесяцам ЛЕВОЕ СОЕДИНЕНИЕ ВТ_КопейкиОкругленияПоМесяцам КАК ВТ_КопейкиОкругленияПоМесяцам ПО ВТ_СуммаПоМесяцам.А = ВТ_КопейкиОкругленияПоМесяцам.А И ВТ_СуммаПоМесяцам.поле1 = ВТ_КопейкиОкругленияПоМесяцам.поле1 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |