Вывод результата запроса в зависимости от условий
Доброго всем.
Нужен совет в таком вопросе. Например делаем выборку к справочнику "Соглашения", в выборку могут попасть как типовые(поле реквизита - партнер пустое) соглашения, так и индивидуальные(т.е. привязанные к партнеру), отбор производится по реквизиту, вид операции в справочнике Соглашения. Также могут отобраться только типовые соглашения, в виду отсутствия у партнера заключенных индивидуальных.
Получаем 2 варианта результата:
1)
Соглашение типовое 1
Соглашение типовое 2 и т.д.
Соглашение индивидуальное 1
Соглашение индивидуальное 2 и т.д.
2)
Соглашение типовое 1
Соглашение типовое 2 и т.д.
Вопрос такой, как в самом запросе, с применением каких условий, вывести в результат, в случае если есть и индивидуальные и типовые(вар 1), только индивидуальные, а если индивидуальных нет, то типовые автоматом сами выведутся.
Это конечно можно все обыграть уже обрабатывая сам результат выборки, выгрузить в таблицу и искать строки по условию, но хочется уже самим запросом сделать эту проверку и отфильтровать лишнее и получить готовый результат.
Я пытался так. Сделал два вложенных запроса и в запросе с индивидуальными добавил поле ЭтоИндивидульный и приравнивал его к 1, а в вложенном к типовым 0 и это все по итогу поместил эти оба запроса во временную таблицу ВТ
И потом пытался анализировать итог временной таблицы в запросе, через конструкцию ВЫБОР, ТОГДА, КОГДА и если итог ЭтоИндивидульный > 0 , тогда условие ВТ.ЭтоИндивидуальный = 1 ИНАЧЕ ВТ.ЭтоИндивидуальный = 0. Но выдает ошибку на подсчете Итога.
Нужен совет в таком вопросе. Например делаем выборку к справочнику "Соглашения", в выборку могут попасть как типовые(поле реквизита - партнер пустое) соглашения, так и индивидуальные(т.е. привязанные к партнеру), отбор производится по реквизиту, вид операции в справочнике Соглашения. Также могут отобраться только типовые соглашения, в виду отсутствия у партнера заключенных индивидуальных.
Получаем 2 варианта результата:
1)
Соглашение типовое 1
Соглашение типовое 2 и т.д.
Соглашение индивидуальное 1
Соглашение индивидуальное 2 и т.д.
2)
Соглашение типовое 1
Соглашение типовое 2 и т.д.
Вопрос такой, как в самом запросе, с применением каких условий, вывести в результат, в случае если есть и индивидуальные и типовые(вар 1), только индивидуальные, а если индивидуальных нет, то типовые автоматом сами выведутся.
Это конечно можно все обыграть уже обрабатывая сам результат выборки, выгрузить в таблицу и искать строки по условию, но хочется уже самим запросом сделать эту проверку и отфильтровать лишнее и получить готовый результат.
Я пытался так. Сделал два вложенных запроса и в запросе с индивидуальными добавил поле ЭтоИндивидульный и приравнивал его к 1, а в вложенном к типовым 0 и это все по итогу поместил эти оба запроса во временную таблицу ВТ
И потом пытался анализировать итог временной таблицы в запросе, через конструкцию ВЫБОР, ТОГДА, КОГДА и если итог ЭтоИндивидульный > 0 , тогда условие ВТ.ЭтоИндивидуальный = 1 ИНАЧЕ ВТ.ЭтоИндивидуальный = 0. Но выдает ошибку на подсчете Итога.
По теме из базы знаний
- Консоль запросов со встроенным Конструктором запросов для 1с8.3 (8.2) своими руками
- Зачем запросу план и кто его выполняет?
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- Как читать чужой код? Часть 3. Разбор и доработка запросов
- Варианты отладки и оптимизации запросов в 1С
Найденные решения
(8) вчера чуть ошибся по памяти). вложенные запросы это было в первоначальной версии, потом модифицировал через выбор и обошелся без внутренних запросов
"ВЫБРАТЬ
| СпрСоглашенияСКлиентами.Ссылка КАК Соглашение,
| СпрСоглашенияСКлиентами.ВидЦен КАК ВидЦены,
| СпрСоглашенияСКлиентами.Склад КАК Склад,
| СпрСоглашенияСКлиентами.Валюта КАК Валюта,
| ВЫБОР
| КОГДА СпрСоглашенияСКлиентами.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК ИндивидуальноеСоглашение
|ПОМЕСТИТЬ ВТ_Соглашения
| ИЗ
| Справочник.СоглашенияСКлиентами КАК СпрСоглашенияСКлиентами
| ГДЕ
| СпрСоглашенияСКлиентами.Организация = &Организация
| И НЕ СпрСоглашенияСКлиентами.Ссылка.ПометкаУдаления
| И ВЫБОР
| КОГДА СпрСоглашенияСКлиентами.ДатаНачалаДействия <> &ПустаяДата
| ТОГДА СпрСоглашенияСКлиентами.ДатаНачалаДействия <= &НачДата
| ИНАЧЕ СпрСоглашенияСКлиентами.ДатаНачалаДействия = &ПустаяДата
| КОНЕЦ
| И ВЫБОР
| КОГДА СпрСоглашенияСКлиентами.ДатаОкончанияДействия <> &ПустаяДата
| ТОГДА СпрСоглашенияСКлиентами.ДатаОкончанияДействия >= &КонДата
| ИНАЧЕ СпрСоглашенияСКлиентами.ДатаОкончанияДействия = &ПустаяДата
| КОНЕЦ
| И СпрСоглашенияСКлиентами.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСКлиентами.Действует)
| И СпрСоглашенияСКлиентами.Партнер В (&МассивПартнеров)
| И СпрСоглашенияСКлиентами.Контрагент В (&МассивКонтрагентов)
| И СпрСоглашенияСКлиентами.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияРекламныхМатериалов)
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Соглашения.Соглашение КАК Соглашение,
| ВТ_Соглашения.ВидЦены КАК ВидЦены,
| ВТ_Соглашения.Валюта КАК Валюта,
| ВТ_Соглашения.Склад КАК Склад
|ИЗ
| ВТ_Соглашения КАК ВТ_Соглашения
|ГДЕ
| ВТ_Соглашения.ИндивидуальноеСоглашение В
| (ВЫБРАТЬ
| МАКСИМУМ(ВТ_Соглашения.ИндивидуальноеСоглашение)
| ИЗ ВТ_Соглашения КАК ВТ_Соглашения
| )
|";
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(5) интересно как все-таки решили это запросом?
у меня получилось что-то вроде этого:
у меня получилось что-то вроде этого:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Партнеры.Ссылка КАК Партнер
ПОМЕСТИТЬ ВТ_Партнеры
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Ссылка В(&СписокПартнеров)
ИНДЕКСИРОВАТЬ ПО
Партнер
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Партнеры.Партнер КАК Партнер,
ИндивидуальныеСоглашения.Ссылка КАК Соглашение,
НЕ ИндивидуальныеСоглашения.Типовое КАК ЭтоИндивидуальноеСоглашение
ПОМЕСТИТЬ ВТ_СоглашенияПартнеров
ИЗ
ВТ_Партнеры КАК ВТ_Партнеры
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СоглашенияСКлиентами КАК ИндивидуальныеСоглашения
ПО (ВТ_Партнеры.Партнер = ИндивидуальныеСоглашения.Партнер)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВТ_Партнеры.Партнер,
ТиповыеСоглашения.Ссылка,
НЕ ТиповыеСоглашения.Типовое
ИЗ
ВТ_Партнеры КАК ВТ_Партнеры
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СоглашенияСКлиентами КАК ТиповыеСоглашения
ПО (ТиповыеСоглашения.Типовое)
ИНДЕКСИРОВАТЬ ПО
ЭтоИндивидуальноеСоглашение
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_СоглашенияПартнеров.Партнер КАК Партнер,
МАКСИМУМ(ВТ_СоглашенияПартнеров.ЭтоИндивидуальноеСоглашение) КАК ЕстьИндивидуальноеСоглашение
ПОМЕСТИТЬ ВТ_Сгруппированные
ИЗ
ВТ_СоглашенияПартнеров КАК ВТ_СоглашенияПартнеров
СГРУППИРОВАТЬ ПО
ВТ_СоглашенияПартнеров.Партнер
ИНДЕКСИРОВАТЬ ПО
ЕстьИндивидуальноеСоглашение
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Сгруппированные.Партнер КАК Партнер,
ВТ_СоглашенияПартнеров.Соглашение КАК Соглашение
ИЗ
ВТ_СоглашенияПартнеров КАК ВТ_СоглашенияПартнеров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Сгруппированные КАК ВТ_Сгруппированные
ПО (ВТ_Сгруппированные.Партнер = ВТ_СоглашенияПартнеров.Партнер)
И (ВТ_Сгруппированные.ЕстьИндивидуальноеСоглашение = ВТ_СоглашенияПартнеров.ЭтоИндивидуальноеСоглашение)
Показать
(8)у меня другая реализация и кода меньше, но тоже через максимум) завтра выложу запрос. Так по памяти, сделал два вложенных запроса, в индивидуальных приравнял 1, в общих к 0 и объединил, потом закинул в таблицузначений в самом запросе и выбрал только те, которые соответствуют максимуму, т.е. если это 1, то выйдут только индивидуальные, а если их нет, то 0 будет максимумом и выйдут все что есть
(8) вчера чуть ошибся по памяти). вложенные запросы это было в первоначальной версии, потом модифицировал через выбор и обошелся без внутренних запросов
"ВЫБРАТЬ
| СпрСоглашенияСКлиентами.Ссылка КАК Соглашение,
| СпрСоглашенияСКлиентами.ВидЦен КАК ВидЦены,
| СпрСоглашенияСКлиентами.Склад КАК Склад,
| СпрСоглашенияСКлиентами.Валюта КАК Валюта,
| ВЫБОР
| КОГДА СпрСоглашенияСКлиентами.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК ИндивидуальноеСоглашение
|ПОМЕСТИТЬ ВТ_Соглашения
| ИЗ
| Справочник.СоглашенияСКлиентами КАК СпрСоглашенияСКлиентами
| ГДЕ
| СпрСоглашенияСКлиентами.Организация = &Организация
| И НЕ СпрСоглашенияСКлиентами.Ссылка.ПометкаУдаления
| И ВЫБОР
| КОГДА СпрСоглашенияСКлиентами.ДатаНачалаДействия <> &ПустаяДата
| ТОГДА СпрСоглашенияСКлиентами.ДатаНачалаДействия <= &НачДата
| ИНАЧЕ СпрСоглашенияСКлиентами.ДатаНачалаДействия = &ПустаяДата
| КОНЕЦ
| И ВЫБОР
| КОГДА СпрСоглашенияСКлиентами.ДатаОкончанияДействия <> &ПустаяДата
| ТОГДА СпрСоглашенияСКлиентами.ДатаОкончанияДействия >= &КонДата
| ИНАЧЕ СпрСоглашенияСКлиентами.ДатаОкончанияДействия = &ПустаяДата
| КОНЕЦ
| И СпрСоглашенияСКлиентами.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСКлиентами.Действует)
| И СпрСоглашенияСКлиентами.Партнер В (&МассивПартнеров)
| И СпрСоглашенияСКлиентами.Контрагент В (&МассивКонтрагентов)
| И СпрСоглашенияСКлиентами.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияРекламныхМатериалов)
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Соглашения.Соглашение КАК Соглашение,
| ВТ_Соглашения.ВидЦены КАК ВидЦены,
| ВТ_Соглашения.Валюта КАК Валюта,
| ВТ_Соглашения.Склад КАК Склад
|ИЗ
| ВТ_Соглашения КАК ВТ_Соглашения
|ГДЕ
| ВТ_Соглашения.ИндивидуальноеСоглашение В
| (ВЫБРАТЬ
| МАКСИМУМ(ВТ_Соглашения.ИндивидуальноеСоглашение)
| ИЗ ВТ_Соглашения КАК ВТ_Соглашения
| )
|";
Показать
Выбрать только индивидуальные поместить во временную таблицу ИНД
Выбрать только типовые с условием ГДЕ поместить во временную таблицу ТИП
Объединить ИНД и ТИП отсортировать если надо
ГДЕ (ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ИНД) = 0 // Не проверял
Если условие не отрабатывает тогда перед вторым запросом
ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Кво ПОМЕСТИТЬ _ГДЕ ИЗ ИНД
Выбрать только типовые с условием ГДЕ поместить во временную таблицу ТИП
ЛЕВОЕ СОЕДИНЕНИЕ _ГДЕ ПО ИСТИНА
ГДЕ _ГДЕ.Кво = 0
Выбрать только типовые с условием ГДЕ поместить во временную таблицу ТИП
Объединить ИНД и ТИП отсортировать если надо
ГДЕ (ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ИНД) = 0 // Не проверял
Если условие не отрабатывает тогда перед вторым запросом
ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Кво ПОМЕСТИТЬ _ГДЕ ИЗ ИНД
Выбрать только типовые с условием ГДЕ поместить во временную таблицу ТИП
ЛЕВОЕ СОЕДИНЕНИЕ _ГДЕ ПО ИСТИНА
ГДЕ _ГДЕ.Кво = 0
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот