|
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 | |||
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) да я не настаиваю. Конструктором такие запросы достаточно удобно смотреть/редактировать.
По скорости, наверное, если в твоем варианте группировку убрать, он побыстрее будет. |
|
Список тем форума
|