|ИЗ
| РегистрСведений.алкСоответствияДокументовЕГАИСИУчетныхДокументов КАК алкСоответствияТекущихТТНЕГАИС
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТоварыТекущий
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателяТаблица
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.алкСоответствияДокументовЕГАИСИУчетныхДокументов КАК алкСоответствияВсехТТНЕГАИС
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.алкАктКТоварноТранспортнойНакладнойЕГАИС КАК алкАктКТоварноТранспортнойНакладнойЕГАИС
| ПО алкСоответствияВсехТТНЕГАИС.ДокументЕГАИС.Ссылка = алкАктКТоварноТранспортнойНакладнойЕГАИС.ТоварноТранспортнаяНакладнаяЕГАИС
| И (ИСТИНА = алкАктКТоварноТранспортнойНакладнойЕГАИС.Проведен)
| ПО РеализацияТоваровУслугТовары.Ссылка = алкСоответствияВсехТТНЕГАИС.УчетныйДокумент
| И (ТИПЗНАЧЕНИЯ(алкСоответствияВсехТТНЕГАИС.ДокументЕГАИС) = ТИП(Документ.алкТоварноТранспортнаяНакладнаяЕГАИС))
| ПО ЗаказПокупателяТаблица.Ссылка = РеализацияТоваровУслугТовары.ЗаказПокупателя
| ПО РеализацияТоваровУслугТоварыТекущий.ЗаказПокупателя = ЗаказПокупателяТаблица.Ссылка
| ПО ((ВЫРАЗИТЬ(алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент КАК Документ.РеализацияТоваровУслуг)) = РеализацияТоваровУслугТоварыТекущий.Ссылка)
Показать
Не могу понять если смысл использовать "ВЫРАЗИТЬ(алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент КАК Документ.РеализацияТоваровУслуг)"?
(1) ВЫРАЗИТЬ это инструкция для движка ORM на ограничение типов.
Конкретно в данном примере она кажется излишней.
Но для точного ответа надо смотреть профайлер
Функция Выразить() позволяет привести значение поля запроса 1С к определенному типу. Это может понадобиться в двух случаях:
1. Получить нужную разрядность числа или нужное количество символов строкового значения. Количество символов полей неограниченного типа приходится ограничить из-за определенных особенностей.
ВЫРАЗИТЬ(Номенклатура.Комментарий КАК СТРОКА(300))
ВЫРАЗИТЬ(Номенклатура.Цена КАК ЧИСЛО(15, 2)) КАК Сумма
2. Преобразовать поле составного типа в поле с одним типом. Это может понадобиться в целях оптимизации запросов. Если в типизированное поле попадёт значение другого типа, то система вернёт NULL, поэтому всегда необходимо дополнительно устанавливать условие в секции «ГДЕ», ограничивая его оператором ССЫЛКА.
10.
Aleksandr_prof
19924.03.20 18:28 Сейчас в теме
Встроенный 1С оптимизатор не совсем хорошо обрабатывает поля получаемые через точку (алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент).
С помощью оператора «ВЫРАЗИТЬ», для в полей имеющих составной тип данных, возможно ограничить попадание значений которые не соответствуют определённому типу данных. Причём такие ограничения можно сделать ещё на этапе выборки данных. Такие действия приводят к неявной оптимизации запросов.
1. алкСоответствияТекущихТТНЕГАИС - регистр, а "УчетныйДокумент" - реквизит данного регистра (измерение, ресурс, реквизит).
2. Данный реквизит, скорее всего, имеет составной тип, в состав которого входит объект конфигурации "Документ.РеализацияТоваровУслуг"
3. Если не применить конструкцию ВЫРАЗИТЬ, то при соединении таблиц будет сканирование таблиц всех объектов конфигурации, входящих в состав того самого составного типа реквизита. При применении ВЫРАЗИТЬ при выполнении запроса "отсекаются" таблицы всех объектов, входящих в состав реквизита "УчетныйДокумент", кроме "Документ.РеализацияТоваровУслуг".
(11) Зачем производить сканирование, если в алкСоответствияТекущихТТНЕГАИС УчетныйДокумент это ссылка ока и в РеализацияТоваровУслугТоварыТекущий Ссылка это ссылка. Ссылки это условно строки. Сравнивай и соединяй.
(12) Внимательно перечитай (11).
Представь, что у тебя реквизит с типом "ЛюбойДокумент", и в конфигурации 100 документов. При соединении будут просканированы все 100 таблиц документов. Сколько это будет документов? Много. И запрос будет работать медленно. Чтобы этого избежать, если ты точно знаешь, документ какого типа тебе нужен в соединении, и используется ВЫРАЗИТЬ.
Подробно расписано на ИТС: https://its.1c.ru/db/v8std/content/654/hdoc (Разыменование ссылочных полей составного типа в языке запросов).
Там правда не конкретно про соединение, но разыменование приводит к соединению.
(13) Мой вопрос вообще не про разыменование. Я понимаю как это работает. И зачем ВЫРАЗИТЬ использовать в этом случае. Правильно для того чтобы убрать лишние неявные соединения. Но в примере мы просто соединяем таблицы. Какой смысл в ВЫРАЗИТЬ. Я такого не в типовых конфигурациях не видел, не в примерах использования. Если бы в соединении был бы смысл использовать ВЫРАЗИТЬ думаете не было бы не одной статьи про такой прием с явным указанием?
Спасибо за ответы, но такое ощущение что половина отвечающих смотрят только на абзац "Не могу понять если смысл использовать "ВЫРАЗИТЬ(алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент КАК Документ.РеализацияТоваровУслуг)"?" и не смотрят на блок с частью запроса. Хоть бы кто пнул давай весь запрос.