Имя: Пароль:
   
1C
1С v8
Запрос из двух регистров накопления
0 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

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

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

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

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

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

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

PS Текст может содержать ошибки - писал вручную.
18 Chameleon1980
 
naïve
13.09.16
08:00
не нужно всех в скд
пусть поймут сначала
19 88g88
 
20.09.16
14:49
Решение такое короче
20 88g88
 
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
|            ТОГДА Резерв.Номенклатура
|        ИНАЧЕ Остатки.Номенклатура
|    КОНЕЦ
|
|УПОРЯДОЧИТЬ ПО
|    Номенклатура";


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

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

ВЫбор
РЕг1.Номенклатура,
РЕг1.Сумма как Сумма1,
0 как Сумма2
Поместить ВТ
ИЗ Рег1
Объединить все
ВЫбор
РЕг2.Номенклатура,
0
РЕг2.Сумма
ИЗ Рег2;
ВЫбрать ... из ВТ2 сгруппировать по....
34 88g88
 
20.09.16
16:13
(33) А как пять объединить таким методом?
35 88g88
 
20.09.16
16:16
Две и без объединить собираются запросом с условиями.
36 88g88
 
20.09.16
16:18
(33) Не на полном серьезе. Я не считаю себя "мега прогером" если есть вариант полегче, буду рад. и мне пригодится и люди посмотрят и городить не будут.
37 RomanYS
 
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
;
38 88g88
 
20.09.16
16:22
(37) Знаешь, тоже та еще конструкция :). Проверю как со временем полегче будет. возможно отпишусь.
Спасибо за идею.
39 RomanYS
 
20.09.16
16:45
(38) да я не настаиваю. Конструктором такие запросы достаточно удобно смотреть/редактировать.
По скорости, наверное, если в твоем варианте группировку убрать, он побыстрее будет.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший