Автор Тема: Задача 1.03  (Прочитано 851 раз)

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

Дебет

  • Пользователь
  • **
  • Сообщений: 12
Задача 1.03
« : Апрель 30, 2019, 08:04:18 am »
Всем привет!
Задача простая, но возник вопрос по запросу
как правильнее будет его написать так ?

ВЫБРАТЬ
   РасходнаяНакладнаяСписокНоменклатуры.Ссылка КАК Ссылка,
   РасходнаяНакладнаяСписокНоменклатуры.НомерСтроки КАК НомерСтроки,
   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
   РасходнаяНакладнаяСписокНоменклатуры.Количество КАК Количество,
   РасходнаяНакладнаяСписокНоменклатуры.Цена КАК Цена,
   РасходнаяНакладнаяСписокНоменклатуры.Сумма КАК Сумма,
   РасходнаяНакладнаяСписокНоменклатуры.ПриходнаяНакладная КАК ПриходнаяНакладная,
   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток,0) КАК КоличествоОстаток,
   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток,0) КАК СтоимостьОстаток
ИЗ
   Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
      ПО (РасходнаяНакладнаяСписокНоменклатуры.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
            И РасходнаяНакладнаяСписокНоменклатуры.ПриходнаяНакладная = ОстаткиНоменклатурыОстатки.партия)
ГДЕ
   РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка


или так

РАТЬ
   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма,
   РасходнаяНакладнаяСписокНоменклатуры.Партия КАК Партия,
   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга КАК Услуга
ПОМЕСТИТЬ Список
ИЗ
   Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
ГДЕ
   РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка

СГРУППИРОВАТЬ ПО
   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
   РасходнаяНакладнаяСписокНоменклатуры.Партия,
   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга

ИНДЕКСИРОВАТЬ ПО
   Номенклатура,
   Партия,
   Услуга
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Список.Номенклатура,
   Список.Партия,
   Список.Количество,
   Список.Сумма,
   Список.Услуга,
   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоРег,
   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаРег,
   ПРЕДСТАВЛЕНИЕ(Список.Номенклатура),
   ПРЕДСТАВЛЕНИЕ(Список.Партия)
ИЗ
   Список КАК Список
      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
            &Момент,
            Номенклатура В
               (ВЫБРАТЬ
                  Список.Номенклатура
               ИЗ
                  Список КАК Список
               ГДЕ
                  НЕ Список.Услуга)) КАК ОстаткиНоменклатурыОстатки
      ПО Список.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
         И Список.Партия = ОстаткиНоменклатурыОстатки.Партия
« Последнее редактирование: Апрель 30, 2019, 08:08:29 am от Дебет »

Дебет

  • Пользователь
  • **
  • Сообщений: 12
Re: Задача 1.03
« Ответ #1 : Апрель 30, 2019, 08:07:17 am »
как понимаете в первом случае обычное левое соединение
во втором случае тоже левое,но мы получаем ВТ. Плюс в том что если большой РН, то мы его ограничиваем в параметрах, но минус в том что мы создаем ВТ


Gorod_54

  • Пользователь
  • **
  • Сообщений: 13
Re: Задача 1.03
« Ответ #2 : Апрель 30, 2019, 09:59:41 am »
Правильней конечно второй вариант.
В первом варианте у вас все записи всех расходных накладных, соединяются с таблицей регистра, а потом только срабатывает конструкция "где" и из полученной таблицы отбираются данные только по вашему документу.

Во втором же варианте вы и первую таблицу ограничиваете сразу по ссылке, и вовиртуальную таблицу регистра передаете отбор по номенклатуре. Этот способ будет оптимальным. Для экзамена так и делать.

Я только не очень понял зачем во втором варианте у вас отбор по услуге во второй табблице. Если услуги не нужны, делайте отбор сразу в первой таблице. А так вы лишние записи тянете и индексируете еще это поле.

Дебет

  • Пользователь
  • **
  • Сообщений: 12
Re: Задача 1.03
« Ответ #3 : Апрель 30, 2019, 10:24:50 am »
Правильней конечно второй вариант.
В первом варианте у вас все записи всех расходных накладных, соединяются с таблицей регистра, а потом только срабатывает конструкция "где" и из полученной таблицы отбираются данные только по вашему документу.

Во втором же варианте вы и первую таблицу ограничиваете сразу по ссылке
в первом случае мы тоже  ограничиваете сразу по ссылке, только мы не помещаем ее в ВТ, не совсем понял почему вы пишите что  в первом случае все записи всех расходных накладных. Может быть вы имели ввиду что все записи РН?
« Последнее редактирование: Апрель 30, 2019, 10:26:21 am от Дебет »

Gorod_54

  • Пользователь
  • **
  • Сообщений: 13
Re: Задача 1.03
« Ответ #4 : Май 01, 2019, 07:49:09 am »
Правильней конечно второй вариант.
В первом варианте у вас все записи всех расходных накладных, соединяются с таблицей регистра, а потом только срабатывает конструкция "где" и из полученной таблицы отбираются данные только по вашему документу.

Во втором же варианте вы и первую таблицу ограничиваете сразу по ссылке
в первом случае мы тоже  ограничиваете сразу по ссылке, только мы не помещаем ее в ВТ, не совсем понял почему вы пишите что  в первом случае все записи всех расходных накладных. Может быть вы имели ввиду что все записи РН?

Нет, я правильно выразился. Потому что конструкция "ГДЕ" будет выполнена только после соедиения. Сначала все записи накладных соединятся со всеми записями регистра, получится огромная таблица, а только потом сработает условие, где и останутся только записи по вашей накладной.

Именно по этой причине при обращении к виртуальным таблицам, нужно обязательно делать отбор через параметры виртуальной таблицы, т.к. тогда ограничение сработает сразу при построении виртуальной таблицы и лишних записей не будет.