Зачем использование функции ВЫРАЗИТЬ в соединении таблиц?

1. NicholasUzunov 24.03.20 17:17 Сейчас в теме
Увидел соединение:

|ИЗ
	|	РегистрСведений.алкСоответствияДокументовЕГАИСИУчетныхДокументов КАК алкСоответствияТекущихТТНЕГАИС
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТоварыТекущий
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателяТаблица
	|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
	|					ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.алкСоответствияДокументовЕГАИСИУчетныхДокументов КАК алкСоответствияВсехТТНЕГАИС
	|						ЛЕВОЕ СОЕДИНЕНИЕ Документ.алкАктКТоварноТранспортнойНакладнойЕГАИС КАК алкАктКТоварноТранспортнойНакладнойЕГАИС
	|						ПО алкСоответствияВсехТТНЕГАИС.ДокументЕГАИС.Ссылка = алкАктКТоварноТранспортнойНакладнойЕГАИС.ТоварноТранспортнаяНакладнаяЕГАИС
	|							И (ИСТИНА = алкАктКТоварноТранспортнойНакладнойЕГАИС.Проведен)
	|					ПО РеализацияТоваровУслугТовары.Ссылка = алкСоответствияВсехТТНЕГАИС.УчетныйДокумент
	|						И (ТИПЗНАЧЕНИЯ(алкСоответствияВсехТТНЕГАИС.ДокументЕГАИС) = ТИП(Документ.алкТоварноТранспортнаяНакладнаяЕГАИС))
	|				ПО ЗаказПокупателяТаблица.Ссылка = РеализацияТоваровУслугТовары.ЗаказПокупателя
	|			ПО РеализацияТоваровУслугТоварыТекущий.ЗаказПокупателя = ЗаказПокупателяТаблица.Ссылка
	|		ПО ((ВЫРАЗИТЬ(алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент КАК Документ.РеализацияТоваровУслуг)) = РеализацияТоваровУслугТоварыТекущий.Ссылка)
Показать


Не могу понять если смысл использовать "ВЫРАЗИТЬ(алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент КАК Документ.РеализацияТоваровУслуг)"?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. palsergeich 24.03.20 17:50 Сейчас в теме
(1) ВЫРАЗИТЬ это инструкция для движка ORM на ограничение типов.
Конкретно в данном примере она кажется излишней.
Но для точного ответа надо смотреть профайлер
triviumfan; NicholasUzunov; +2 Ответить
2. VmvLer 24.03.20 17:25 Сейчас в теме
смысл есть, в книжках пишут на итс-ах всяких.
не курильщики сначала ходят в школу, потом на инфостар.
4. NicholasUzunov 24.03.20 17:27 Сейчас в теме
(2) Не понял часть про "не курильщики сначала ходят в школу, потом на инфостар."
5. VmvLer 24.03.20 17:28 Сейчас в теме
3. uriah 17 24.03.20 17:26 Сейчас в теме
Функция Выразить() позволяет привести значение поля запроса 1С к определенному типу. Это может понадобиться в двух случаях:

1. Получить нужную разрядность числа или нужное количество символов строкового значения. Количество символов полей неограниченного типа приходится ограничить из-за определенных особенностей.

ВЫРАЗИТЬ(Номенклатура.Комментарий КАК СТРОКА(300))
ВЫРАЗИТЬ(Номенклатура.Цена КАК ЧИСЛО(15, 2)) КАК Сумма

2. Преобразовать поле составного типа в поле с одним типом. Это может понадобиться в целях оптимизации запросов. Если в типизированное поле попадёт значение другого типа, то система вернёт NULL, поэтому всегда необходимо дополнительно устанавливать условие в секции «ГДЕ», ограничивая его оператором ССЫЛКА.
Aleksandr_prof; +1 Ответить
6. NicholasUzunov 24.03.20 17:28 Сейчас в теме
(3) Это описание функции ВЫРАЗИТЬ. Я читал и понимаю его. Меня интересует момент использования его в соединении таблиц
7. VmvLer 24.03.20 17:38 Сейчас в теме
(6) посморите запрос в СУБД без выразить и станет ясно

в 1С запросе есть условие и без выразить

ПО РеализацияТоваровУслугТовары.Ссылка = алкСоответствияВсехТТНЕГАИС.УчетныйДокумент

автор запроса наверное сам не понимал - слепил непоследовательную ересь
8. uriah 17 24.03.20 17:38 Сейчас в теме
(6)
ВЫРАЗИТЬ(алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент 

Думаю, что в запросе могут попасть и другие данные, для этого так явно и указывается.
Aleksandr_prof; +1 Ответить
10. Aleksandr_prof 192 24.03.20 18:28 Сейчас в теме
Встроенный 1С оптимизатор не совсем хорошо обрабатывает поля получаемые через точку (алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент).
С помощью оператора «ВЫРАЗИТЬ», для в полей имеющих составной тип данных, возможно ограничить попадание значений которые не соответствуют определённому типу данных. Причём такие ограничения можно сделать ещё на этапе выборки данных. Такие действия приводят к неявной оптимизации запросов.
11. koln 24.03.20 18:36 Сейчас в теме
1. алкСоответствияТекущихТТНЕГАИС - регистр, а "УчетныйДокумент" - реквизит данного регистра (измерение, ресурс, реквизит).
2. Данный реквизит, скорее всего, имеет составной тип, в состав которого входит объект конфигурации "Документ.РеализацияТоваровУслуг"
3. Если не применить конструкцию ВЫРАЗИТЬ, то при соединении таблиц будет сканирование таблиц всех объектов конфигурации, входящих в состав того самого составного типа реквизита. При применении ВЫРАЗИТЬ при выполнении запроса "отсекаются" таблицы всех объектов, входящих в состав реквизита "УчетныйДокумент", кроме "Документ.РеализацияТоваровУслуг".
12. NicholasUzunov 24.03.20 21:01 Сейчас в теме
(11) Зачем производить сканирование, если в алкСоответствияТекущихТТНЕГАИС УчетныйДокумент это ссылка ока и в РеализацияТоваровУслугТоварыТекущий Ссылка это ссылка. Ссылки это условно строки. Сравнивай и соединяй.
13. comptr 31 25.03.20 09:24 Сейчас в теме
(12) Внимательно перечитай (11).
Представь, что у тебя реквизит с типом "ЛюбойДокумент", и в конфигурации 100 документов. При соединении будут просканированы все 100 таблиц документов. Сколько это будет документов? Много. И запрос будет работать медленно. Чтобы этого избежать, если ты точно знаешь, документ какого типа тебе нужен в соединении, и используется ВЫРАЗИТЬ.
Подробно расписано на ИТС: https://its.1c.ru/db/v8std/content/654/hdoc (Разыменование ссылочных полей составного типа в языке запросов).
Там правда не конкретно про соединение, но разыменование приводит к соединению.
15. NicholasUzunov 25.03.20 09:57 Сейчас в теме
(13) Мой вопрос вообще не про разыменование. Я понимаю как это работает. И зачем ВЫРАЗИТЬ использовать в этом случае. Правильно для того чтобы убрать лишние неявные соединения. Но в примере мы просто соединяем таблицы. Какой смысл в ВЫРАЗИТЬ. Я такого не в типовых конфигурациях не видел, не в примерах использования. Если бы в соединении был бы смысл использовать ВЫРАЗИТЬ думаете не было бы не одной статьи про такой прием с явным указанием?
14. VmvLer 25.03.20 09:27 Сейчас в теме
(12) бросайте 1С и разработайте СУБД которая так и будет работать - мир станет прекрасней.
16. NicholasUzunov 25.03.20 10:02 Сейчас в теме
Спасибо за ответы, но такое ощущение что половина отвечающих смотрят только на абзац "Не могу понять если смысл использовать "ВЫРАЗИТЬ(алкСоответствияТекущихТТНЕГАИС.УчетныйДокумент КАК Документ.РеализацияТоваровУслуг)"?" и не смотрят на блок с частью запроса. Хоть бы кто пнул давай весь запрос.
17. comptr 31 25.03.20 11:30 Сейчас в теме
18. triviumfan 93 27.07.23 10:38 Сейчас в теме
В данном случае оно бессмысленно. И запрос необходимо переписать, тут есть ошибки :)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот