Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Запрос из двух регистров накопления

Запрос из двух регистров накопления
Я
   88g88
 
12.09.16 - 16:27
Здравствуйте форумчане.

Есть вопрос по запросам из регистров, вопрос в следующем.
Необходимо собрать запросом информацию из 2х и более регистров.
Общее поле "номенклатура" остальные данные как правило остатки на конец периода.
Столкнулся со следующей сложностью.
Таблица первая из запроса не показывает пустые значения.
Примерно выглядит так.
Номенклатура|    Остаток|Заказанно
1           |     5    |    2        
2           |     8    |    5  
3           |     6    |    Null        
4           |     3    |    5          
5           |     1    |    Null
Проблема в том что есть пустые строчки по остатку,
но они не попадают в отборку.
То есть вторая таблица выводит пустые значения а первая нет.
            
Запрос.
ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК Остаток,
    СУММА(ЗаказыПоставщикамОстаткиИОбороты.КоличествоКонечныйОстаток) КАК Заказанно
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ТоварыНаСкладахОстаткиИОбороты
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ЗаказыПоставщикамОстаткиИОбороты
        ПО ТоварыНаСкладахОстаткиИОбороты.Номенклатура = ЗаказыПоставщикамОстаткиИОбороты.Номенклатура
ГДЕ
    ТоварыНаСкладахОстаткиИОбороты.Склад В ИЕРАРХИИ(&Склад)
    И ТоварыНаСкладахОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)

СГРУППИРОВАТЬ ПО
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура

УПОРЯДОЧИТЬ ПО
    Номенклатура
Конец запроса.
Платформа 1С:Предприятие 8.3 (8.3.4.437)
Конфа     Управление производственным предприятием, редакция 1.3

Подскажите, где ошибся?
 
 
   Nuobu
 
1 - 12.09.16 - 16:29
Левое а не полное.
   88g88
 
2 - 12.09.16 - 16:30
(1) Левое сделал, результат тот же.
   Рэйв
 
3 - 12.09.16 - 16:31
+Чтобы не париться ЕстьNull(Чтото,0) КАК Чтото
   Nuobu
 
4 - 12.09.16 - 16:31
(2) ЕстьNull нигде не забыл? В отборах второй таблицы нету?
   88g88
 
5 - 12.09.16 - 16:33
(4) не писал не в первую не во вторую.
   88g88
 
6 - 12.09.16 - 16:34
собрал в консоли запросов. ЕстьNull не прописывал.
   ovrfox
 
7 - 12.09.16 - 16:36
Нужно первой таблицей ставить справочник номенклатура, второй и третьей - соотвествующие регистры через левое соединение со справочником. В конце условие типа
Не Рег1.Остаток Есть Null
ИЛИ НЕ Рег2.Остаток Есть Null
   88g88
 
8 - 12.09.16 - 16:40
(7) пробую...
   88g88
 
9 - 12.09.16 - 16:49
(7) номенклатура не цепляется.
не наименованием не ссылкой.
   Niveus
 
10 - 12.09.16 - 16:50
КОГДА ТоварыНаСкладахОстаткиИОбороты.Номенклатура ЕСТЬ NULL 
            ТОГДА ЗаказыПоставщикамОстаткиИОбороты.Номенклатура
        ИНАЧЕ ТоварыНаСкладахОстаткиИОбороты.Номенклатура

Так не получиться разве?
 
 Рекламное место пустует
   88g88
 
11 - 12.09.16 - 16:58
(10) Я верно понял?
ВЫБРАТЬ
    КОГДА ТоварыНаСкладахОстаткиИОбороты.Номенклатура ЕСТЬ NULL 
    ТОГДА ЗаказыПоставщикамОстаткиИОбороты.Номенклатура 
    ИНАЧЕ ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК Остаток,
    СУММА(ЗаказыПоставщикамОстаткиИОбороты.КоличествоКонечныйОстаток) КАК Заказанно
_______________________________________________
Ошибка при вызове метода контекста (Выполнить): {(2, 2)}: Синтаксическая ошибка "КОГДА"
<<?>>КОГДА ТоварыНаСкладахОстаткиИОбороты.Номенклатура ЕСТЬ NULL
   Niveus
 
12 - 12.09.16 - 17:09
У вас Не соединение , а условие все выкидывает в вашем запросе
   88g88
 
13 - 12.09.16 - 17:23
(12) я не против. как верно то?
пробовал вместо справочника указывать не 
ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
а
РегистрНакопления.ТоварыНаСкладах.Номенклатура КАК Номенклатура,
два левых соединения к 
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты
РегистрНакопления.ЗаказыПоставщикам.ОстаткиИОбороты

тогда формирует с и остаток и заказ с значениями null, но периодичность указать не получается на РегистрНакопления.ТоварыНаСкладах и все цифры разлетаются.
   youalex
 
14 - 12.09.16 - 18:43
(10) можно короче:
isnull(ТоварыНаСкладахОстаткиИОбороты.Номенклатура, ЗаказыПоставщикамОстаткиИОбороты.Номенклатура )
   mkalimulin
 
15 - 12.09.16 - 20:05
(13) Почему ОстаткиИОбороты, а не просто Остатки?
   Chameleon1980
 
16 - 12.09.16 - 20:14
выше говорили.
лепи левым к номенклатуре
   Dmitrii
 
17 - 12.09.16 - 20:37
А потом все спрашивают "для чего нужны экзамены 1С Специалист?"...
Именно для того, чтобы больно бить линейкой по рукам таким вот запросописателям.

Первая грубая ошибка: запрос к таблицам ОстаткиИОбороты, когда нужны только Остатки.
Вторая грубая ошибка - группировка. Она тут нафиг не нужна. Виртуальные таблицы выдают данные из физических таблиц итогов, где данные хранятся уже в сгруппированном виде.
Третья грубая ошибка - условия на измерения в разделе "ГДЕ" вместо параметров.
Ну и наконец - неспособность применить ЕСТЬNULL и связать с таблицей справочника.

А, например, в СКД подобные задачи решаются объединением двух таблиц. СКД сама сгруппирует и упорядочит их по номенклатуре при указании суммируемых ресурсов (остаток и Заказно) и выводе в группировке по полю Номенклатура:

 ВЫБРАТЬ 
  ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
  ТоварыНаСкладахОстатки.КоличествоКонечныйОстаток КАК Остаток,
  0 КАК Заказанно
 ИЗ
  РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, Склад В ИЕРАРХИИ (&Склад) И Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ТоварыНаСкладахОстатки
 ОБЪЕДИНИТЬ ВСЕ 
  ЗаказыПоставщикамОстатки.Номенклатура,
  0,
  ЗаказыПоставщикамОстатки.КоличествоКонечныйОстаток
ИЗ
  РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонецПериода, Склад В ИЕРАРХИИ (&Склад) И Номенклатура В ИЕРАРХИИ (&Номенклатура))    
 КАК ЗаказыПоставщикамОстатки

PS Текст может содержать ошибки - писал вручную.
   Chameleon1980
 
18 - 13.09.16 - 08:00
не нужно всех в скд
пусть поймут сначала
   88g88
 
19 - 20.09.16 - 14:49
Решение такое короче
   88g88
 
20 - 20.09.16 - 14:50
немного монструозное, но работает!
__________________________________
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
|    ТоварыНаСкладахОстаткиИОбороты.Склад,
|    СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК Остаток
|ПОМЕСТИТЬ Остатки
|ИЗ
|    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ТоварыНаСкладахОстаткиИОбороты
|ГДЕ
|    ТоварыНаСкладахОстаткиИОбороты.Склад В ИЕРАРХИИ(&Склад)
|    И ТоварыНаСкладахОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)
|
|СГРУППИРОВАТЬ ПО
|    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
|    ТоварыНаСкладахОстаткиИОбороты.Склад
|;
|
////////////////////////////////////////////////////////////////////////////////

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

|ВЫБРАТЬ
|    СУММА(СвободныеОстаткиОстаткиИОбороты.КоличествоКонечныйОстаток) КАК ОстатокНаСкладе,
|    СвободныеОстаткиОстаткиИОбороты.Склад,
|    СвободныеОстаткиОстаткиИОбороты.Номенклатура
|ПОМЕСТИТЬ СвободныйОстаток
|ИЗ
|    РегистрНакопления.СвободныеОстатки.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК СвободныеОстаткиОстаткиИОбороты
|ГДЕ
|    СвободныеОстаткиОстаткиИОбороты.Склад В ИЕРАРХИИ(&Склад)
|    И СвободныеОстаткиОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)
|
|СГРУППИРОВАТЬ ПО
|    СвободныеОстаткиОстаткиИОбороты.Номенклатура,
|    СвободныеОстаткиОстаткиИОбороты.Склад
|;
|
////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ
|    ЗаказыПоставщикамОстаткиИОбороты.Номенклатура,
|    СУММА(ЗаказыПоставщикамОстаткиИОбороты.КоличествоКонечныйОстаток) КАК ЗаказыПоставшикам
|ПОМЕСТИТЬ Заказали
|ИЗ
|    РегистрНакопления.ЗаказыПоставщикам.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ЗаказыПоставщикамОстаткиИОбороты
|ГДЕ
|    ЗаказыПоставщикамОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)
|
|СГРУППИРОВАТЬ ПО
|    ЗаказыПоставщикамОстаткиИОбороты.Номенклатура
|;
|
////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ
|    ТоварыКПолучениюНаСкладыОстаткиИОбороты.Номенклатура,
|    ТоварыКПолучениюНаСкладыОстаткиИОбороты.Склад,
|    ТоварыКПолучениюНаСкладыОстаткиИОбороты.КоличествоКонечныйОстаток КАК ПолучаемНаСклад
|ПОМЕСТИТЬ КПолучениюНаСклад
|ИЗ
|    РегистрНакопления.ТоварыКПолучениюНаСклады.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ТоварыКПолучениюНаСкладыОстаткиИОбороты
|ГДЕ
|    ТоварыКПолучениюНаСкладыОстаткиИОбороты.Склад В ИЕРАРХИИ(&Склад)
|    И ТоварыКПолучениюНаСкладыОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)
|;
|
////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ
|    СУММА(ЕСТЬNULL(Остатки.Остаток, 0)) КАК Остаток,
|    СУММА(ЕСТЬNULL(СвободныйОстаток.ОстатокНаСкладе, 0)) КАК ОстатокНаСкладе,
|    СУММА(ЕСТЬNULL(Резерв.Зарезервировано, 0)) КАК Зарезервировано,
|    ВЫБОР
|        КОГДА Остатки.Номенклатура ЕСТЬ NULL 
|                И Резерв.Номенклатура ЕСТЬ NULL 
|                И СвободныйОстаток.Номенклатура ЕСТЬ NULL 
|                И Заказали.Номенклатура ЕСТЬ NULL 
|            ТОГДА КПолучению.Номенклатура
|        КОГДА Остатки.Номенклатура ЕСТЬ NULL 
|                И Резерв.Номенклатура ЕСТЬ NULL 
|                И СвободныйОстаток.Номенклатура ЕСТЬ NULL 
|            ТОГДА Заказали.Номенклатура
|        КОГДА Остатки.Номенклатура ЕСТЬ NULL 
|                И Резерв.Номенклатура ЕСТЬ NULL 
|            ТОГДА СвободныйОстаток.Номенклатура
|        КОГДА Остатки.Номенклатура ЕСТЬ NULL 
|            ТОГДА Резерв.Номенклатура
|        ИНАЧЕ Остатки.Номенклатура
|    КОНЕЦ КАК Номенклатура,
|    СУММА(ЕСТЬNULL(Заказали.ЗаказыПоставшикам, 0)) КАК ЗаказыПоставшикам,
|    СУММА(ЕСТЬNULL(КПолучению.ПолучаемНаСклад, 0)) КАК ПолучаемНаСклад
|ИЗ
|    Остатки КАК Остатки
|        ПОЛНОЕ СОЕДИНЕНИЕ СвободныйОстаток КАК СвободныйОстаток
|        ПО Остатки.Номенклатура = СвободныйОстаток.Номенклатура
|            И Остатки.Склад = СвободныйОстаток.Склад
|        ПОЛНОЕ СОЕДИНЕНИЕ Резерв КАК Резерв
|        ПО Остатки.Номенклатура = Резерв.Номенклатура
|            И Остатки.Склад = Резерв.Склад
|        ПОЛНОЕ СОЕДИНЕНИЕ Заказали КАК Заказали
|        ПО Остатки.Номенклатура = Заказали.Номенклатура
|        ПОЛНОЕ СОЕДИНЕНИЕ КПолучениюНаСклад КАК КПолучению
|        ПО Остатки.Номенклатура = КПолучению.Номенклатура
|            И Остатки.Склад = КПолучению.Склад
|
|СГРУППИРОВАТЬ ПО
|    ВЫБОР
|        КОГДА Остатки.Номенклатура ЕСТЬ NULL 
|                И Резерв.Номенклатура ЕСТЬ NULL 
|                И СвободныйОстаток.Номенклатура ЕСТЬ NULL 
|                И Заказали.Номенклатура ЕСТЬ NULL 
|            ТОГДА КПолучению.Номенклатура
|        КОГДА Остатки.Номенклатура ЕСТЬ NULL 
|                И Резерв.Номенклатура ЕСТЬ NULL 
|                И СвободныйОстаток.Номенклатура ЕСТЬ NULL 
|            ТОГДА Заказали.Номенклатура
|        КОГДА Остатки.Номенклатура ЕСТЬ NULL 
|                И Резерв.Номенклатура ЕСТЬ NULL 
|            ТОГДА СвободныйОстаток.Номенклатура
|        КОГДА Остатки.Номенклатура ЕСТЬ NULL 
|            ТОГДА Резерв.Номенклатура
|        ИНАЧЕ Остатки.Номенклатура
|    КОНЕЦ
|
|УПОРЯДОЧИТЬ ПО
|    Номенклатура";


Запрос.УстановитьПараметр("КонецПериода",ПериодК );
Запрос.УстановитьПараметр("НачалоПериода",ПериодН );
Запрос.УстановитьПараметр("Номенклатура",Номенклатура );
Запрос.УстановитьПараметр("Склад",Склад );
Результат = Запрос.Выполнить().Выбрать();
   88g88
 
21 - 20.09.16 - 14:52
Да долго разбирался.
Но решение есть. Может пригодится кому.
Что к чему и для чего могу объяснить.
   88g88
 
22 - 20.09.16 - 14:55
Правда там не 2 таблицы разбирал а 6.
И очень долго маялся как собрать номенклатуру в один столбец без потери показателей.
Но в общем и целом работает быстро и без проблем.

Не помню кто в личку писал. Спасибо ему! за основу легла его идея.
   88g88
 
23 - 20.09.16 - 15:15
Нашел ник героя ;)
Niveus Благодарю за идею.
Все вроде просто, но именно этого не хватало.
Как всегда, ответ лежит на поверхности. :)
   aleks_default
 
24 - 20.09.16 - 15:17
(21)Садись. Два.
   В тылу врага
 
25 - 20.09.16 - 15:19
это потому что у вас нет заказанного, но без остатка
   88g88
 
26 - 20.09.16 - 15:20
(25) Это не влияет вообще:)
запрос рабочий в сообжении (20)
   RomanYS
 
