Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нужна помощь по вложенным запросам 8.2
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
Powerman
Нужна Ваша помощь…
Задача такая…
Есть код.
СумОжидВозвр = 0;
    
    ЗапПеремТов = Новый Запрос;
    ЗапПеремТов.Текст =
    "ВЫБРАТЬ
    |    ПеремещениеТоваров.Ссылка
    |ИЗ
    |    Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
    |ГДЕ
    |    ПеремещениеТоваров.ПометкаУдаления = ЛОЖЬ
    |    И ПеремещениеТоваров.Проведен = ИСТИНА
    |    И ПеремещениеТоваров.СкладПолучатель.Код = ""00546""
    |    И ПеремещениеТоваров.ПолучательВозврата = &Контрагент
    |    И ПеремещениеТоваров.Дата МЕЖДУ &ДатаНач И &ДатаКон";
    
    ЗапПеремТов.УстановитьПараметр("Контрагент", обрКонтр.Контрагент);
    ЗапПеремТов.УстановитьПараметр("ДатаНач", НачПериода);
    ЗапПеремТов.УстановитьПараметр("ДатаКон", КонПериода);
    
    ПеремТов = ЗапПеремТов.Выполнить().Выгрузить();
    
    Для каждого ДокПерем из ПеремТов Цикл
        Для каждого Таб из ДокПерем.Ссылка.Товары Цикл
            
            Номенкл = Таб.Номенклатура;
            Кол = Таб.Количество;
            
            Отбор = Новый Структура;
            Отбор.Вставить("Номенклатура", Номенкл);
            Отбор.Вставить("ТипЦен", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("00001"));
            
            Сибест = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДата(), Отбор).Цена;
            
            СумОжидВозвр = СумОжидВозвр + (Сибест * Кол);
            
        КонецЦикла;
    КонецЦикла;


Что необходимо… Эту часть
Для каждого ДокПерем из ПеремТов Цикл
        Для каждого Таб из ДокПерем.Ссылка.Товары Цикл
            
            Номенкл = Таб.Номенклатура;
            Кол = Таб.Количество;
            
            Отбор = Новый Структура;
            Отбор.Вставить("Номенклатура", Номенкл);
            Отбор.Вставить("ТипЦен", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("00001"));
            
            Себест = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДата(), Отбор).Цена;
            
            СумОжидВозвр = СумОжидВозвр + (Сибест * Кол);
            
        КонецЦикла;
    КонецЦикла;


заменить вложенным (вложенными) запросами.

Подскажите как лучше сделать…
Спасибо.
sava1
Вложенного не надо - простое левое соединение со срезом последних
Powerman
Цитата(sava1 @ 28.05.14, 12:28) необходимо зарегистрироваться для просмотра ссылки
Вложенного не надо - простое левое соединение со срезом последних

Как именно...? Я в соединениях пока не силён... Можно мой пример правильно исправить, а я проанализирую правильное решение...
Если не сложно...
Заранее спасибо.
sava1
ВЫБРАТЬ
ПеремещениеТоваровТовары.Номенклатура,
ПеремещениеТоваровТовары.Ссылка,
ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &аа) КАК ЦеныНоменклатурыСрезПоследних
      ПО ПеремещениеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура"


пропущено - УСЛОВИЯ на документ, выычисление СС, СумОжидВозвр - итог по тз (или сгруппировать выборку до одной строки - не знаю что нужно....)

типо так
"ВЫБРАТЬ
                                |    ПеремещениеТоваровТовары.Номенклатура,
                                |    ПеремещениеТоваровТовары.Ссылка,
                                |    ЦеныНоменклатурыСрезПоследних.Цена СС,
                                |    ПеремещениеТоваровТовары.Количество Кво,
                                |    isNULL(ЦеныНоменклатурыСрезПоследних.Цена,0)*isNULL(ПеремещениеТоваровТовары.Количество,0) as Сумма
                                |ИЗ
                                |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
                                |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &аа) КАК ЦеныНоменклатурыСрезПоследних
                                |        ПО ПеремещениеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                                |ГДЕ
                                |    ПеремещениеТоваровТовары.Ссылка.Проведен
                                |    И НЕ ПеремещениеТоваровТовары.Ссылка.ПометкаУдаления
                                |    И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель = &СкладПолучатель
                                |    И ПеремещениеТоваровТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2"
Powerman
Цитата(sava1 @ 28.05.14, 12:38) необходимо зарегистрироваться для просмотра ссылки
ВЫБРАТЬ
ПеремещениеТоваровТовары.Номенклатура,
ПеремещениеТоваровТовары.Ссылка,
ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &аа) КАК ЦеныНоменклатурыСрезПоследних
      ПО ПеремещениеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура"


пропущено - УСЛОВИЯ на документ, выычисление СС, СумОжидВозвр - итог по тз (или сгруппировать выборку до одной строки - не знаю что нужно....)



