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

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

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

Автор: Constantus 18.06.18, 10:53

Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003-2014 (2.3.20.1)

Сделал обработку с выводом результата по запросу.
..................................

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

    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("Подразделение", Подразделение);
    Запрос.УстановитьПараметр("Дата1", ДатаНачала);
    Запрос.УстановитьПараметр("Дата2", ДатаОкончания);


У обработки имеются реквизиты "Организация" и "Подразделение", отображенные на форме.
При открытии формы, значение "Подразделение" пустое и при запуске обработки выводит результаты по всем данным, где реквизит "Подразделение" не заполнен тоже.
Как добиться того, чтобы при пустом значении на форме выводились все результаты, игнорируя отбором по Подразделению.

Автор: Bernet 18.06.18, 11:09

Constantus @ Сегодня, 11:53 * ,

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

    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("Подразделение", Подразделение);
    Запрос.УстановитьПараметр("Дата1", ДатаНачала);
    Запрос.УстановитьПараметр("Дата2", ДатаОкончания);

Автор: Constantus 18.06.18, 11:25

Bernet @ Сегодня, 14:09 * ,

Шайтан!!!

Автор: Flexy 18.06.18, 13:45

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


З.Ы, Конструктор запросов будет работать smile.gif

Автор: Constantus 18.06.18, 14:43

Flexy @ Сегодня, 16:45 * ,

Не совсем корректно работает...

Усложним задачу. В идеале, все Подразделения должны быть заполнены, но тем не менее есть что-то пропущено, т.е. значения Подразделений пустые.

Я разместил реквизит булево "Пропущено" на форме. Теперь, в случае, если значение параметра на форме "Подразделения" пустое, то должно выводить все значения, а вот если стоит галка "Пропущено" вывести все пустые значения Подразделений:

Т.е., если НЕ ЗначениеЗаполнено(Подразделение), но Пропущено=Истина, тогда Подразделение = ПустаяСсылка()

Попробовал добавить:

?(Ошибочные, "И ВложенныйЗапрос.Подразделение = Справочники.Подразделения.ПустаяСсылка()", "")


Дает синтактическую ошибку:

"+?(ЗначениеЗаполнено(Подразделение), "И ВложенныйЗапрос.Подразделение = &Подразделение", ?(Ошибочные, "И ВложенныйЗапрос.Подразделение = Справочники.Подразделения.ПустаяСсылка()", ""))+"

Автор: Bernet 18.06.18, 14:53

Constantus @ Сегодня, 15:43 * ,
"+?(ЗначениеЗаполнено(Подразделение), "И ВложенныйЗапрос.Подразделение = &Подразделение", ?(Ошибочные, "И ВложенныйЗапрос.Подразделение = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)", ""))+"

Автор: Constantus 18.06.18, 15:04

Bernet @ Сегодня, 17:53 * ,


Шайтан-2!

Автор: Batchir 19.06.18, 8:42

а я бы написал

|ГДЕ
|    ВложенныйЗапрос.Организация = &Организация
|    И 1 = 1

И в зависимости от необходимых данных делал
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"1 = 1", "<необходимое простое условие>");


Тоже конструктор будет работать. Нужно по возможности упрощать текст запроса который сервер 1С посылает серверу СУБД.
Мало ли какие данные (и как) хранятся в СУБД. Усложнение фильтров может повлиять на выборку данных, чем проще и точнее условия, тем проще оптимизатору СУБД построить оптимальный план запроса.

Автор: andr_andrey 19.06.18, 10:24

Самое прикольное, что в типовых мы встречаем все три варианта. 32541510.gif

Автор: Bernet 19.06.18, 10:33

andr_andrey @ Сегодня, 11:24 * ,
Ну есть ещё один вариант - заранее сформировать строку с отбором с учетом всех условий и потом только вставить в разрыв текста запроса, конструктором я особо не пользуюсь, а читается мне так проще, типа такого:

ТекстФильтра = "ГДЕ ВложенныйЗапрос.Организация = &Организация ";
Если ЗначениеЗаполнено(Подразделение) Тогда
      ТекстФильтра = ТекстФильтра + " И ВложенныйЗапрос.Подразделение = &Подразделение";
ИначеЕсли Ошибочные Тогда
      ТекстФильтра = ТекстФильтра + " И ВложенныйЗапрос.Подразделение = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)";
КонецЕсли;

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

Автор: andr_andrey 19.06.18, 11:34

Bernet @ Сегодня, 11:33 * ,
Редактирование конструктором дорогого стоит, а эти плюсики посреди десятиэкранного запроса заставляют думать о разработчике недоброе smile.gif

Автор: Bernet 19.06.18, 11:59

andr_andrey @ Сегодня, 12:34 * ,
и тем не менее половина типовых механизмов именно так реализована

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