Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 дек 2024, 01:53

1C 8.3. Как правильно вывести только те записи регистра, которые подходят по условиям?

Автор gulnyr, 09 июн 2023, 08:37

0 Пользователей и 1 гость просматривают эту тему.

gulnyr

Код:

ВЫБРАТЬ
ЗаказыПокупателейОстатки.Заказ.Номер,
ЗаказыПокупателейОстатки.Номенклатура,
ЗаказыПокупателейОстатки.ЗаказаноОстаток,
ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
ОстаткиТоваровКомпанииОстатки.РезервОстаток КАК РезервОстаток
ИЗ
РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки
ПО ЗаказыПокупателейОстатки.Номенклатура = ОстаткиТоваровКомпанииОстатки.Номенклатура
ГДЕ
ЗаказыПокупателейОстатки.ЗаказаноОстаток<=ОстаткиТоваровКомпанииОстатки.КоличествоОстаток+ОстаткиТоваровКомпанииОстатки.РезервОстаток

Задача такая: для примера в регистре есть такие записи:

Номер  Заказ  Остаток  Резерв
111          1          1           0
111          3          1           1
222          2          1           1
222          1          0           1
333          1          3           0
333          2          0           1


Если у всех одинаковых номеров Заказ меньше или равно Остаток+Резерв, тогда номер выводим, иначе этот номер не выводим (если хоть один не подходит данному условию).
В данном примере остается только номер: 222 (т.к. каждый номер подходит по условию Заказ <= Остаток+Резерв).


Как правильно вывести только те записи регистра, которые подходят по условиям?

LexaK

gulnyr, запрос строится с использованием временной таблицы
1.сначала выбираете Номера с обратным условием где Заказ БОЛЬШЕ Остаток+Резерв,
2.эту таблицу соединяете с основной, и отбираете в условии Где НомерБольше есть Null
останутся как раз правильные Номера

в общем ни чего сложного, попробуйте сами написать запрос, если не получится, пишите
если помогло нажмите: Спасибо!

gulnyr

LexaK, не совсем понятно как это реализовать. Пока что такой вариант:

ВЫБРАТЬ
ЗаказыПокупателейОстатки.Заказ.Номер,
    ЗаказыПокупателейОстатки.Номенклатура,
    ЗаказыПокупателейОстатки.ЗаказаноОстаток,
    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
    ОстаткиТоваровКомпанииОстатки.РезервОстаток КАК РезервОстаток
ПОМЕСТИТЬ ВТ_ЗаказыПокупателейОстатки     
ИЗ
    РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки
    ПО ЗаказыПокупателейОстатки.Номенклатура = ОстаткиТоваровКомпанииОстатки.Номенклатура
ГДЕ
    ЗаказыПокупателейОстатки.ЗаказаноОстаток>ОстаткиТоваровКомпанииОстатки.КоличествоОстаток+ОстаткиТоваровКомпанииОстатки.РезервОстаток
    ;
ВЫБРАТЬ
ВТ_ЗаказыПокупателейОстатки.ЗаказНомер,
    ВТ_ЗаказыПокупателейОстатки.Номенклатура,
    ВТ_ЗаказыПокупателейОстатки.ЗаказаноОстаток,
    ВТ_ЗаказыПокупателейОстатки.КоличествоОстаток,
    ВТ_ЗаказыПокупателейОстатки.РезервОстаток КАК РезервОстаток     
ИЗ
ВТ_ЗаказыПокупателейОстатки
ГДЕ
    ВТ_ЗаказыПокупателейОстатки.Заказ.Номер>NULL
   
   

LexaK

gulnyr, немного по другому, (сами понимаете не проверял, могут быть опечатки)
ВЫБРАТЬ
ЗаказыПокупателейОстатки.Заказ, //.Номер,
    ЗаказыПокупателейОстатки.Номенклатура,
    ЗаказыПокупателейОстатки.ЗаказаноОстаток,
    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
    ОстаткиТоваровКомпанииОстатки.РезервОстаток КАК РезервОстаток
ПОМЕСТИТЬ ВТ_ЗаказыПокупателейОстатки     
ИЗ
    РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки
    ПО ЗаказыПокупателейОстатки.Номенклатура = ОстаткиТоваровКомпанииОстатки.Номенклатура
ГДЕ
    ЗаказыПокупателейОстатки.ЗаказаноОстаток>ОстаткиТоваровКомпанииОстатки.КоличествоОстаток+ОстаткиТоваровКомпанииОстатки.РезервОстаток
;
ВЫБРАТЬ
ЗаказыПокупателейОстатки.Заказ.Номер,
    ЗаказыПокупателейОстатки.Номенклатура,
    ЗаказыПокупателейОстатки.ЗаказаноОстаток,
    ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
    ОстаткиТоваровКомпанииОстатки.РезервОстаток КАК РезервОстаток
ИЗ
    РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки
    ПО ЗаказыПокупателейОстатки.Номенклатура = ОстаткиТоваровКомпанииОстатки.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ЗаказыПокупателейОстатки
по ЗаказыПокупателейОстатки.Заказ = ВТ_ЗаказыПокупателейОстатки.Заказ
ГДЕ
    ВТ_ЗаказыПокупателейОстатки.Заказ есть NULL
если помогло нажмите: Спасибо!

gulnyr

LexaK, здесь такой результат:

Новый точечный рисунок (2).png

Нужно чтобы вывелись только те номера, где ЗаказаноОстаток <= КоличествоОстаток+РезервОстаток. Не совсем то, что хотелось бы

LexaK

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

gulnyr


gulnyr

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

LexaK

Цитата: gulnyr от 09 июн 2023, 12:47остатки в обороты,
это разные вещи!
Кто же знает какая изощренная логика у вас в голове?

(и вообще зачем вам период?)
если помогло нажмите: Спасибо!

gulnyr

LexaK, понятное дело, что разные. Период нужен для того чтобы отбирать заказ покупателя начиная с 2-х недель назад до текущей даты (а не все записи регистра).

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск