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

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

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

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

gulnyr

LexaK, Переделал:

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

Вроде бы работает так, как мне нужно

LexaK

gulnyr, так вроде все просто
Заказ - это документ, и он у вас есть в результате запроса
а у документа есть Дата - Вот по ней и отбирайте!!!
примерно так

...
Где
    Заказ.Дата Между &НачалоПериода и &ОкончаниеПерида
если помогло нажмите: Спасибо!

gulnyr

LexaK, есть еще затруднение. Как убрать такие дубли?

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

Попробовал использовать РАЗЛИЧНЫЕ и ГРУППИРОВАТЬ ПО, но результата не принесли, все равно по несколько штук выходит.

Пытался группировать таким образом:

Запрос = Новый Запрос ();    

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

Но ничего не поменялось. Какие есть еще варианты?

LexaK

gulnyr, это не дубли!
у вас в одном Заказе может быть несколько Товаров! вот для каждого товара один и тот-же номер и показывается!

что бы "НеДублировался" номер, можно включить группировку
сначала выводите 1 номер (одна строка)
а под ним содержимое документа, несколько строк с товарами

проще всего это делать в отчете СКД
если помогло нажмите: Спасибо!

gulnyr

LexaK, сделал таким образом:
Массив = Новый Массив();

Пока Запросик.Следующий() Цикл
Если Массив.Поиск(Значение) = Неопределено Тогда
//Попадает новое значение и результат запроса
Массив.Добавить(НовоеЗначение);
РезультатЗапроса;
КонецЕсли;
КонецЦикла;

Сейчас дубли не попадаются.

Afinogen

 B) в запросе добавьте после СГРУППИРОВАТЬ ПО конструкцию

ИТОГИ ПО ЗаказНомер

код тогда будет иметь вид

выборкаИтог = Запрос.Выполнить().Выбрать(ОбъодРезультатаЗапроса.Погруппировкам);
это будет первый уровень  - номера заказов
Пока ВыборкаИтог.Следующий() Цикл


КонецЦикла;

ну или то же самое можно только не в виде выборки а дерева значений получить

Дерево= Запрос.Выполнить().Выгрузить(ОбъодРезультатаЗапроса.Погруппировкам);

gulnyr

LexaK, возникла еще сложность.
А как сделать так, чтобы из запроса отбирала только те записи, у которых не все остатки >= количества заказов (как логическое И, либо не все, либо ни один)?

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


Т.е. должен быть такой результат:

Номер  Заказ  Остаток 
111          2          1  - ложь         
111          1          2  - истина           
222          2          3  - истина           
222          1          1  - истина           
333          4          3  - ложь           
333          2          0  - ложь
   

В результате отбирается: 111 и 333 (222 не отбирается, т.к. он везде подходит по условию: остаток>=заказ)       

Afinogen

в запросе после сгруппировать по добавить

ИМЕЮЩИЕ Максимум(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток)>=Максимум(ЗаказыПокупателейОстатки.Заказано)


это наложит дополнительный отбор на итоговый ваш набор

gulnyr

Что делает ВТ_ЗаказыПокупателейОстатки.Заказ есть NULL в данном запросе? Можно ли узнать поподробнее? (а точнее, каким образом ВТ_ЗаказыПокупателейОстатки.Заказ становится NULL)

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

Afinogen

ставите точку останова на строчке следующей за командой выполнения запроса,

в вашем случае скорее всего апосле команды

Запрос.ВыполнитьПакет()

и смотрите в отладчике чт о у вас отдает запрос

если пропишете в отладке

Запрос.МенеджерВременныхТаблиц.Таблицы.ПолучитьДанные()
То получите массив результатов запроса,  каждый элемент массива - результат выполнения соответствующего пакета, соответственно  надо  посмотерть первый пакет

Запрос.МенеджерВременныхТаблиц.Таблицы.ПолучитьДанные()[0].Выгрузить()



Теги:

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

Рейтинг@Mail.ru

Поиск