1. NicholasUzunov 24.03.20 17:17 Сейчас в теме

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

Увидел соединение:

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


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

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

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

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

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

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

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

Думаю, что в запросе могут попасть и другие данные, для этого так явно и указывается.
Aleksandr55555; +1 Ответить
10. Aleksandr55555 71 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. borodatii 2 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. borodatii 2 25.03.20 11:30 Сейчас в теме
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Product Owner (Менеджер по продукту 1С)
Москва
зарплата от 100 000 руб. до 170 000 руб.
Полный день

Тим лид по разработке 1С (Team Lead 1С)
Москва
зарплата от 100 000 руб. до 200 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Программист 1С
Новосибирск
зарплата от 30 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 100 000 руб. до 150 000 руб.
Полный день