Имя: Пароль:
1C
1С v8
Запрос к регистру остатков и регистру сведений для получения цен
0 brenli
 
23.08.20
16:47
Всем добра.
Написал запрос для получения остатков из регистра остатков и цен из регистра сведений.
Запрос к регистру сведений хочется сделать максимально грамотно, а именно получить цены только по переданным значениям.

Можно ли пакет запроса передать в проверку условия вхождения номенклатуры?

Так тоже не получается, так как первый запрос из за пакетного режима возвращает одну строку Количество

    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        |    ВЫРАЗИТЬ(ТоварыНаСкладахОстатки.КоличествоОстаток КАК ЧИСЛО(15,3)) КАК Количество
        |ПОМЕСТИТЬ
        |    ЗапросОстатки
        |ИЗ
        |    РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаВыбор, Склад= &СкладВыбор) КАК ТоварыНаСкладахОстатки";
    
    Запрос.УстановитьПараметр("ДатаВыбор", Новый Граница (НачалоДня(Объект.ДатаО), ВидГраницы.Включая));
    Запрос.УстановитьПараметр("СкладВыбор", Объект.Склад);
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Номенклатура");
        
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос2.Текст =
        "ВЫБРАТЬ
        |    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
        //|    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
        |    ЦеныНоменклатуры.Цена КАК Цена,
        |    ЗапросОстатки.Количество КАК Количество
        |ИЗ
        |    ЗапросОстатки КАК ЗапросОстатки
        |ЛЕВОЕ СОЕДИНЕНИЕ    
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаВыбор, Номенклатура В (&Остатки)) КАК ЦеныНоменклатуры
        |ПО
        |    ЗапросОстатки.Номенклатура = ЦеныНоменклатуры.Номенклатура";
    
    Запрос2.УстановитьПараметр("ДатаВыбор", Новый Граница (НачалоДня(Объект.ДатаО), ВидГраницы.Включая));
    Запрос2.УстановитьПараметр("Остатки", РезультатЗапроса);
    РезультатЗапроса2 = Запрос2.Выполнить().Выгрузить();

Полюбому делать 3 запроса? Первый для получения остатков и помещения в виртуальную таблицу, второй для получения списка номенклатуры, третий для получения цен и объединения,
или 2 запроса... в которых 1й и 3й совмещен и отдельно получается список номенклатуры?
1 brenli
 
23.08.20
17:05
Все решил 2 запросами

    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        |    ВЫРАЗИТЬ(ТоварыНаСкладахОстатки.КоличествоОстаток КАК ЧИСЛО(15,3)) КАК Количество
        |ПОМЕСТИТЬ
        |    ЗапросОстатки
        |ИЗ
        |    РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаВыбор, Склад= &СкладВыбор) КАК ТоварыНаСкладахОстатки";
    
    Запрос.УстановитьПараметр("ДатаВыбор", Новый Граница (НачалоДня(Объект.ДатаО), ВидГраницы.Включая));
    Запрос.УстановитьПараметр("СкладВыбор", Объект.Склад);
    
    РезультатЗапроса = Запрос.Выполнить();
        
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос2.Текст =
        "ВЫБРАТЬ
        |    ЗапросОстатки.Номенклатура КАК Номенклатура,
    //    |    ЦеныНоменклатуры.ВидЦены КАК ВидЦены,
        |    ЦеныНоменклатуры.Цена КАК Цена,
        |    ЗапросОстатки.Количество КАК Количество
        |ИЗ
        |    ЗапросОстатки КАК ЗапросОстатки
        |ЛЕВОЕ СОЕДИНЕНИЕ    
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаВыбор, Номенклатура В (
        |             ВЫБРАТЬ
        |                ЗапросОстатки.Номенклатура КАК Номенклатура
        |            ИЗ
        |                ЗапросОстатки) И  ВидЦены = &ВидЦены) КАК ЦеныНоменклатуры
        |
        |ПО
        |    ЗапросОстатки.Номенклатура = ЦеныНоменклатуры.Номенклатура";
    
    Запрос2.УстановитьПараметр("ДатаВыбор", Новый Граница (НачалоДня(Объект.ДатаО), ВидГраницы.Включая));
    Запрос2.УстановитьПараметр("ВидЦены", Объект.ВидЦены);
    РезультатЗапроса2 = Запрос2.Выполнить().Выгрузить();
2 Мимохожий Однако
 
23.08.20
19:49
для подобных случаев придумали пакетные запросы
3 Kassern
 
24.08.20
11:42
А что мешало сделать так?
ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ВНаличииОстаток
ПОМЕСТИТЬ Остатки
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
;

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