Форум Чистова. Подготовка к экзаменам 1С
Аттестация "1С:Специалист" => Аттестация "1С:Специалист по платформе 1С:Предприятие 8.3 и 8.2" => Тема начата: Дебет от Апрель 30, 2019, 08:04:18 am
-
Всем привет!
Задача простая, но возник вопрос по запросу
как правильнее будет его написать так ?
ВЫБРАТЬ
РасходнаяНакладнаяСписокНоменклатуры.Ссылка КАК Ссылка,
РасходнаяНакладнаяСписокНоменклатуры.НомерСтроки КАК НомерСтроки,
РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
РасходнаяНакладнаяСписокНоменклатуры.Количество КАК Количество,
РасходнаяНакладнаяСписокНоменклатуры.Цена КАК Цена,
РасходнаяНакладнаяСписокНоменклатуры.Сумма КАК Сумма,
РасходнаяНакладнаяСписокНоменклатуры.ПриходнаяНакладная КАК ПриходнаяНакладная,
ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток,0) КАК КоличествоОстаток,
ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток,0) КАК СтоимостьОстаток
ИЗ
Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
ПО (РасходнаяНакладнаяСписокНоменклатуры.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
И РасходнаяНакладнаяСписокНоменклатуры.ПриходнаяНакладная = ОстаткиНоменклатурыОстатки.партия)
ГДЕ
РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
или так
РАТЬ
РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма,
РасходнаяНакладнаяСписокНоменклатуры.Партия КАК Партия,
РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга КАК Услуга
ПОМЕСТИТЬ Список
ИЗ
Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
ГДЕ
РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
РасходнаяНакладнаяСписокНоменклатуры.Партия,
РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Партия,
Услуга
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Список.Номенклатура,
Список.Партия,
Список.Количество,
Список.Сумма,
Список.Услуга,
ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоРег,
ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаРег,
ПРЕДСТАВЛЕНИЕ(Список.Номенклатура),
ПРЕДСТАВЛЕНИЕ(Список.Партия)
ИЗ
Список КАК Список
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
&Момент,
Номенклатура В
(ВЫБРАТЬ
Список.Номенклатура
ИЗ
Список КАК Список
ГДЕ
НЕ Список.Услуга)) КАК ОстаткиНоменклатурыОстатки
ПО Список.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
И Список.Партия = ОстаткиНоменклатурыОстатки.Партия
-
как понимаете в первом случае обычное левое соединение
во втором случае тоже левое,но мы получаем ВТ. Плюс в том что если большой РН, то мы его ограничиваем в параметрах, но минус в том что мы создаем ВТ
-
Правильней конечно второй вариант.
В первом варианте у вас все записи всех расходных накладных, соединяются с таблицей регистра, а потом только срабатывает конструкция "где" и из полученной таблицы отбираются данные только по вашему документу.
Во втором же варианте вы и первую таблицу ограничиваете сразу по ссылке, и вовиртуальную таблицу регистра передаете отбор по номенклатуре. Этот способ будет оптимальным. Для экзамена так и делать.
Я только не очень понял зачем во втором варианте у вас отбор по услуге во второй табблице. Если услуги не нужны, делайте отбор сразу в первой таблице. А так вы лишние записи тянете и индексируете еще это поле.
-
Правильней конечно второй вариант.
В первом варианте у вас все записи всех расходных накладных, соединяются с таблицей регистра, а потом только срабатывает конструкция "где" и из полученной таблицы отбираются данные только по вашему документу.
Во втором же варианте вы и первую таблицу ограничиваете сразу по ссылке
в первом случае мы тоже ограничиваете сразу по ссылке, только мы не помещаем ее в ВТ, не совсем понял почему вы пишите что в первом случае все записи всех расходных накладных. Может быть вы имели ввиду что все записи РН?
-
Правильней конечно второй вариант.
В первом варианте у вас все записи всех расходных накладных, соединяются с таблицей регистра, а потом только срабатывает конструкция "где" и из полученной таблицы отбираются данные только по вашему документу.
Во втором же варианте вы и первую таблицу ограничиваете сразу по ссылке
в первом случае мы тоже ограничиваете сразу по ссылке, только мы не помещаем ее в ВТ, не совсем понял почему вы пишите что в первом случае все записи всех расходных накладных. Может быть вы имели ввиду что все записи РН?
Нет, я правильно выразился. Потому что конструкция "ГДЕ" будет выполнена только после соедиения. Сначала все записи накладных соединятся со всеми записями регистра, получится огромная таблица, а только потом сработает условие, где и останутся только записи по вашей накладной.
Именно по этой причине при обращении к виртуальным таблицам, нужно обязательно делать отбор через параметры виртуальной таблицы, т.к. тогда ограничение сработает сразу при построении виртуальной таблицы и лишних записей не будет.