Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка: отбор по подразделению
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Constantus
Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003-2014 (2.3.20.1)

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

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


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

    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("Подразделение", Подразделение);
    Запрос.УстановитьПараметр("Дата1", ДатаНачала);
    Запрос.УстановитьПараметр("Дата2", ДатаОкончания);
Constantus
Bernet @ Сегодня, 14:09 необходимо зарегистрироваться для просмотра ссылки ,

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


З.Ы, Конструктор запросов будет работать smile.gif
Constantus
Flexy @ Сегодня, 16:45 необходимо зарегистрироваться для просмотра ссылки ,

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

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

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

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

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

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


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

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


Шайтан-2!
Batchir
а я бы написал

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

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


Тоже конструктор будет работать. Нужно по возможности упрощать текст запроса который сервер 1С посылает серверу СУБД.
Мало ли какие данные (и как) хранятся в СУБД. Усложнение фильтров может повлиять на выборку данных, чем проще и точнее условия, тем проще оптимизатору СУБД построить оптимальный план запроса.
andr_andrey
Самое прикольное, что в типовых мы встречаем все три варианта. 32541510.gif
Bernet
andr_andrey @ Сегодня, 11:24 необходимо зарегистрироваться для просмотра ссылки ,
Ну есть ещё один вариант - заранее сформировать строку с отбором с учетом всех условий и потом только вставить в разрыв текста запроса, конструктором я особо не пользуюсь, а читается мне так проще, типа такого:
ТекстФильтра = "ГДЕ ВложенныйЗапрос.Организация = &Организация ";
Если ЗначениеЗаполнено(Подразделение) Тогда
      ТекстФильтра = ТекстФильтра + " И ВложенныйЗапрос.Подразделение = &Подразделение";
ИначеЕсли Ошибочные Тогда
      ТекстФильтра = ТекстФильтра + " И ВложенныйЗапрос.Подразделение = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)";
КонецЕсли;

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