Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Не работает есть null в запросе, почему?

Не работает есть null в запросе, почему?
Я
   Ly_Alena
 
19.01.19 - 22:51
Доброй ночи!

Нужно выбрать номенклатуру, у которой приход - документ поступление товаров и услуг. По факту выбирает все подряд.
Пробовала выбрать все документы списком, которые не нужны - тоже не работает.
А теперь вопрос, товарищи знатоки - что не так?

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

СГРУППИРОВАТЬ ПО
    ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Склад,
    ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Номенклатура,
    ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.ХарактеристикаНоменклатуры.ГВ,
    ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Номенклатура.Код
 
 
   RomanYS
 
1 - 19.01.19 - 23:02
(0) Не согласуется как-то:
"у которой приход - документ поступление товаров и услуг"
 и "НЕ ПартииТоваровНаСкладахБухгалтерскийУчетОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг"
   Ly_Alena
 
2 - 19.01.19 - 23:04
(1) во вложенном выбираем все документы которые не поступление, а далее при соединении с РН соединяем по номенклатуре и в условиях есть null
   Ly_Alena
 
3 - 19.01.19 - 23:05
(2) то есть исключаем все документы, которые выбрали и остается только поступление
   AlvlSpb
 
4 - 19.01.19 - 23:40
(2) Во вложенном запросе НЕТ номенклатуры со значением NULL
Зачем вырезать гланды через седалище? Сразу отбирайте номенклатуру по регистратору Поступление
   RomanYS
 
5 - 19.01.19 - 23:53
(2) Или логика нарушена, или мое понимание исходной задачи:
во вложенном запросе номенклатура, по которой есть приходы по не ПТиУ. Итого вы не может знать были ли приходы по ПТиУ, т.к. во вложенном запросе такая номенклатура может быть или не быть.
   Ly_Alena
 
6 - 20.01.19 - 09:33
(4) Во вложенном запросе такой номенклатуры нет - в том и смысл, мне нужна номенклатура по которой связь с регистром нулевая. Т.е. номенклатура у которой есть в регистраторах Поступление.
   Ly_Alena
 
7 - 20.01.19 - 09:35
(5) во вложенном запросе такая номенклатура есть.
из партий нужно выбрать всю номенклатуру, исключая то что есть во вложенном запросе.
   Лодырь
 
8 - 20.01.19 - 09:43
Вы проверяли содержимое вложенного запроса?
   Ly_Alena
 
9 - 20.01.19 - 09:51
(8) Да. Убирала все - выводила регистратор, снова соединяла. Не работает - какой-то тупняк не могу понять какой.
   Фрэнки
 
10 - 20.01.19 - 10:00
(6) Я бы тогда принципиально написал запрос с использованием не вложенного запроса, а пакетом. Сразу выбрать и поместить в виртуальную таблицу со всеми разумными условиями. Затем соединяем и смотрим условия соединения. Так будет легче составить сам запрос. Позже можно будет подумать о его оптимизации, если в этом возникнет необходимость.
 
 Рекламное место пустует
   Ly_Alena
 
11 - 20.01.19 - 10:40
(10) что значит разумными условиями и условия соединения? Временные таблицы пробовала.
   dmpl
 
12 - 20.01.19 - 10:57
(0) В консоли запросов выполните подзапрос - что он выдает? У вас там даты отборов по регистрам разные.
   Ly_Alena
 
13 - 20.01.19 - 11:17
(12) Я знаю что даты разные - так должно быть. Да и не в датах дело...
   Фрэнки
 
14 - 20.01.19 - 11:50
(11) ну например, вот это условие для поля ВложенныйЗапрос.Номенклатура. Я не хочу утверждать, что это не должно работать, но я сам так не написал бы. Структурно сделал бы первый запрос в пакете с Поместить в втНоменклатура и затем Левое соединение во втором запросе. Но еще раз подчеркну, что тут чисто стиль написания - мои предпочтения при составлении корректно работающего запроса - сделать пакет из множества выборок с получением нескольких ВТ и связать их в итоговом. Когда все заработало, переходить к оптимизации.
   Ly_Alena
 
15 - 20.01.19 - 12:03
(14) Дело в том что поступление номенклатуры нужно сделать без привязки к складу или характеристике, то есть тупо всю номенклатуру по предприятию, а потом уже исключить ее и подвязать и склад и характеристики. Как это сделать с кучей ВТ не представляю.
   bolder
 
16 - 20.01.19 - 12:06
(0) Извращение какое то)Почему нельзя прямо ограничить регистратором то?
   Sapiens_bru
 
17 - 20.01.19 - 12:27
(0) А если в указанном периоде приход одной номенклатуры выполнялся разными документами? Например было и поступление от поставщика и возврат от покупателя. Как запрос должен отработать такое совпадение?
   Фрэнки
 
18 - 20.01.19 - 12:29
(15) но может так и стоит сделать. Буквально в топике так и сказано, но в коде не сделано.

Выбрать по справочнику Номенклатура
Соединять выборки из регистров с выборкой по Номенклатуре и там где будет нул в соединении, там оборота не было.

А так, как написано сейчас = выборка всех и остатков и оборотов. Нечеткое условие. Сейчас к полученным остаткам и оборотам чего-то прикручено еще раз обороты и что? Масло масленное какое-то
   dmpl
 
19 - 20.01.19 - 13:27
(13) Что возвращает подзапрос? Ну или исполнить весь запрос, и добавить в выборку поле ВложенныйЗапрос.Номенклатура.
   Ly_Alena
 
20 - 20.01.19 - 15:30
(17) если есть хоть один документ поступления - то должен отобрать номенклатуру.
   Ly_Alena
 
21 - 20.01.19 - 15:32
(19) в том-то и дело что из исполненного запроса, нужно исключить всю номенклатуру, которая пришла не через поступление. Между складами вечная движуха - на склад номенклатура могла попасть через перемещение, да через кучу документов.
   Sapiens_bru
 
22 - 20.01.19 - 15:36
(21) (20) Вы сами себе противоречите. Если товар "Печенька" пришел и поступлением и перемещением? Нужно показать весь оборот такого товара?
   hhhh
 
23 - 20.01.19 - 16:07
(20) ну, вы же не исключение другие документы. Значит, они тоже должны быть. А не только поступление.
   dmpl
 
24 - 20.01.19 - 18:13
(21) Так у вас ВложенныйЗапрос.Номенклатура будет NULL если вообще никаких движений по товару не было. Поэтому чтобы убедиться, что ЕСТЬ NULL работает, достаточно в запросе выбрать то поле, которое проверяется на NULL.
   Ly_Alena
 
25 - 20.01.19 - 19:13
(22) на предприятие товар не может придти перемещением, а вот на склад да. Отбор идет по номенклатуре. Если в обороте есть поступление - неважно даже на одну ед товару - мне подходит. Весь оборот будет показан через партии.
(23) Исключить не получается - потому и сюда обратилась. Есть номенклатура, у которой во всем обороте документа поступления в принципе нет (и не спрашивайте как так?) - мне ее нужно исключить. Отчет - отображает все обороты и остатки, единственное не все позиции которые нужны. Мне кажется по запросу все видно.
(24) В данном запросе проверяется связь - то есть партии соединяем с вложенным запросом только по номенклатуре у которой было поступление. ТО есть связываем только по тому чему нет связи с отбором во вложенном цикле. Не знаю насколько понятно объяснила. Я думала конструкция понятна...
   Sapiens_bru
 
26 - 20.01.19 - 19:38
(25) Ваш вложенный запрос проверяет не наличие поступлений, а отсутствие поступления в КОНКРЕТНОЙ записи регистра. Затем вся такая номенклатура группируется.

Возьмем например яблочко, оно поступило и было перемещено. Вложенный запрос увидит 2 записи в регистре, одну пропустит по условию, вторую возьмет в результат. И вот ваше яблочко уже считается не поступавшим по вашей логике?

Перепишите запрос корректно - вложенным запросом выберите всю номенклатуру по которой БЫЛО поступление, а затем сделайте ВНУТРЕННЕЕ соединение с таблицей верхнего уровня.
   Ёпрст
 
27 - 21.01.19 - 09:02
(0) хз, что вам надо, так может ?

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

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

   Ёпрст
 
28 - 21.01.19 - 09:03
условие на номенклатуру можете и унутьрь ВТ останкиИОбороты запихать, если че..
   catena
 
29 - 21.01.19 - 10:05
А почему условия на регистратор, а не на ДокументОприходования?
   dezss
 
30 - 21.01.19 - 10:10
И НЕ ПартииТоваровНаСкладахБухгалтерскийУчетОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг


заменить на 
            И ПартииТоваровНаСкладахБухгалтерскийУчетОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг

А это убрать
    И ВложенныйЗапрос.Номенклатура ЕСТЬ NULL
   dezss
 
31 - 21.01.19 - 10:12
(30) + соединение сделать внутренним
   dezss
 
32 - 21.01.19 - 10:13
ПартииТоваровНаСкладахБухгалтерскийУчетОстаткиИОбороты.Номенклатура.Код КАК Код,

этот треш нафиг...лучше явно соединиться с номенклатурой и оттуда вытащить код...либо это сделать во вложенном запросе.
   dmpl
 
33 - 21.01.19 - 10:33
(29) Чтобы перемещения между складами отсеять.
 
 
   Ly_Alena
 
34 - 22.01.19 - 20:20
(26) это фиаско, братан!
С логикой явно у меня проблема - спасибо! Сейчас свежим взглядом посмотрю. Спасибо еще раз!
   Ly_Alena
 
35 - 22.01.19 - 22:03
(26) (31)  Сделала отбор по поступлению с внутренним соединением - все получилось! Спасибо!
Еще вопрос - как отобрать номенклатуру, если у нее из регистраторов только Перемещение товаров, хоть одна хоть не одна запись? Такое вообще возможно?


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