Имя: Пароль:
1C
1С v8
Вариативный запрос по остаткам и оборотам номенклатуры (УТ 11.3.4.1)
0 BBDragon
 
01.08.17
10:57
Добрый день! Хочу сделать отчет по остаткам, оборотам и ценам номенклатуры за заданный период. В зависимости от типа регистратора (Поступление или Реализация) надо делать соответствующую выборку и выводить в отчет следующее:

Номенклатура, Нач.остаток, Приход, Расход, Кон.Остаток и после этого данные из регистраторов - наименование самого документа-регистратора, дата, цена товара, количество товара, сумма и контрагент.
Бьюсь уже 2 часа, что-то никак не соображу как сделать вариативный запрос. Т.е. в зависимости от типа документа после выполнения Выбрать
ТоварыНаСкладах.Регистратор КАК Документ

надо запрашивать данные по поступлению или реализации (а еще ведь возможно и перемещение товара!). Подскажите, пожалуйста, как это правильно оформить. Вот текущий код запроса:

ВЫБРАТЬ
    ТоварыНаСкладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг КАК Поступление,
    ТоварыНаСкладах.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг КАК Реализация
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТоварыНаСкладах.Период КАК Период,
    ТоварыНаСкладах.Регистратор КАК Документ,
    ТоварыНаСкладах.Регистратор.Дата КАК ДатаП,
    ТоварыНаСкладах.Номенклатура КАК Номенклатура,
    ТоварыНаСкладах.Склад КАК Склад,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток КАК НачальныйОстаток,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток КАК КонечныйОстаток,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииПриход КАК Приход,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход КАК Расход,
    ПоступлениеТоваровУслуг.Ссылка.Дата КАК Дата,
    ПоступлениеТоваровУслуг.Ссылка.Контрагент КАК Клиент,
    ПоступлениеТоваровУслуг.Ссылка.Номер КАК НомерДокумента,
    ПоступлениеТоваровУслугТовары.Номенклатура КАК Товар,
    ПоступлениеТоваровУслугТовары.Количество КАК Количество,
    ПоступлениеТоваровУслугТовары.Цена КАК Цена,
    ПоступлениеТоваровУслугТовары.Упаковка КАК ЕдИзм,
    ПоступлениеТоваровУслугТовары.Склад КАК СкладП,
    ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
    РеализацияТоваровУслуг.Ссылка.Дата КАК ДатаР,
    РеализацияТоваровУслуг.Ссылка.Контрагент КАК КлиентР,
    РеализацияТоваровУслуг.Ссылка.Номер КАК НомерДокументаР,
    РеализацияТоваровУслугТовары.Количество КАК КоличествоР,
    РеализацияТоваровУслугТовары.Цена КАК ЦенаР,
    РеализацияТоваровУслугТовары.Сумма КАК СуммаР
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты
        ПО ТоварыНаСкладах.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
            ПО ПоступлениеТоваровУслуг.Ссылка = ПоступлениеТоваровУслугТовары.Ссылка
        ПО (ТоварыНаСкладах.Номенклатура = ПоступлениеТоваровУслугТовары.Номенклатура)
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
            ПО РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугТовары.Ссылка
        ПО (ТоварыНаСкладах.Номенклатура = ПоступлениеТоваровУслугТовары.Номенклатура)
ГДЕ
    НЕ ПоступлениеТоваровУслуг.ПометкаУдаления

УПОРЯДОЧИТЬ ПО
    Период

Он не работает, естественно, вываливается с ошибкой "Недостаточно памяти"
1 BBDragon
 
01.08.17
11:15
Пардон, опечатка в конце запроса, исправил. Правда результат тот же - "Недостаточно памяти". База на SQL 2012, запускаю отчет на самом сервере, 32 Гб оперативки.

ВЫБРАТЬ
    ТоварыНаСкладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг КАК Поступление,
    ТоварыНаСкладах.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг КАК Реализация
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТоварыНаСкладах.Период КАК Период,
    ТоварыНаСкладах.Регистратор КАК Документ,
    ТоварыНаСкладах.Регистратор.Дата КАК ДатаП,
    ТоварыНаСкладах.Номенклатура КАК Номенклатура,
    ТоварыНаСкладах.Склад КАК Склад,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток КАК НачальныйОстаток,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток КАК КонечныйОстаток,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииПриход КАК Приход,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход КАК Расход,
    ПоступлениеТоваровУслуг.Ссылка.Дата КАК Дата,
    ПоступлениеТоваровУслуг.Ссылка.Контрагент КАК Клиент,
    ПоступлениеТоваровУслуг.Ссылка.Номер КАК НомерДокумента,
    ПоступлениеТоваровУслугТовары.Номенклатура КАК Товар,
    ПоступлениеТоваровУслугТовары.Количество КАК Количество,
    ПоступлениеТоваровУслугТовары.Цена КАК Цена,
    ПоступлениеТоваровУслугТовары.Упаковка КАК ЕдИзм,
    ПоступлениеТоваровУслугТовары.Склад КАК СкладП,
    ПоступлениеТоваровУслугТовары.Сумма КАК Сумма,
    РеализацияТоваровУслуг.Ссылка.Дата КАК ДатаР,
    РеализацияТоваровУслуг.Ссылка.Контрагент КАК КлиентР,
    РеализацияТоваровУслуг.Ссылка.Номер КАК НомерДокументаР,
    РеализацияТоваровУслугТовары.Количество КАК КоличествоР,
    РеализацияТоваровУслугТовары.Цена КАК ЦенаР,
    РеализацияТоваровУслугТовары.Сумма КАК СуммаР
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты
        ПО ТоварыНаСкладах.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
            ПО ПоступлениеТоваровУслуг.Ссылка = ПоступлениеТоваровУслугТовары.Ссылка
        ПО (ТоварыНаСкладах.Номенклатура = ПоступлениеТоваровУслугТовары.Номенклатура)
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
            ПО РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугТовары.Ссылка
        ПО (ТоварыНаСкладах.Номенклатура = РеализацияТоваровУслугТовары.Номенклатура)
ГДЕ
    НЕ ПоступлениеТоваровУслуг.ПометкаУдаления

УПОРЯДОЧИТЬ ПО
    Период
2 Dvoe4nik
 
01.08.17
12:03
(1) а для чего у тя первый запрос где выбираешь поступления и реализацию без условий отбора и не обращаешься к ним?
3 Джинн
 
01.08.17
12:28
(0) Бредовый отчет. Нет никаких "остатков по регистратору".
4 catena
 
01.08.17
12:33
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты
        ПО ТоварыНаСкладах.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура


Не удивительно, что памяти недостаточно. Ты умножаешь таблицу регистра на таблицу оборотов. Круто, правда?
5 BBDragon
 
01.08.17
13:17
(2) Просто создаю связку с документами, не нужно что ли? Или все в одном запросе лучше сделать?
(3) (4)
Я знаю, что неправильно. Подскажите, пожалуйста, как надо сделать
6 Ganiev
 
01.08.17
13:29
))) Получай все из ТоварыНаСкладахОстаткиИОбороты в выбранных полях сделай функцию по отдельным полям типа  что-то "Выбор когда ТоварыНаСкладахОстаткиИОбороты.Регистратор Ссылка Документ.ПоступлениеТоваровУслуг Тогда ТоварыНаСкладахОстаткиИОбороты.Регистратор Иначе Null Конец как ДатаП"
7 BBDragon
 
01.08.17
15:24
(6) Сделал вычисляемое поле ДатаДок с выражением:


Выбор
Когда ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОстаткиИОбороты.Регистратор)=ТИП(Документ.ПоступлениеТоваровУслуг) Тогда ПоступлениеТоваровУслуг.Ссылка.Дата
ИНАЧЕ
ВЫБОР
Когда ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОстаткиИОбороты.Регистратор)=ТИП(Документ.РеализацияТоваровУслуг) Тогда РеализацияТоваровУслуг.Ссылка.Дата Иначе NULL
Конец
КОНЕЦ

Однако СКД ругается: "Поле не найдено ПоступлениеТоваровУслуг.Ссылка.Дата".

Регистратор.Дата или ПоступлениеТоваровУслуг.Дата тоже не подходит.
8 Cyberhawk
 
01.08.17
15:25
(3) "Нет никаких "остатков по регистратору"" // Но есть последовательные движения на шкале времени ))
9 BBDragon
 
01.08.17
16:24
(8) Может вы подскажете как сделать то?
А то с утра никак толком не получится отчет доделать :(
10 Джинн
 
01.08.17
16:38
(8) Сегодня они такие, завтра они другие, ибо какой-то дятел порядок следования документов поменял...
11 Джинн
 
01.08.17
16:47
(9) Подсказываю - перестать заниматься онанизмом и использовать типовые отчеты. Они вполне достойно решают бизнес-задачу.
12 BBDragon
 
01.08.17
17:17
(11) Если бы можно было обойтись простыми - я бы так и сделал. Есть конкретное задание, над ним и бьюсь
13 Cyberhawk
 
01.08.17
18:58
(9) "подскажете как сделать то?" // А что требуется-то? Я вроде издалека намекал, а в (10) взяли и разжевали )
14 BBDragon
 
02.08.17
10:12
(13) У меня не работает запрос, я и спросил - как его исправить? Неужели на всем форуме никто не может ответить? Для профи же это пара пустяков
15 BBDragon
 
02.08.17
10:13
Я и книги Хрусталевой пересмотрел вчера, не нашел подобного запроса. Есть попроще, но это я и сам могу, а вот чтобы увязать столько данных в одном отчете - нигде не нашел.
16 catena
 
02.08.17
10:20
(14)Этот запрос надо заново переписывать. А всем лень возиться. Погоди, может найдется добрая душа, разжует.
17 vicof
 
02.08.17
10:49
(12) А если тебе скажут с крыши прыгнуть, тоже прыгнешь?
(11) +100500
И вообще задача не озвучена. Но она явно идиотская.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой