Имя: Пароль:
1C
 
Вопрос по запросу
0 pablo_escobar
 
03.10.23
13:32
Добрый день. Копаясь в типовой Рознице 3 заметил стиль написания запросов.
"ВЫБРАТЬ
    |    ТаблицаДокумента.НомерСтроки КАК НомерСтроки,
    |    ТаблицаДокумента.Номенклатура КАК Номенклатура,
    |    ТаблицаДокумента.Характеристика КАК Характеристика,
    |    ТаблицаДокумента.Партия КАК Партия,
    |    ТаблицаДокумента.Количество КАК Количество,
    |    ТаблицаДокумента.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    |    ТаблицаДокумента.Цена КАК Цена,
    |    ТаблицаДокумента.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки,
    |    ТаблицаДокумента.Сумма КАК Сумма,
    |    ТаблицаДокумента.СтавкаНДС КАК СтавкаНДС,
    |    ТаблицаДокумента.СуммаНДС КАК СуммаНДС,
    |    ТаблицаДокумента.Всего КАК Всего,
    |    ТаблицаДокумента.ПроцентАвтоматическойСкидки КАК ПроцентАвтоматическойСкидки,
    |    ТаблицаДокумента.СуммаАвтоматическойСкидки КАК СуммаАвтоматическойСкидки,
    |    ТаблицаДокумента.КлючСвязи КАК КлючСвязи,
    |    ТаблицаДокумента.НеобходимостьВводаАкцизнойМарки КАК НеобходимостьВводаАкцизнойМарки,
    |    ТаблицаДокумента.Штрихкод КАК Штрихкод,
    |    ТаблицаДокумента.КодМаркировки КАК КодМаркировки,
    |    ТаблицаДокумента.ДоговорПлатежногоАгента КАК ДоговорПлатежногоАгента
    |ПОМЕСТИТЬ ТаблицаДокумента
    |ИЗ
    |    &ТаблицаТовары КАК ТаблицаДокумента
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ТаблицаТовары.НомерСтроки КАК НомерСтроки,
    |    ТаблицаТовары.Номенклатура КАК Номенклатура,
    |    ТаблицаТовары.Характеристика КАК Характеристика,
    |    ТаблицаТовары.Партия КАК Партия,
    |    ТаблицаТовары.Количество КАК Количество,
    |    ТаблицаТовары.Цена КАК Цена,
    |    ТаблицаТовары.Сумма КАК Сумма,
    |    ТаблицаТовары.СтавкаНДС КАК СтавкаНДС,
    |    ТаблицаТовары.СуммаНДС КАК СуммаНДС,
    |    ТаблицаТовары.Всего КАК Всего,
    |    ТаблицаТовары.ПроцентАвтоматическойСкидки КАК ПроцентАвтоматическойСкидки,
    |    ТаблицаТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    |    ТаблицаТовары.КлючСвязи КАК КлючСвязи,
    |    ТаблицаТовары.СуммаАвтоматическойСкидки КАК СуммаАвтоматическойСкидки,
    |    СправочникНоменклатура.АлкогольнаяПродукция КАК АлкогольнаяПродукция,
    |    СправочникНоменклатура.КодТРУ КАК КодТРУ,
    |    СправочникНоменклатура.ВидПродукцииИС КАК ВидПродукцииИС,
    |    НЕ СправочникНоменклатура.ВидПродукцииИС = ЗНАЧЕНИЕ(Перечисление.ВидыПродукцииИС.ПустаяСсылка) КАК ПродукцияИС,
    |    ТаблицаТовары.НеобходимостьВводаАкцизнойМарки КАК НеобходимостьВводаАкцизнойМарки,
    |    ТаблицаТовары.Штрихкод КАК Штрихкод,
    |    ТаблицаТовары.КодМаркировки КАК КодМаркировки,
    |    ТаблицаТовары.ДоговорПлатежногоАгента КАК ДоговорПлатежногоАгента
    |ПОМЕСТИТЬ ТаблицаТовары
    |ИЗ
    |    ТаблицаДокумента КАК ТаблицаТовары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
    |        ПО ТаблицаТовары.Номенклатура = СправочникНоменклатура.Ссылка


Воспроизвел подобное в профайлере MS SQL  

Если через точку:
exec sp_executesql N'SELECT
T1._Fld2897RRef,
T1._Fld2900,
T2._Code,
T2._Fld67717,
T2._Fld67727RRef
FROM dbo._Document873_VT2895 T1
LEFT OUTER JOIN dbo._Reference383 T2
ON (T1._Fld2897RRef = T2._IDRRef) AND (T2._Fld2744 = P1)
WHERE ((T1._Fld2744 = @P2)) AND ((T1._Document873_IDRRef = @P3))',N'P1 numeric(10),@P2 numeric(10),@P3 varbinary(16)',0,0,0x9454AC1F6B1C087A11EE5872D3E2EDC5

Если через внутреннее соединение:
exec sp_executesql N'SELECT
T1._Fld2897RRef,
T1._Fld2900,
T2._Code,
T2._Fld67717,
T2._Fld67727RRef
FROM dbo._Document873_VT2895 T1
INNER JOIN dbo._Reference383 T2
ON (T1._Fld2897RRef = T2._IDRRef)
WHERE (((T1._Fld2744 = P1)) AND (T2._Fld2744 = @P2)) AND ((T1._Document873_IDRRef = @P3))',N'P1 numeric(10),@P2 numeric(10),@P3 varbinary(16)',0,0,0x9454AC1F6B1C087A11EE5872D3E2EDC5

Для чего внутреннее соединение со справочником номенклатуры, почему не через точку выбор реквизитов номенклатуры?
1 Прапорщик
 
03.10.23
14:40
(0) Смотря что в исходной таблице &ТаблицаТовары.
А точнее в поле Номенклатура.
Если поле Номенклатура в этой таблице может быть пустым или иметь какой-то тип значения отличный от СправочникСсылка.Номенклатура, то результаты левого и внутреннего соединения будут совершенно разными.
Левое - оставит такие строки в результате. А внутреннее - выкинет, оставив только те, где Номенклатура заполнено и имеет тип ссылка на справочник Номенклатура.
2 pablo_escobar
 
03.10.23
15:25
(1) эту мысль проверил сразу.
В таблице &ТаблицаТовары ТаблицаТовары = ДокументОбъект.Запасы.Выгрузить();
ДокументОбъект это ЧекККМ, поле Номенклатура ТЧ Запасы имеет Тип СправочникСсылка.Номенклатура и проверка заполнения выдавать ошибку
Это обработка пробития чека. То есть Номенклатура должна там быть всегда.
Запрос находится в функции ПодготовкаДанныхДляПробитияЧекаККМ, и у нее в описании параметров что "Ссылка - ДокументСсылка.ЧекКККМ" на основании ссылки получают ДокументОбъект = Ссылка.ПолучитьОбъект(); Далее &ТаблицаТовары

Это не единственный такой запрос, встретил таких несколько только пока смотрел пробитие чека, применяют к разным реквизитам.
Подумал, может в каком нибудь Posgres так быстрее выполнится.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой