Имя: Пароль:
1C
1С v8
Обороты за разные периоды в одном запросе.
0 vicof
 
06.11.13
12:13
1. СКД поможет 50% (1)
2. Отказать 50% (1)
3. Можно только соединениями 0% (0)
Всего мнений: 2

Всем привет.
Грубо говоря, есть отгрузки торгового оборудования (один регистр) и продажи (второй регистр).
Пользователи хотят отчет за период, в котором хотят видеть
номенклатуру, дату прихода ТО, дату расхода ТО (если она была) и оборот по этой номенклатуре из второго регистра.

Причем обороты должны считаться за даты с начала периода до даты окончания (или возврата, если был возврат).

Собственно вопрос, можно ли в одном запросе соединить отгрузки и обороты за разные периоды по каждой номенклатуре? Что-то типа среза последних на каждую дату, только с оборотами.

Или лепить 25 тыщ соединений за разные периоды?

Или вообще вежливо пользователю с такой хотелкой?
1 vicof
 
06.11.13
12:14
* Вежливо отказать...
2 shuhard
 
06.11.13
12:20
(0) не делай это на СКД

Отказать
3 vicof
 
06.11.13
12:21
(2) Ну а вообще реально это сделать в запросе, не лепя кучу соединений, пусть даже не на скд?
4 1dvd
 
06.11.13
12:24
(3) Воспользуйся ВТ, если у тебя джоинофобия
5 Skom
 
06.11.13
12:26
Типа так

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Д.Номенклатура
    ,Продажи.Регистратор КАК Чек
    ,Продажи.Регистратор.СуммаДокумента КАК Сумма
    //,Продажи.Номенклатура КАК Номенклатура

    ,СУММА(isnull(Продажи.СтоимостьОборот,0)) КАК СуммаСтроки
    ,СУММА(isnull(ПродажиСебестоимость.СтоимостьОборот,0)) КАК Себестоимость
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Д
ЛЕВОЕ СОЕДИНЕНИЕ
   РегистрНакопления.Продажи.Обороты(,,Регистратор,) КАК Продажи ПО Продажи.Регистратор = Д.Ссылка И Продажи.Номенклатура = Д.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрНакопления.ПродажиСебестоимость.Обороты(,,Регистратор,) КАК ПродажиСебестоимость
                                            ПО ПродажиСебестоимость.Регистратор = Д.Ссылка И ПродажиСебестоимость.Номенклатура = Д.Номенклатура
ГДЕ
    
    Д.Ссылка В (&Док)
СГРУППИРОВАТЬ ПО
    Продажи.Регистратор,
    Д.Номенклатура,
    Продажи.Регистратор.СуммаДокумента
АВТОУПОРЯДОЧИВАНИЕ
6 1dvd
 
06.11.13
12:28
(5) Извините. Вы с SQL работали до появления воьмёрки? Что-то уж больно стиль написания запроса напоминает...
7 Skom
 
06.11.13
12:29
(6) ага))
меня коробит писать ЕСТЬNULL()
8 Skom
 
06.11.13
12:31
(0) у тебя в запросе будет всего 2 периода? или их может быть множество.
9 1dvd
 
06.11.13
12:36
(7) больше запятая перед параметром выдаёт :)
10 Skom
 
06.11.13
12:37
Для отладки так удобнее.
11 vicof
 
06.11.13
12:38
12 Skom
 
06.11.13
12:41
тогда в запросе сложнее
13 vicof
 
06.11.13
12:42
я в запросе вижу пока только одно решение - количество соединений по количеству разных периодов.
14 Skom
 
06.11.13
12:43
как ты их в запросе то увидишь?
15 Ofizer
 
06.11.13
12:45
(13) видимо только так, тоже других вариантов не вижу
16 vicof
 
06.11.13
12:58
(14) Да, тоже вопрос. Добавляется еще программная обработка
17 Skom
 
06.11.13
13:03
что-то не соображу как у тебя это получится
18 sirsp
 
06.11.13
13:08
(0) Так что ли?

ВЫБРАТЬ "Н1" Номенклатура, ДАТАВРЕМЯ(2013, 1, 1) ДатаРеализации, ДАТАВРЕМЯ(2013, 9, 12) ДатаВозврата
ПОМЕСТИТЬ Рег1
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н2", ДАТАВРЕМЯ(2013, 5, 16), ДАТАВРЕМЯ(1, 1, 1)
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н3", ДАТАВРЕМЯ(2013, 1, 5), ДАТАВРЕМЯ(2013, 8, 7)
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н4", ДАТАВРЕМЯ(2013, 1, 9), ДАТАВРЕМЯ(2013, 12, 16)
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н5", ДАТАВРЕМЯ(2013, 2, 17), ДАТАВРЕМЯ(1, 1, 1)
;
ВЫБРАТЬ "Н1" Номенклатура, ДАТАВРЕМЯ(2013, 1, 2) Период, 100 СуммаОборот
ПОМЕСТИТЬ Рег2
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н1", ДАТАВРЕМЯ(2013, 7, 12), -200
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н1", ДАТАВРЕМЯ(2013, 9, 20), 100

ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н2" Номенклатура, ДАТАВРЕМЯ(2013, 1, 3) Период, 500 СуммаОборот
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н2", ДАТАВРЕМЯ(2013, 6, 1), -300
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Н2", ДАТАВРЕМЯ(2013, 9, 1), 200

//etc
;

//Основной запрос
ВЫБРАТЬ
    Рег1.Номенклатура
    ,Рег1.ДатаРеализации
    ,Рег1.ДатаВозврата
    ,СУММА(Рег2.СуммаОборот) ОборотыЗапериод
ИЗ
    Рег1
    ЛЕВОЕ СОЕДИНЕНИЕ
    Рег2
    ПО
        Рег2.Период МЕЖДУ Рег1.ДатаРеализации И ВЫБОР КОГДА Рег1.ДатаВозврата = ДАТАВРЕМЯ(1, 1, 1) ТОГДА &КонецПериода ИНАЧЕ Рег1.ДатаВозврата КОНЕЦ
СГРУППИРОВАТЬ ПО
    Рег1.Номенклатура
    ,Рег1.ДатаРеализации
    ,Рег1.ДатаВозврата
19 DexterMorgan
 
06.11.13
13:16
Скд, два набора данных, при соединении передавай параметры ДатаНач и ДатаКон во второй набор

СКД поможет
20 vicof
 
06.11.13
13:26
(18) Похоже на то, но, блин, это громоздко и медленно шокапец.
(19) Вот, собственно, что я и хотел услышать. Щас посмотрю, что Хрусталева предлагает по этому поводу.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший