Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по составлению запроса?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
davydovda
Подскажите пожалуйста начинающему "программисту" корректно сделал запрос или нет. Суть запроса в в следующем: есть номенклатура(авто запчасть) у неё есть регистр сведений рем. комплект. Вытягиваю все остатки, резервы и цены по всем ремкомплектам которые указаны для запчасти. Вот текст запроса:

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

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

СГРУППИРОВАТЬ ПО
    РемКомп.РемонтныйКомплект,
    ВложенныйЗапрос.Склад,
    РемКомп.Цена
Bernet
Первое что бросается в глаза - нет проверки на NULL. Когда используете ЛЕВОЕ СОЕДИНЕНИЕ - соединне может вернуть NULL, и если потом будете обходить результат запроса и выполнять какие-то арифметические действия, то может получится коллапс. Поэтому всегда когда используете ЛЕВОЕ СОЕДИНЕНИЕ используйте конструкцию:
ЕСТЬNULL([Поле], [ЗначениеПоляЕслиРавноНулл])

Например:
|ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0)
|
|ЕСТЬNULL(ВложенныйЗапрос.ВРезерве, 0)



 i 

Правила, п.12
 
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.