Я что то туплю конкретно... Простите... (

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


Пишет - Поле не найдено "ПеремещениеТоваровТовары.Проведен" и т.д.
sava1
См второй запрос из поста

Цитата(Powerman @ 28.05.14, 12:53) необходимо зарегистрироваться для просмотра ссылки
ПеремещениеТоваровТовары.Проведен = ИСТИНА

ПеремещениеТоваровТовары.Ссылка.Проведен

Конфигурация какая? Откуда появился ПолучательВозврата ?
Petre
Цитата(sava1 @ 28.05.14, 13:15) необходимо зарегистрироваться для просмотра ссылки
ПеремещениеТоваровТовары.Ссылка.Проведен

А также:
    И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель.Код = "00546"
    И ПеремещениеТоваровТовары.Ссылка.ПолучательВозврата = &Контрагент
    И ПеремещениеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
Powerman
Цитата(sava1 @ 28.05.14, 12:56) необходимо зарегистрироваться для просмотра ссылки
См второй запрос из поста


ПеремещениеТоваровТовары.Ссылка.Проведен


В этой задаче необходимо рассчитать сумму входной цены по всем строкам документа.
sava1
Тады так
ВЫБРАТЬ
                                |    СУММА(ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) * ЕСТЬNULL(ПеремещениеТоваровТовары.Количество, 0)) КАК Сумма,
                                |    ЦеныНоменклатурыСрезПоследних.ТипЦен
                                |ИЗ
                                |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
                                |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &аа) КАК ЦеныНоменклатурыСрезПоследних
                                |        ПО ПеремещениеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                                |ГДЕ
                                |    ПеремещениеТоваровТовары.Ссылка.Проведен
                                |    И НЕ ПеремещениеТоваровТовары.Ссылка.ПометкаУдаления
                                |    И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель = &СкладПолучатель
                                |    И ПеремещениеТоваровТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
                                |
                                |СГРУППИРОВАТЬ ПО
                                |    ЦеныНоменклатурыСрезПоследних.ТипЦен


в результате в выборке будет одна строка с колонкой сумма
Powerman
Цитата(sava1 @ 28.05.14, 14:05) необходимо зарегистрироваться для просмотра ссылки
Тады так
ВЫБРАТЬ
                                |    СУММА(ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) * ЕСТЬNULL(ПеремещениеТоваровТовары.Количество, 0)) КАК Сумма,
                                |    ЦеныНоменклатурыСрезПоследних.ТипЦен
                                |ИЗ
                                |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
                                |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &аа) КАК ЦеныНоменклатурыСрезПоследних
                                |        ПО ПеремещениеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                                |ГДЕ
                                |    ПеремещениеТоваровТовары.Ссылка.Проведен
                                |    И НЕ ПеремещениеТоваровТовары.Ссылка.ПометкаУдаления
                                |    И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель = &СкладПолучатель
                                |    И ПеремещениеТоваровТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
                                |
                                |СГРУППИРОВАТЬ ПО
                                |    ЦеныНоменклатурыСрезПоследних.ТипЦен


в результате в выборке будет одна строка с колонкой сумма


Да так и сделал... Получилось в итоге так.

СумОжидВозвр = 0;
    
    ЗапПеремТов = Новый Запрос;
    ЗапПеремТов.Текст =
    "ВЫБРАТЬ
    |    ЕСТЬNULL(СУММА(ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) * ЕСТЬNULL(ПеремещениеТоваровТовары.Количество, 0)), 0) КАК Сумма
    |ИЗ
    |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКон, ТипЦен = &ТипЦены) КАК ЦеныНоменклатурыСрезПоследних
    |        ПО ПеремещениеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
    |ГДЕ
    |    ПеремещениеТоваровТовары.Ссылка.Проведен
    |    И (НЕ ПеремещениеТоваровТовары.Ссылка.ПометкаУдаления)
    |    И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель = &СкладПолучатель
    |    И ПеремещениеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    |    И ПеремещениеТоваровТовары.Ссылка.ПолучательВозврата = &Контрагент";
    
    ЗапПеремТов.УстановитьПараметр("Контрагент", обрКонтр.Контрагент);
    ЗапПеремТов.УстановитьПараметр("ДатаНач", НачПериода);
    ЗапПеремТов.УстановитьПараметр("ДатаКон", КонПериода);
    ЗапПеремТов.УстановитьПараметр("ТипЦены", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("00001"));
    ЗапПеремТов.УстановитьПараметр("СкладПолучатель", Справочники.Склады.НайтиПоКоду("00546"));
    
    ПеремТов = ЗапПеремТов.Выполнить().Выгрузить();
    
    Если Число(ПеремТов[0].Сумма) > 0 Тогда
        СумОжидВозвр = ПеремТов[0].Сумма;
    КонецЕсли;


Огромное СПАСИБО за помощь!!!!!!!! icon_beer17.gif

Можно было удалить из запроса это... Если проведён, значит не помечен на удаление...
|    И (НЕ ПеремещениеТоваровТовары.Ссылка.ПометкаУдаления)
sava1
Цитата(Powerman @ 28.05.14, 14:50) необходимо зарегистрироваться для просмотра ссылки
ВЫБРАТЬ
    |    ЕСТЬNULL(СУММА

Сумма уже не буде НУЛЛ - это не надо.
Группировка - обязательно (если в выборку попадает больше одной записи)
Powerman
Цитата(sava1 @ 28.05.14, 19:28) необходимо зарегистрироваться для просмотра ссылки
Сумма уже не буде НУЛЛ - это не надо.
Группировка - обязательно (если в выборку попадает больше одной записи)

К сожалению Нулл был, по этому пришлось добавил...
Группировку добавлю, СПАСИБО ОГРОМНОЕ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.