Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Нужна помощь по вложенным запросам 8.2          
Powerman Подменю пользователя
сообщение 28.05.14, 11:14
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 88
Спасибо сказали: 1 раз
Рейтинг: 0

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


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


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

Подскажите как лучше сделать…
Спасибо.

sava1 Подменю пользователя
сообщение 28.05.14, 11:28
Сообщение #2

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

Вложенного не надо - простое левое соединение со срезом последних

Powerman Подменю пользователя
сообщение 28.05.14, 11:33
Сообщение #3

Говорящий
***
Группа: Пользователи
Сообщений: 88
Спасибо сказали: 1 раз
Рейтинг: 0

Цитата(sava1 @ 28.05.14, 12:28) *
Вложенного не надо - простое левое соединение со срезом последних

Как именно...? Я в соединениях пока не силён... Можно мой пример правильно исправить, а я проанализирую правильное решение...
Если не сложно...
Заранее спасибо.

sava1 Подменю пользователя
сообщение 28.05.14, 11:52
Сообщение #4

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

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


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

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

Powerman Подменю пользователя
сообщение 28.05.14, 11:53
Сообщение #5

Говорящий
***
Группа: Пользователи
Сообщений: 88
Спасибо сказали: 1 раз
Рейтинг: 0

Цитата(sava1 @ 28.05.14, 12:38) *
ВЫБРАТЬ
ПеремещениеТоваровТовары.Номенклатура,
ПеремещениеТоваровТовары.Ссылка,
ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &аа) КАК ЦеныНоменклатурыСрезПоследних
      ПО ПеремещениеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура"


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



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

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


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

sava1 Подменю пользователя
сообщение 28.05.14, 12:15
Сообщение #6

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

См второй запрос из поста

Цитата(Powerman @ 28.05.14, 12:53) *
ПеремещениеТоваровТовары.Проведен = ИСТИНА

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

Конфигурация какая? Откуда появился ПолучательВозврата ?

Petre Подменю пользователя
сообщение 28.05.14, 12:31
Сообщение #7

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2905
Из: Київ, Україна
Спасибо сказали: 1147 раз
Рейтинг: 1228.9

Цитата(sava1 @ 28.05.14, 13:15) *
ПеремещениеТоваровТовары.Ссылка.Проведен

А также:
    И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель.Код = "00546"
    И ПеремещениеТоваровТовары.Ссылка.ПолучательВозврата = &Контрагент
    И ПеремещениеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Powerman Подменю пользователя
сообщение 28.05.14, 12:58
Сообщение #8

Говорящий
***
Группа: Пользователи
Сообщений: 88
Спасибо сказали: 1 раз
Рейтинг: 0

Цитата(sava1 @ 28.05.14, 12:56) *
См второй запрос из поста


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


В этой задаче необходимо рассчитать сумму входной цены по всем строкам документа.

sava1 Подменю пользователя
сообщение 28.05.14, 13:05
Сообщение #9

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

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


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

Powerman Подменю пользователя
сообщение 28.05.14, 13:50
Сообщение #10

Говорящий
***
Группа: Пользователи
Сообщений: 88
Спасибо сказали: 1 раз
Рейтинг: 0

Цитата(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 Подменю пользователя
сообщение 28.05.14, 18:28
Сообщение #11

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2688
Из: Проскуров
Спасибо сказали: 681 раз
Рейтинг: 659.7

Цитата(Powerman @ 28.05.14, 14:50) *
ВЫБРАТЬ
    |    ЕСТЬNULL(СУММА

Сумма уже не буде НУЛЛ - это не надо.
Группировка - обязательно (если в выборку попадает больше одной записи)

Powerman Подменю пользователя
сообщение 28.05.14, 19:12
Сообщение #12

Говорящий
***
Группа: Пользователи
Сообщений: 88
Спасибо сказали: 1 раз
Рейтинг: 0

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

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 17.04.24, 0:21
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!