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

Где можно почитать инфу про эту задачу

Автор Nosferatu112, 17 янв 2023, 17:41

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

LexaK

Максим75, возьмите еще такой вариант
(а еще лучше используйте динамическое формирование текста условия, гораздо оптимальнее получится)

ГДЕ
   &Контрагент в (Значение(Справочник.Контрагенты.ПустаяСсылка), ПриобретениеТоваровУслугТовары.Ссылка.Контрагент)
если помогло нажмите: Спасибо!

Nosferatu112

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

Я сделал как посоветовал максим полностью но так получаеться громоздко очень второй вариант отличный но какое значение можно указать для даты и цены

LexaK

пустые значения
Цена = 0
Дата = ПустаяДата
если помогло нажмите: Спасибо!

Максим75

передать в запрос в условие на проверку пустой даты через функцию ДатаВремя(1,1,1).
вроде бы так.

Afinogen

Для начала у вас цены должны быть загружены в базу,  для этого  есть  типовой документ - "Установка цен"
далее учитывайте момент  округления, насколько я помню в типовой УТ цена в приобретении либо  с НДС либо  без  в зависимости от условий договора, а значит нужно будет либо  накручивать либо откручивать НДС - тут вопрос по округлениям

Afinogen

Вот это
Цитировать&НеПроверятьДату
ИЛИ ПриобретениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатНач И &ДатКон
Можно по другому обернуть
ВЫБОР КОГДА &ДатНач = ДАТАВРЕМЯ(1,1,1,0,0,0) ТОГДА
        ИСТИНА
     ИНАЧЕ
       ВЫБОР КОГДА ПриобретениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатНач И &ДатКон ТОГДА
          ИСТИНА
      ИНАЧЕ
          ЛОЖЬ
      КОНЕЦ
КОНЕЦ = ИСТИНА

Даже последнее равенство на истину лишнее)

 

Afinogen

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

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

Если ЗначениеЗаполнено(Объект.Номенклатура) Тогда

Условие = Условие+?(ЗначениеЗаполнено(Условие)," И ","")+" ПриобретениеТоваровУслугТовары.Номенклатура = &Номенклатура ";

Конецесли;

Если ЗначениеЗаполнено(Объект.Контрагент) Тогда

Условие = Условие+?(ЗначениеЗаполнено(Условие)," И ","")+" ПриобретениеТоваровУслугТовары.Контрагент= &Контрагент";

Конецесли;

Если ЗначениеЗаполнено(Объект.Период.ДатаНачала) Тогда

Условие = Условие+?(ЗначениеЗаполнено(Условие)," И ","")+" ПриобретениеТоваровУслугТовары.Ссылка.Дата >=&ДатНач";

Конецесли;

Если ЗначениеЗаполнено(Объект.Период.ДатаОкончания) Тогда

Условие = Условие+?(ЗначениеЗаполнено(Условие)," И ","")+" ПриобретениеТоваровУслугТовары.Ссылка.Дата <=&ДатКон";

Конецесли;

Если ЗначениеЗаполнено(Объект.МинЦен) Тогда

Условие = Условие+?(ЗначениеЗаполнено(Условие)," И ","")+" ПриобретениеТоваровУслугТовары.Цена  >=&МинЦен";

Конецесли;

Если ЗначениеЗаполнено(Объект.МаксЦен) Тогда

Условие = Условие+?(ЗначениеЗаполнено(Условие)," И ","")+" ПриобретениеТоваровУслугТовары.Цена  <=&МаксЦен";

Конецесли;

Если НЕ ЗначениеЗаполнено(Условие) Тогда

Условие = " ИСТИНА ";

КонецЕсли;


    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПриобретениеТоваровУслугТовары.Ссылка КАК ДокументПоступления
        |ИЗ
        |    Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары
        |ГДЕ &Условие";

    Запрос.Текст = СтрЗаменить(Запрос.Текст,"&Условие",Условие)


    Запрос.УстановитьПараметр("ДатНач", Объект.Период.ДатаНачала);
    Запрос.УстановитьПараметр("ДатКон", Объект.Период.ДатаОкончания);
    Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);
    Запрос.УстановитьПараметр("МинЦен", Объект.МинЦен);
    Запрос.УстановитьПараметр("МаксЦен", Объект.МаксЦен);
    Запрос.УстановитьПараметр("Номенклатура", Объект.Номенклатура);       
       
 

Теги:

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

Рейтинг@Mail.ru

Поиск