27 - 20.09.16 - 15:29
(20) я такие вещи через объединение делаю с последующей группировкой
   88g88
 
28 - 20.09.16 - 15:36
(27) да тут по сути то же, только все в запросе.
плюс в том что запросами лишнее не собираешь, что добавляет скорости.
   RomanYS
 
29 - 20.09.16 - 15:38
(28) так всё одним запросом делается, только без обилия ЕстьNULL и Выбор...Когда
   88g88
 
30 - 20.09.16 - 15:42
(29) Делается то да но первая таблица в приоритете.
то-есть если в первой таблице нет значения то остальные режет.
Обилие нолей не для запроса а для заполнения отчета. заполняю не из таблицы а результатами запроса. потому Null в результате не прокатывает. так как в отчете есть своя "арифметика" и там при значении null тут же ошибка на преобразование данных. null не складывается с значениями :).
   88g88
 
31 - 20.09.16 - 15:45
(29) По сути от одного запроса потому и ушел.
Полный перебор стреляет по памяти а любой отбор в едином запросе режет оставшиеся таблицы.
   88g88
 
32 - 20.09.16 - 15:49
(29) С номенклатурой ЕстьNULL это сбор всех номенклатур в столбец. Иначе есть пустые наименования со значениями.
То-есть не сопоставленные данные.
   RomanYS
 
33 - 20.09.16 - 16:09
(30) (31) (32) Я знаю для чего эти конструкции. Ты меня слышишь: у тебя СОЕДИНЕНИЕ, а можно делать через ОБЪЕДИНИТЬ без этих конструкций.

ВЫбор
РЕг1.Номенклатура,
РЕг1.Сумма как Сумма1,
0 как Сумма2
Поместить ВТ
ИЗ Рег1
Объединить все
ВЫбор
РЕг2.Номенклатура,
0
РЕг2.Сумма
ИЗ Рег2;
ВЫбрать ... из ВТ2 сгруппировать по....
 
 
   88g88
 
34 - 20.09.16 - 16:13
(33) А как пять объединить таким методом?
   88g88
 
35 - 20.09.16 - 16:16
Две и без объединить собираются запросом с условиями.
   88g88
 
36 - 20.09.16 - 16:18
(33) Не на полном серьезе. Я не считаю себя "мега прогером" если есть вариант полегче, буду рад. и мне пригодится и люди посмотрят и городить не будут.
   RomanYS
 
37 - 20.09.16 - 16:18
(34)
(30) (31) (32) Я знаю для чего эти конструкции. Ты меня слышишь: у тебя СОЕДИНЕНИЕ, а можно делать через ОБЪЕДИНИТЬ без этих конструкций.

ВЫбор
РЕг1.Номенклатура,
РЕг1.Сумма как Сумма1, 
0 как Сумма2, 
0 как Сумма3, 
0 как Сумма4, 
0 как Сумма5 
Поместить ВТ 
ИЗ Рег1
Объединить все
ВЫбор
РЕг2.Номенклатура,
0
РЕг2.Сумма,
0,
0,
0
ИЗ Рег2
Объединить все
ВЫбор
РЕг3.Номенклатура,
0
0,
РЕг3.Сумма,
0,
0
ИЗ Рег3
Объединить все
ВЫбор
РЕг4.Номенклатура,
0
0,
0,
РЕг4.Сумма,
0
ИЗ Рег4
Объединить все
ВЫбор
РЕг5.Номенклатура,
0
0,
0,
0,
РЕг5.Сумма
ИЗ Рег5
;
   88g88
 
38 - 20.09.16 - 16:22
(37) Знаешь, тоже та еще конструкция :). Проверю как со временем полегче будет. возможно отпишусь.
Спасибо за идею.
   RomanYS
 
39 - 20.09.16 - 16:45
(38) да я не настаиваю. Конструктором такие запросы достаточно удобно смотреть/редактировать.
По скорости, наверное, если в твоем варианте группировку убрать, он побыстрее будет.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует