Конфигурация "УБУ" для Белоруссии (УФ) .
В динамическом списке журнала документов "Банк" требуется вывести флаг наличия подчиненных документов.
Итогом стал запрос:
ВЫБРАТЬ
ЖурналДокументовБанк.Ссылка,
ВЫБОР
КОГДА ЖурналДокументовБанк.Ссылка В
(ВЫБРАТЬ
ОказаниеУслуг.ДокументОснование
ИЗ
Документ.ОказаниеУслуг КАК ОказаниеУслуг
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПриходныйКассовыйОрдерВалюта.ДокументОснование
ИЗ
Документ.ПриходныйКассовыйОрдерВалюта КАК ПриходныйКассовыйОрдерВалюта)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ЕстьПодчиненные,
ЖурналДокументовБанк.Дата,
ЖурналДокументовБанк.Проведен,
ЖурналДокументовБанк.БанковскийСчет
ИЗ
ЖурналДокументов.Банк КАК ЖурналДокументовБанк
Показать
Подозреваю использование не документированной возможности (под запрос в поле) может привести к проблемам. Прошу совета.
(1) по сути эта возможность напрямую проецируется на sql. Там это точно поддерживается напрямую.
По сути сначала выполнится вложенный запрос, который получит таблицу условно-постоянных данных.
Основной запрос получит всю выборку из основной таблицы, а нужное поле будет сравниваться с результатом подзапроса. Если результат подзапроса не очень большой, то и производительность не пострадает.
(16) только учтите, что полученный результат подзапроса будет не индексирован. Соответственно поиск по нему будет полным перебором. На больших данных это будет проблема производительности.
Так что возможность есть, но использовать ее не всегда выгодно
(1) Прямого запрета на использование подобной конструкции в документации к платформе нет. Стало быть так делать можно.
Вот здесь можно почитать, как работает оператор "В". Не смотря на то, что все примеры используются в секции "ГДЕ", нет причин полагать, что они не справедливы и для секции "ВЫБРАТЬ".
А вот здесь можно почитать анализ использования такой конструкции в динамических списках. Автор публикации аргументированно настаивает, что такой подход в ряде случаев даже лучше, чем левое соединение.
ВЫБРАТЬ
ЖурналДокументовБанк.Ссылка,
ИСТИНА КАК ЕстьПодчиненные,
ЖурналДокументовБанк.Дата,
ЖурналДокументовБанк.Проведен,
ЖурналДокументовБанк.БанковскийСчет
ИЗ
ЖурналДокументов.Банк КАК ЖурналДокументовБанк
ГДЕ
ЖурналДокументовБанк.Ссылка В
(ВЫБРАТЬ
ОказаниеУслуг.ДокументОснование
ИЗ
Документ.ОказаниеУслуг КАК ОказаниеУслуг
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПриходныйКассовыйОрдерВалюта.ДокументОснование
ИЗ
Документ.ПриходныйКассовыйОрдерВалюта КАК ПриходныйКассовыйОрдерВалюта)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЖурналДокументовБанк.Ссылка,
ЛОЖЬ,
ЖурналДокументовБанк.Дата,
ЖурналДокументовБанк.Проведен,
ЖурналДокументовБанк.БанковскийСчет
ИЗ
ЖурналДокументов.Банк КАК ЖурналДокументовБанк
ГДЕ
НЕ ЖурналДокументовБанк.Ссылка В
(ВЫБРАТЬ
ОказаниеУслуг.ДокументОснование
ИЗ
Документ.ОказаниеУслуг КАК ОказаниеУслуг
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПриходныйКассовыйОрдерВалюта.ДокументОснование
ИЗ
Документ.ПриходныйКассовыйОрдерВалюта КАК ПриходныйКассовыйОрдерВалюта)
(10) По-моему, это ещё хуже. Может просто сделать 2 левых соединения к таблицам Документ.ОказаниеУслуг и Документ.ПриходныйКассовыйОрдерВалюта — если по обеим связям NULL, тогда Ложь, иначе Истина?
В ОбщийМодуль.ЗарплатаКадрыВызовСервера (БП 3.0.70.33) есть такое
ВЫБРАТЬ
ВЫБОР
КОГДА 1 В
(ВЫБРАТЬ ПЕРВЫЕ 1
1
ИЗ
ВТСотрудникиОрганизации КАК ОтобранныеСотрудники
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
ПО
Сотрудники.Ссылка = ОтобранныеСотрудники.Сотрудник
ГДЕ
Сотрудники.ТекущийПроцентСевернойНадбавки > 0
И НЕ &ПрименятьСевернуюНадбавку)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ОбработатьСН,
ВЫБОР
КОГДА 1 В
(ВЫБРАТЬ ПЕРВЫЕ 1
1
ИЗ
Справочник.ПодразделенияОрганизаций КАК Подразделения
ГДЕ
Подразделения.Владелец = Организации.Ссылка
И Подразделения.РайонныйКоэффициент <> 1
И НЕ &ПрименятьРайонныйКоэффициент)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ОбработатьРК
ИЗ
Справочник.Организации КАК Организации
ГДЕ
Организации.Ссылка = &Ссылка
И (Организации.ПрименятьСевернуюНадбавку <> &ПрименятьСевернуюНадбавку
ИЛИ Организации.ПрименятьРайонныйКоэффициент <> &ПрименятьРайонныйКоэффициент)
По утверждениям самой 1С (хотя могу убедительно согласится т. к. сталкивался) такая конструкция (с вложенными запросами) тем более с конструкцией ВЫБОР КОГДА и выражением "В", работает медленней чем левое соединение, есть даже рекомендации... а в дин. списке вообще будет конкретный тормоз )