Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
27 ноя 2024, 07:29

УТ 10.3 - СКД - Левое соединение

Автор AIFrame, 16 мар 2016, 13:33

0 Пользователей и 1 гость просматривают эту тему.

AIFrame

Запрос:
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
Спр.Ссылка КАК Номенклатура,
Спр.ОтветственныйМенеджерЗаПокупки КАК ОтветственныйЗаПокупки,
Спр.Производитель КАК Производитель,
Спр.НомерГТД КАК ГТД,
Спр.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору КАК ЕХО,
Спр.ЕдиницаХраненияОстатков.Коэффициент КАК ЕХО_К,
Спр.ЕдиницаХраненияОстатков.Объем КАК ЕХО_О,
Спр.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору КАК ЕДО,
Спр.ЕдиницаДляОтчетов.Коэффициент КАК ЕДО_К,
Спр.ЕдиницаДляОтчетов.Объем КАК ЕДО_О,
ЗСО.Значение КАК Сертификат
{ВЫБРАТЬ
Номенклатура.*,
ОтветственныйЗаПокупки.*,
Производитель.*,
ГТД.*,
ЕХО.*,
ЕХО_К,
ЕХО_О,
ЕДО.*,
ЕДО_К,
ЕДО_О,
Сертификат.*}
ИЗ
Справочник.Номенклатура КАК Спр
{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗСО
ПО Спр.Ссылка = ЗСО.Объект.Ссылка}
ГДЕ
ЗСО.Свойство = &ЭтоСертификат
И Спр.ВидНоменклатуры В(&ВидНоменклатуры)
И ЗСО.Объект.ВидНоменклатуры В(&ВидНоменклатуры)
{ГДЕ
Спр.Ссылка.* КАК Номенклатура,
Спр.ОтветственныйМенеджерЗаПокупки.* КАК ОтветственныйЗаПокупки,
Спр.Производитель.*,
Спр.НомерГТД.* КАК ГТД,
Спр.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору.* КАК ЕХО,
Спр.ЕдиницаХраненияОстатков.Коэффициент КАК ЕХО_К,
Спр.ЕдиницаХраненияОстатков.Объем КАК ЕХО_О,
Спр.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору.* КАК ЕДО,
Спр.ЕдиницаДляОтчетов.Коэффициент КАК ЕДО_К,
Спр.ЕдиницаДляОтчетов.Объем КАК ЕДО_О,
ЗСО.Значение.* КАК Сертификат}

Подразумевается, что, согласно отбору, вывалится вся номенклатура из справочника и левым соединением допишется полем "Сертификат". На деле же я получаю только те позиции справочника, которым есть соответствие в таблице ЗСО (Значение Свойств Объекта).
В обычном запросе оно работает как надо, а вот в СКД так. В чем может быть причина?
Выводить Сертификат через ВЫБОР КОГДА?

vitasw

Что в запросе, что в СКД по этому вопросу работает одинаково. Секция "Где" всегда накладывает огрничение на уже сформированную таблицу с данными. У вас выбираются все данные в таблицу, потом на эту общую таблицу накладывается отбор из секции "Где", что естественно приводит к тому что в итоге остаются только записи, удовлетворяющие условиям.
Вам нужно внутренним запросом выбрать ваши сертификаты, там же во внутреннем запросе отсечь ненужные и только после этого цеплять левым соединением к основному запросу.

AIFrame

Цитата: vitasw от 16 мар 2016, 15:01
Вам нужно внутренним запросом выбрать ваши сертификаты, там же во внутреннем запросе отсечь ненужные и только после этого цеплять левым соединением к основному запросу.
Только вы это написали, как я осознал свой косяк.
Спасибо.
ВЫБРАТЬ РАЗЛИЧНЫЕ
Спр.Ссылка КАК Номенклатура,
Спр.ОтветственныйМенеджерЗаПокупки КАК ОтветственныйЗаПокупки,
Спр.Производитель КАК Производитель,
Спр.НомерГТД КАК ГТД,
Спр.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору КАК ЕХО,
Спр.ЕдиницаХраненияОстатков.Коэффициент КАК ЕХО_К,
Спр.ЕдиницаХраненияОстатков.Объем КАК ЕХО_О,
Спр.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору КАК ЕДО,
Спр.ЕдиницаДляОтчетов.Коэффициент КАК ЕДО_К,
Спр.ЕдиницаДляОтчетов.Объем КАК ЕДО_О,
ЗСО.Сертификат
{ВЫБРАТЬ
Номенклатура.*,
ОтветственныйЗаПокупки.*,
Производитель.*,
ГТД.*,
ЕХО.*,
ЕХО_К,
ЕХО_О,
ЕДО.*,
ЕДО_К,
ЕДО_О}
ИЗ
Справочник.Номенклатура КАК Спр
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЗначенияСвойствОбъектов.Объект.Ссылка КАК Связь,
ЗначенияСвойствОбъектов.Значение КАК Сертификат
ИЗ
РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
ЗначенияСвойствОбъектов.Свойство = &ЭтоСертификат
И ЗначенияСвойствОбъектов.Объект.ВидНоменклатуры = &ВидНоменклатуры) КАК ЗСО
ПО Спр.Ссылка = ЗСО.Связь
ГДЕ
Спр.ВидНоменклатуры В(&ВидНоменклатуры)
{ГДЕ
Спр.Ссылка.* КАК Номенклатура,
Спр.ОтветственныйМенеджерЗаПокупки.* КАК ОтветственныйЗаПокупки,
Спр.Производитель.*,
Спр.НомерГТД.* КАК ГТД,
Спр.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору.* КАК ЕХО,
Спр.ЕдиницаХраненияОстатков.Коэффициент КАК ЕХО_К,
Спр.ЕдиницаХраненияОстатков.Объем КАК ЕХО_О,
Спр.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору.* КАК ЕДО,
Спр.ЕдиницаДляОтчетов.Коэффициент КАК ЕДО_К,
Спр.ЕдиницаДляОтчетов.Объем КАК ЕДО_О}

LexaK

м-м-м-да,
рассмотрим ваш первый запрос
1.настойчиво не рекомендуется к реквизиту обращаться через ссылку
ваш код

   Справочник.Номенклатура КАК Спр
        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗСО
        ПО Спр.Ссылка = ЗСО.Объект.Ссылка}


будет правильнее

   Справочник.Номенклатура КАК Спр
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗСО
   ПО Спр.Ссылка = ЗСО.Объект


2. Если вы какие-то объекты сопраягли по ссылке, т.е. Ссылка1 = Ссылка2
то это значит что и все остальные данные в этих объектах так-же равны, и не надо два раза проверять одно и тоже значение
ваш код

   ЗСО.Свойство = &ЭтоСертификат
    И Спр.ВидНоменклатуры В(&ВидНоменклатуры)
    //И ЗСО.Объект.ВидНоменклатуры В(&ВидНоменклатуры) <- такая проверка абсолютно лишняя!!!


3.когда делаете реально левое соединение и хотите получить все записи из левой таблицы
то все условия на правую таблицу надо писать в разделе ПО

ваш запрос выглядел бы так, попробуйте его

ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
    Спр.Ссылка КАК Номенклатура,
    Спр.ОтветственныйМенеджерЗаПокупки КАК ОтветственныйЗаПокупки,
    Спр.Производитель КАК Производитель,
    Спр.НомерГТД КАК ГТД,
    Спр.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору КАК ЕХО,
    Спр.ЕдиницаХраненияОстатков.Коэффициент КАК ЕХО_К,
    Спр.ЕдиницаХраненияОстатков.Объем КАК ЕХО_О,
    Спр.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору КАК ЕДО,
    Спр.ЕдиницаДляОтчетов.Коэффициент КАК ЕДО_К,
    Спр.ЕдиницаДляОтчетов.Объем КАК ЕДО_О,
    ЗСО.Значение КАК Сертификат
{ВЫБРАТЬ
    Номенклатура.*,
    ОтветственныйЗаПокупки.*,
    Производитель.*,
    ГТД.*,
    ЕХО.*,
    ЕХО_К,
    ЕХО_О,
    ЕДО.*,
    ЕДО_К,
    ЕДО_О,
    Сертификат.*}
ИЗ
    Справочник.Номенклатура КАК Спр
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗСО
    ПО Спр.Ссылка = ЗСО.Объект
    и ЗСО.Свойство = &ЭтоСертификат
ГДЕ
    И Спр.ВидНоменклатуры В(&ВидНоменклатуры)
    //И ЗСО.Объект.ВидНоменклатуры В(&ВидНоменклатуры)
{ГДЕ
    Спр.Ссылка.* КАК Номенклатура,
    Спр.ОтветственныйМенеджерЗаПокупки.* КАК ОтветственныйЗаПокупки,
    Спр.Производитель.*,
    Спр.НомерГТД.* КАК ГТД,
    Спр.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору.* КАК ЕХО,
    Спр.ЕдиницаХраненияОстатков.Коэффициент КАК ЕХО_К,
    Спр.ЕдиницаХраненияОстатков.Объем КАК ЕХО_О,
    Спр.ЕдиницаДляОтчетов.ЕдиницаПоКлассификатору.* КАК ЕДО,
    Спр.ЕдиницаДляОтчетов.Коэффициент КАК ЕДО_К,
    Спр.ЕдиницаДляОтчетов.Объем КАК ЕДО_О,
    ЗСО.Значение.* КАК Сертификат}


п.с. Вложенные/вложенные и т.д. запросы писать считается не читабельно, не оптимально 
Быбрать ...
   из ( Быбрать ...
      из ( Быбрать ...
          ...
         из ( ) ) )
если помогло нажмите: Спасибо!

vitasw

Цитата: LexaK от 16 мар 2016, 15:46, не оптимально 
Категорически не согласен. Читабельно/нечитабельно дело фэншуя. А по оптимальности - все зависит от конкретной задачи. Грести все под одну гребенку, типа внутрение запросы = зло, - явно не стоит.

AIFrame

Любопытно, т.е. объявление условия в связях с таблицей = вложенная таблица с условием.
Ладно.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск