|
Запрос из двух регистров накопления | ☑ | ||
---|---|---|---|---|
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
12.09.16
✎
20:05
|
(13) Почему ОстаткиИОбороты, а не просто Остатки?
|
|||
16
Chameleon1980
12.09.16
✎
20:14
|
выше говорили.
лепи левым к номенклатуре |
|||
17
Dmitrii
гуру
12.09.16
✎
20:37
|
А потом все спрашивают "для чего нужны экзамены 1С Специалист?"...
Именно для того, чтобы больно бить линейкой по рукам таким вот запросописателям. Первая грубая ошибка: запрос к таблицам ОстаткиИОбороты, когда нужны только Остатки. Вторая грубая ошибка - группировка. Она тут нафиг не нужна. Виртуальные таблицы выдают данные из физических таблиц итогов, где данные хранятся уже в сгруппированном виде. Третья грубая ошибка - условия на измерения в разделе "ГДЕ" вместо параметров. Ну и наконец - неспособность применить ЕСТЬNULL и связать с таблицей справочника. А, например, в СКД подобные задачи решаются объединением двух таблиц. СКД сама сгруппирует и упорядочит их по номенклатуре при указании суммируемых ресурсов (остаток и Заказно) и выводе в группировке по полю Номенклатура: ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.КоличествоКонечныйОстаток КАК Остаток, 0 КАК Заказанно ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, Склад В ИЕРАРХИИ (&Склад) И Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ТоварыНаСкладахОстатки ОБЪЕДИНИТЬ ВСЕ ЗаказыПоставщикамОстатки.Номенклатура, 0, ЗаказыПоставщикамОстатки.КоличествоКонечныйОстаток ИЗ РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонецПериода, Склад В ИЕРАРХИИ (&Склад) И Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ЗаказыПоставщикамОстатки PS Текст может содержать ошибки - писал вручную. |
|||
18
Chameleon1980
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) да я не настаиваю. Конструктором такие запросы достаточно удобно смотреть/редактировать.
По скорости, наверное, если в твоем варианте группировку убрать, он побыстрее будет. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |