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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Запрос во внешнем отчёте

Автор: roman457 12.07.17, 16:17

Доброго времени суток знатоки.
Платформа 1С:Предприятие 8.3 (8.3.9.1850)
Конфигурация : УТ 2.3.25.1

Внешняя обработка( условно прайс) . Должна выбирать товар на складах ,цены и т.д.
С этим вроде проблем нет, но на форме есть до 6 фильтров. Городить огород с условиями не хотелось. По уму вычитал что использовать

выбор когда .

Все условия пролетают .

Хотелось получить опытную оценку каким способом лучше отбирать плавающие условия. Не возиться с отборами в таблице значений.

Если будет пример Буду благодарен.
Спасибо всем не равнодушным .

Автор: Petre 12.07.17, 16:19

roman457 @ Сегодня, 17:17 * ,
Нужна конкретика. Ну а если в общем и целом, то стройте на скд.

Автор: roman457 12.07.17, 16:44

Спасибо пойду курить СКД видимо пришло время . sad.gif

Автор: Bernet 12.07.17, 16:45

roman457 @ Сегодня, 17:17 * ,
Вообщем-то соглашусь с предыдущим постом, конкретнее скажите что вы делаете, на чем отчет пишите.

Если вы в ручную выполняете запрос и выводите результат на форму, то тогда либо делать это все с помощью Построителя либо динамически формировать текст запроса, например так:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    Реализация.Ссылка КАК Док,
|    Реализация.Контрагент КАК Контрагент,
|    Реализация.ДоговорКонтрагента КАК ДоговорКонтрагента
|ИЗ
|    Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
|    Реализация.Проведен = ИСТИНА
|    "+?(ЗначениеЗаполнено(КонтрагентФильтр), "И Реализация.Контрагент = &Контрагент", "")+"
|    "+?(ЗначениеЗаполнено(ДоговорФильтр), "И Реализация.ДоговорКонтрагента = &Договор", "")+"
|"

где КонтрагентФильтр, ДоговорФильтр - это ваши отборы на форме.
Но лучше всего такие вещи делать либо через СКД, либо если в конфигурации есть универсальный отчет - через универсальный отчет

Автор: roman457 12.07.17, 17:09

|    "+?(ЗначениеЗаполнено(КонтрагентФильтр), "И Реализация.Контрагент = &Контрагент", "")+"
|    "+?(ЗначениеЗаполнено(ДоговорФильтр), "И Реализация.ДоговорКонтрагента = &Договор", "")+"


то что нужно . В очередной раз убеждаюсь что копаю глубже чем нужно ( всё перед носом ) всем спасибо.

Автор: Santino 19.07.17, 16:39

Ну-ну. Такой запрос уже не откроете в конструкторе запроса. А если запрос составной, и кучей условий, то можно идти за веревкой с мылом...
Поэтому я применяю чутка другой подход.

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


    Если ЗначениеЗаполнено(ЭтотОбъект.ОтборКонтрагент) Тогда
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"&УсловиеКонтрагент","ДоговорыКонтрагентов.Владелец = &Контрагент");
        Запрос.УстановитьПараметр("Контрагент", ЭтотОбъект.ОтборКонтрагент);
    Иначе
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"&УсловиеКонтрагент","Истина");
    КонецЕсли; // ЗначениеЗаполнено(ЭтотОбъект.ОтборОрганизация)


Такой запрос и в конструкторе можно посмотреть, и разные пустые-непустые отборы нормально обрабатываются.

Автор: roman457 21.07.17, 13:53

Santino @ 19.07.17, 17:39 * ,
Спасибо за Предложение. Идея конструктора и предложения у меня открылось как говорится второе дыхание , а если по сути то заказчик вспомнил что он по дороге жизни хочет ещё пару условий.
Решил использовать метод , но что-то в синтаксисе упускаю ??

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

            Запрос.УстановитьПараметр("ТекДата", Дата(ТекущаяДата()));
            
            Если ЗначениеЗаполнено(СуммаС)Или ЗначениеЗаполнено(СуммаПо) Тогда
                ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"&УсловиеСоставное","ЦеныНоменклатурыСрезПоследних.Цена МЕЖДУ &СуммаС И &СУммаПо");
                Запрос.УстановитьПараметр("СуммаС", Строка(Элементыформы.Суммас.Значение));
                Запрос.УстановитьПараметр("СуммаПо", Строка(Элементыформы.СуммаПо.Значение));
            Иначе
                ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"&УсловиеСоставное","Истина");
            КонецЕсли;
                    РезультатЗапроса = Запрос.Выполнить();        
            ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
            ф = Запрос.Выполнить().Выгрузить();

Уже просто спортивный интерес если честно .

Автор: Flexy 21.07.17, 14:04

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

Автор: roman457 21.07.17, 14:24

Flexy @ Сегодня, 15:04 * ,
Увы но комментировать нельзя нужен результат по условиям с текстом автора. в ответе выше моего . спасибо .

Автор: Flexy 21.07.17, 14:27

Цитата(roman457 @ 21.07.17, 14:24) *
Увы но комментировать нельзя нужен результат по условиям с текстом автора. в ответе выше моего . спасибо .

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ТекДата, &УСловиеСоставное )

Условие в параметрах виртуальной таблицы не подходит?

Автор: Petre 21.07.17, 14:40

Цитата(roman457 @ 21.07.17, 15:24) *
Увы но комментировать нельзя нужен результат по условиям с текстом автора. в ответе выше моего .

Это тоже не на много лучше первого предложения.
Если нет времени на скд, то пробуйте построитель запроса. Там и текст запроса откроется в конструкторе, и условий можно добавлять чуть менее чем любых...

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