Версия для печати темы (https://pro1c.org.ua/index.php?s=11c583a95190e93b9b66307587129cb8&showtopic=58987)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Реализация = Возврат (нулевой оборот при наличии продаж)

Автор: Bon Jovi 15.05.20, 8:37

Конфигурация: Trade (10.3.29.1) (http://v8.1c.ru/trade/), версия: 8.3.11.2867, обычные формы.
Добрый день. Начинающий программист. Подскажите пожалуйста, в чём может быть проблема. Есть запрос, мне нужно сделать так, чтобы когда я задавал параметр (число) он анализировал заданное значение и по запуску запроса в табличной части отображался результат где кол-во документов с нулевым оборотом >= "выставленного значения" (за указанный день). Если в качестве параметра я указываю 0 или 1, то выдаётся такой результат: https://pro1c.org.ua/redirect.php?https://ibb.co/9qFdv9F. Как я понимаю, за указанную дату по номенклатуре было проведено два возврата, то есть условие >= 0 или 1, работает. Но стоит мне изменить на 2 и выше, то результат пустой. Подскажите, где я совершил ошибку?

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот
ПОМЕСТИТЬ ЗапросПоНоменклатуре
ИЗ
    РегистрНакопления.Продажи.Обороты(&Дата_Начала, &Дата_Окончания, Регистратор, ) КАК ПродажиОбороты

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Номенклатура

ИМЕЮЩИЕ
    СУММА(ПродажиОбороты.КоличествоОборот) = 0
;

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

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Регистратор

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор) >= &КоличествоВозвратов
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ВозвратТоваровОтПокупателяТовары.Номенклатура КАК Номенклатура,
    ВозвратТоваровОтПокупателяТовары.ДокументПартии КАК Реализция,
    ВозвратТоваровОтПокупателяТовары.Ссылка КАК Возврат,
    ВозвратТоваровОтПокупателяТовары.Склад КАК СкладВозврата
ИЗ
    Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
ГДЕ
    ВозвратТоваровОтПокупателяТовары.Ссылка В
            (ВЫБРАТЬ
                ЗапросПоВозвратам.Регистратор КАК Регистратор
            ИЗ
                ЗапросПоВозвратам КАК ЗапросПоВозвратам)

СГРУППИРОВАТЬ ПО
    ВозвратТоваровОтПокупателяТовары.Номенклатура,
    ВозвратТоваровОтПокупателяТовары.ДокументПартии,
    ВозвратТоваровОтПокупателяТовары.Ссылка,
    ВозвратТоваровОтПокупателяТовары.Склад

УПОРЯДОЧИТЬ ПО
    Реализция УБЫВ,
    Номенклатура
ИТОГИ
    КОЛИЧЕСТВО(Реализция),
    КОЛИЧЕСТВО(Возврат)
ПО
    Номенклатура
АВТОУПОРЯДОЧИВАНИЕ

Автор: TohaMonster 18.05.20, 11:25

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

1. Зачем Вам периодичность Регистратор в первом запросе?
2. Зачем Вам левое соединение во втором запросе? Нельзя ли Номенклатуру передать как отбор в виртуальной таблице?
3. Не получится ли как либо оптимизировать во втором запросе "Обороты(&Дата_Начала, &Дата_Окончания, ...)" и "ГДЕ ... НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) = &ДатаВозврата"?
4. Во второй временной таблице Регистратор нужен для группировки или для вычисления агрегатной функции в условии?
5. Если ответ на 4й вопрос (или хотя бы часть ответа): "для агрегатной функции", то не нужно ли здесь еще добавить какую-то группировку?

Предполагаю, что ответы на 4й и 5й вопросы - ключевые для решения Вашей проблемы

Автор: fly 18.05.20, 14:56

Bon Jovi @ 15.05.20, 8:37 * ,

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Регистратор
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор) >= &КоличествоВозвратов
;


вы получаете 1 регистратор, или 0 регистраторов.

2а не может быть.

если бы вы группировали по Номенклатуре, то вероятнее всего могло быть и больше.

Автор: Bon Jovi 20.05.20, 10:40

TohaMonster @ 18.05.20, 12:25 * ,

Честно, не скажу, так как дали доработать запрос и на сколько я понял на мой результат не влияет.
Мне нужно оставить только ту номенклатуру, у который за период было количество возвратов больше либо равно моего указанного значения.
Вот например мой результат:


По итогам у номенклатуры 10 документов возврата. Значит она попадает в условие >= &значения. Но как это задать, я не знаю. Условие по ИТОГОМ вроде нельзя задавать.

fly @ 18.05.20, 15:56 * ,

Вот оригинальный запрос. Остальное мои попытки.

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот
ПОМЕСТИТЬ ЗапросПоНоменклатуре
ИЗ
    РегистрНакопления.Продажи.Обороты(&Дата_Начала, &Дата_Окончания, Регистратор, ) КАК ПродажиОбороты

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Номенклатура

ИМЕЮЩИЕ
    СУММА(ПродажиОбороты.КоличествоОборот) = 0
;

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

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВозвратТоваровОтПокупателяТовары.Номенклатура КАК Номенклатура,
    ВозвратТоваровОтПокупателяТовары.ДокументПартии КАК Реализция,
    ВозвратТоваровОтПокупателяТовары.Ссылка КАК Возврат
ИЗ
    Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
ГДЕ
    ВозвратТоваровОтПокупателяТовары.Ссылка В
            (ВЫБРАТЬ
                ЗапросПоВозвратам.Регистратор КАК Регистратор
            ИЗ
                ЗапросПоВозвратам КАК ЗапросПоВозвратам)

УПОРЯДОЧИТЬ ПО
    Реализция УБЫВ,
    Номенклатура
ИТОГИ
    КОЛИЧЕСТВО(Реализция),
    КОЛИЧЕСТВО(Возврат)
ПО
    Номенклатура
АВТОУПОРЯДОЧИВАНИЕ



 ! 

https://pro1c.org.ua/index.php?act=announce&id=2: 8
 

Автор: Bon Jovi 25.05.20, 15:52

Нашёл решение. Готовый запрос:

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот
ПОМЕСТИТЬ ЗапросПоНоменклатуре
ИЗ
    РегистрНакопления.Продажи.Обороты(&Дата_Начала, &Дата_Окончания, Регистратор, ) КАК ПродажиОбороты

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Номенклатура

ИМЕЮЩИЕ
    СУММА(ПродажиОбороты.КоличествоОборот) = 0
;

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

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Регистратор
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВозвратТоваровОтПокупателяТовары.Номенклатура КАК Номенклатура,
    ЗначенияСвойствОбъектов.Значение КАК TOPGP
ПОМЕСТИТЬ ТЗНоменклатуры
ИЗ
    Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО ВозвратТоваровОтПокупателяТовары.Номенклатура = ЗначенияСвойствОбъектов.Объект
ГДЕ
    ВозвратТоваровОтПокупателяТовары.Ссылка В
            (ВЫБРАТЬ
                ЗапросПоВозвратам.Регистратор КАК Регистратор
            ИЗ
                ЗапросПоВозвратам КАК ЗапросПоВозвратам)
    И ЗначенияСвойствОбъектов.Свойство.Код = "000000467"

СГРУППИРОВАТЬ ПО
    ВозвратТоваровОтПокупателяТовары.Номенклатура,
    ЗначенияСвойствОбъектов.Значение

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(ВозвратТоваровОтПокупателяТовары.Ссылка) >= ВЫБОР
        КОГДА &КоличествоВозвратов = 0
            ТОГДА 3
        ИНАЧЕ &КоличествоВозвратов
    КОНЕЦ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВозвратТоваровОтПокупателяТовары.Номенклатура КАК Номенклатура,
    ВозвратТоваровОтПокупателяТовары.ДокументПартии КАК Реализация,
    ВозвратТоваровОтПокупателяТовары.Ссылка КАК Возврат,
    ВозвратТоваровОтПокупателяТовары.Склад КАК Склад
ПОМЕСТИТЬ ПоследниеВозвраты
ИЗ
    ВозвратыЗаДату КАК ВозвратыЗаДату
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
        ПО ВозвратыЗаДату.Номенклатура = ВозвратТоваровОтПокупателяТовары.Номенклатура
ГДЕ
    ВозвратТоваровОтПокупателяТовары.Ссылка В
            (ВЫБРАТЬ
                ЗапросПоВозвратам.Регистратор КАК Регистратор
            ИЗ
                ЗапросПоВозвратам КАК ЗапросПоВозвратам)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПоследниеВозвраты.Номенклатура КАК Номенклатура,
    ТЗНоменклатуры.TOPGP КАК TOPGP,
    ПоследниеВозвраты.Реализация КАК Реализация,
    ПоследниеВозвраты.Возврат КАК Возврат,
    ПоследниеВозвраты.Склад КАК Склад
ИЗ
    ТЗНоменклатуры КАК ТЗНоменклатуры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПоследниеВозвраты КАК ПоследниеВозвраты
        ПО ТЗНоменклатуры.Номенклатура = ПоследниеВозвраты.Номенклатура

УПОРЯДОЧИТЬ ПО
    Реализация УБЫВ,
    Номенклатура
ИТОГИ
    КОЛИЧЕСТВО(Реализация),
    КОЛИЧЕСТВО(Возврат)
ПО
    Номенклатура
АВТОУПОРЯДОЧИВАНИЕ

Автор: andr_andrey 26.05.20, 15:53

Цитата(Bon Jovi @ 25.05.20, 16:52) *
ЗначенияСвойствОбъектов.Свойство.Код = "000000467"

"Магические" константы правят миром smile.gif

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua