УНФ 1,6. Необходимо удалить из заказ все позиции по которым нет остатков на складе
Выводит даже строки, по которым остатки больше нуля. Подскажите, где ошибка в запросе!?
ВЫБРАТЬ
ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
ЗапасыНаСкладахОстатки.Организация КАК Организация,
ЗапасыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ЗапасыНаСкладахОстатки.Характеристика КАК Характеристика
ПОМЕСТИТЬ Остатки
ИЗ
РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК ЗапасыНаСкладахОстатки
ГДЕ
ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0) <= 0
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
Остатки.КоличествоОстаток КАК КоличествоОстаток,
ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки
ИЗ
Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
ПО ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация
И ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура
И ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика
ГДЕ
ЗаказПокупателяЗапасы.Ссылка = &Ссылка
УПОРЯДОЧИТЬ ПО
НомерСтроки УБЫВ
ПоказатьВыводит даже строки, по которым остатки больше нуля. Подскажите, где ошибка в запросе!?
По теме из базы знаний
- История оптимизации одного большого запроса средствами MSSQL Profiler и 1С
- Неоплаченные долги при распределении оплаты по правилу ФИФО одним запросом и намного быстрее, чем Вы думали
- Консоль запросов к базе Oracle для 1С, без использования специализированных программ
- Оптимизатор запроса. Часть первая
- Как читать чужой код? Часть 3. Разбор и доработка запросов
Найденные решения
Вот так попробуй. Не проверял, но думаю должно работать.
ВЫБРАТЬ
ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
Остатки.КоличествоОстаток КАК КоличествоОстаток,
ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки
ИЗ
Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК Остатки
ПО (ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация)
И (ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура)
И (ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика)
ГДЕ
ЗаказПокупателяЗапасы.Ссылка = &Ссылка
И ЕСТЬNULL(Остатки.КоличествоОстаток, 0) <= 0
УПОРЯДОЧИТЬ ПО
НомерСтроки УБЫВ
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(7) вот что-то в этом роде:
ВЫБРАТЬ
ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
Остатки.КоличествоОстаток КАК КоличествоОстаток,
ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки
ИЗ
Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК ЗапасыНаСкладахОстатки КАК Остатки
ПО ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация
И ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура
И ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика
ГДЕ
ЗаказПокупателяЗапасы.Ссылка = &Ссылка И Остатки.Номенклатура ЕСТЬ NULL
УПОРЯДОЧИТЬ ПО
НомерСтроки УБЫВ
Показать
(1) в дополнении к (17): так как не рекомендуется делать соединение реальной таблицы с виртуальной, то вот еще вариант:
Свои таблицы и поля подставите сами.
ВЫБРАТЬ
ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
ЗаказКлиентаТовары.Характеристика КАК Характеристика
ПОМЕСТИТЬ вт_номенклатура
ИЗ
Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
ГДЕ
ЗаказКлиентаТовары.Ссылка = &Ссылка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.Характеристика КАК Характеристика,
ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ВНаличииОстаток
ПОМЕСТИТЬ вт_товарыВНаличии
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
,
(Номенклатура, Характеристика) В
(ВЫБРАТЬ
вт_номенклатура.Номенклатура КАК Номенклатура,
вт_номенклатура.Характеристика КАК Характеристика
ИЗ
вт_номенклатура КАК вт_номенклатура)) КАК ТоварыНаСкладахОстатки
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
ЗаказКлиентаТовары.Количество КАК Количество
ИЗ
Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
ЛЕВОЕ СОЕДИНЕНИЕ вт_товарыВНаличии КАК вт_товарыВНаличии
ПО ЗаказКлиентаТовары.Номенклатура = вт_товарыВНаличии.Номенклатура
И ЗаказКлиентаТовары.Характеристика = вт_товарыВНаличии.Характеристика
ГДЕ
ЗаказКлиентаТовары.Ссылка = &Ссылка
И вт_товарыВНаличии.Номенклатура ЕСТЬ NULL
ПоказатьСвои таблицы и поля подставите сами.
(30) этот вариант один из самых правильных. Условие отбора накладываются на виртуальную таблицу с выборкой из временной. Можно еще добавить индексацию для временной таблицы.
Иначе виртуальная таблица будет выбирать все остатки.
И не надо игнорировать вложенные запросы совсем. Просто нужно понимать их особенность. При сложном вложенном запросе оптимизатор запроса не всегда может определить получаемое количество выборки и соответственно может построить неоптимальный план запроса. Ну, и индексации во вложенном запросе не будет. В данном случае все будет прозрачно для оптимизатора.
Иначе виртуальная таблица будет выбирать все остатки.
И не надо игнорировать вложенные запросы совсем. Просто нужно понимать их особенность. При сложном вложенном запросе оптимизатор запроса не всегда может определить получаемое количество выборки и соответственно может построить неоптимальный план запроса. Ну, и индексации во вложенном запросе не будет. В данном случае все будет прозрачно для оптимизатора.
Вот так попробуй. Не проверял, но думаю должно работать.
ВЫБРАТЬ
ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
Остатки.КоличествоОстаток КАК КоличествоОстаток,
ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки
ИЗ
Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК Остатки
ПО (ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация)
И (ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура)
И (ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика)
ГДЕ
ЗаказПокупателяЗапасы.Ссылка = &Ссылка
И ЕСТЬNULL(Остатки.КоличествоОстаток, 0) <= 0
УПОРЯДОЧИТЬ ПО
НомерСтроки УБЫВ
Показать
(10)
Все равно строк 5, ничего вообще не изменилось
ВЫБРАТЬ
ЗапасыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
ЗапасыНаСкладахОстатки.Организация КАК Организация,
ЗапасыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ЗапасыНаСкладахОстатки.Характеристика КАК Характеристика
ПОМЕСТИТЬ Остатки
ИЗ
РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК ЗапасыНаСкладахОстатки
ГДЕ
ЗапасыНаСкладахОстатки.КоличествоОстаток <= 0
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
Остатки.КоличествоОстаток КАК КоличествоОстаток,
ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки
ИЗ
Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
ПОЛНОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
ПО ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация
И ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура
И ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика
ГДЕ
ЗаказПокупателяЗапасы.Ссылка = &Ссылка
УПОРЯДОЧИТЬ ПО
НомерСтроки УБЫВ
ПоказатьВсе равно строк 5, ничего вообще не изменилось
(10) В этом не может быть принципиальной ошибки и тем более проблемы!
Или вы не представляете что такое
Оно всегда будет работать...
Это же просто проверка , если ЗапасыНаСкладахОстатки.КоличествоОстаток NULL то выдаст 0 , а если НЕ NULL то выдаст ЗапасыНаСкладахОстатки.КоличествоОстаток
(первый класс вторая четверть)
А то что ЗапасыНаСкладахОстатки.КоличествоОстаток никогда не будет NULL (и это так ) в этом месте совершенно никак не повлияет на результат.....
Или вы не представляете что такое
ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0)
Оно всегда будет работать...
Это же просто проверка , если ЗапасыНаСкладахОстатки.КоличествоОстаток NULL то выдаст 0 , а если НЕ NULL то выдаст ЗапасыНаСкладахОстатки.КоличествоОстаток
(первый класс вторая четверть)
А то что ЗапасыНаСкладахОстатки.КоличествоОстаток никогда не будет NULL (и это так ) в этом месте совершенно никак не повлияет на результат.....
Без условия <=0 проверяю в консоли. 1поз остатки 15 штук, еще 3 позиции понулям, 1 в минус. Левое соед. Выводятся все пять, в строке количество остаток в 1поз 15 в остальных пусто. Ставлю условие, выводятся опять все ПЯТЬ колонок, но везде в количествоОстаток пусто. Как сделать, чтоб выводилось 4 колонки, только там где нет остатков!?
Все равно строк 5, а надо чтоб было 4ре, только те, по которым нет остатков. Чтоб потом их собственно удалить, как то так
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос.УстановитьПараметр("Склад", Объект.СтруктурнаяЕдиницаРезерв);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект.Запасы.Удалить(Выборка.НомерСтроки-1);
КонецЦикла;
//Объект.Записать();
Показать
(15) а вообще я бы сделал не так совсем
у вас по условию требуется что - вытащить из заказа строки с остатками <=0
значит или таблица остатков главная должна быть или выборку по заказу тоже во временную таблицу помещать и уже для результата запрос по двум временным таблицам, но опять же по остаткам главная
у вас по условию требуется что - вытащить из заказа строки с остатками <=0
значит или таблица остатков главная должна быть или выборку по заказу тоже во временную таблицу помещать и уже для результата запрос по двум временным таблицам, но опять же по остаткам главная
(16)Странный совет. Получился полный бред.что и предполагалось, при "главной", таблице остатков
ВЫБРАТЬ
ЗапасыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
ЗапасыНаСкладахОстатки.Организация КАК Организация,
ЗапасыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ЗапасыНаСкладахОстатки.Характеристика КАК Характеристика
ПОМЕСТИТЬ Остатки
ИЗ
РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК ЗапасыНаСкладахОстатки
ГДЕ
ЗапасыНаСкладахОстатки.КоличествоОстаток <= 0
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки,
ЗаказПокупателяЗапасы.Ссылка.Организация КАК Организация
ПОМЕСТИТЬ Заказ
ИЗ
Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
ГДЕ
ЗаказПокупателяЗапасы.Ссылка = &Ссылка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Заказ.Номенклатура КАК Номенклатура,
Заказ.Характеристика КАК Характеристика,
Заказ.НомерСтроки КАК НомерСтроки,
Остатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
Остатки КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ Заказ КАК Заказ
ПО Остатки.Номенклатура = Заказ.Номенклатура
И Остатки.Характеристика = Заказ.Характеристика
И Остатки.Организация = Заказ.Организация
Показать
(13) (12) Выполните в консоли , которая может показать вам записи временной таблицы, что там?
И вы бы картинку результата с текстом в консоли выложили для лучшего понимания проблемы...
Каких строк у вас 5?
работайте с консолью, так вы быстрее поймете суть запросов....
И вернитесь к своему Первому варианту - он правильный!
И вы бы картинку результата с текстом в консоли выложили для лучшего понимания проблемы...
Каких строк у вас 5?
работайте с консолью, так вы быстрее поймете суть запросов....
И вернитесь к своему Первому варианту - он правильный!
(22) Во первых первый вариант не содержит ни одной принципиальной ошибки!
Во вторых изучите основы 1С и не путайте виртуальные таблицы с временными!
Во третьих по условию и не нужны положительные остатки!
И в четвертых, да можно обойтись без временной таблицы , но она не является принципиальной ошибкой.
Если скажем я захочу увидеть как промежуточный результат все неположительные остатки на складе....
Во вторых изучите основы 1С и не путайте виртуальные таблицы с временными!
Во третьих по условию и не нужны положительные остатки!
И в четвертых, да можно обойтись без временной таблицы , но она не является принципиальной ошибкой.
Если скажем я захочу увидеть как промежуточный результат все неположительные остатки на складе....
(23)
Вариант в (1) не вернет того, что нужно автору.
Если на складе есть яблоко - 5шт и нет груш, то в первой таблице не будет ни яблока(потому что условие на остаток<=0), ни груши(потому что в вирутальной :D таблице остатков ее нет).
При соединении с тч документа и по яблоку и по груше получим NULL.
Во вторых изучите основы 1С
Смешно :)
Вариант в (1) не вернет того, что нужно автору.
Если на складе есть яблоко - 5шт и нет груш, то в первой таблице не будет ни яблока(потому что условие на остаток<=0), ни груши(потому что в вирутальной :D таблице остатков ее нет).
При соединении с тч документа и по яблоку и по груше получим NULL.
(25) По поводу смешного - простите , погорячился...
Воспринял , что вы якобы назвали "ПОМЕСТИТЬ Остатки " - виртуальной таблицей...
Автору нужно
То есть нужны именно эти записи с NULL во 2 части , чтобы их удалить из заказа !
А вы что ищете? Положительные остатки?
Воспринял , что вы якобы назвали "ПОМЕСТИТЬ Остатки " - виртуальной таблицей...
Автору нужно
Необходимо удалить из заказ все позиции по которым нет остатков на складе
То есть нужны именно эти записи с NULL во 2 части , чтобы их удалить из заказа !
А вы что ищете? Положительные остатки?
По-моему такой вариант более простой и правильный
ВЫБРАТЬ
ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки,
ЗаказПокупателяЗапасы.Ссылка.Организация = Организация
ПОМЕСТИТЬ ТабЧасть
ИЗ
Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
ГДЕ
ЗаказПокупателяЗапасы.Ссылка = &Ссылка
ИНДЕКСИРОВАТЬ ПО
Организация,
Номенклатура,
Характеристика
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТабЧасть.Номенклатура КАК Номенклатура,
ТабЧасть.Характеристика КАК Характеристика,
ТабЧасть.НомерСтроки КАК НомерСтроки,
ЕСТЬNULL(ЗапасыНаСкладах.КоличествоОстаток, 0) КАК КоличествоОстаток
ПОМЕСТИТЬ Итоговая
ИЗ
ТабЧасть КАК ТабЧасть
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(
&Дата,
СтруктурнаяЕдиница = &Склад
И (Организация, Номенклатура, Характеристика) В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
ТабЧасть.Организация КАК Организация,
ТабЧасть.Номенклатура КАК Номенклатура,
ТабЧасть.Характеристика КАК Характеристика
ИЗ
ТабЧасть КАК ТабЧасть)) КАК ЗапасыНаСкладах
ПО ТабЧасть.Номенклатура = ЗапасыНаСкладах.Номенклатура
И ТабЧасть.Характеристика = ЗапасыНаСкладах.Характеристика
И ТабЧасть.Организация = ЗапасыНаСкладах.Организация
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Итоговая.Номенклатура КАК Номенклатура,
Итоговая.Характеристика КАК Характеристика,
Итоговая.НомерСтроки КАК НомерСтроки,
Итоговая.КоличествоОстаток КАК КоличествоОстаток
ИЗ
Итоговая КАК Итоговая
ГДЕ
Итоговая.КоличествоОстаток <= 0
УПОРЯДОЧИТЬ ПО
НомерСтроки УБЫВ
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот