Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
27 мар 2023, 11:12

Легкий но очень сложный запрос

Автор Chuchi, 24 мар 2011, 14:26

0 Пользователей и 1 гость просматривают эту тему.

Chuchi

 :xfbnsdfb:
уже второй день бьюсь с простым пожалуй запросом (учебным):
Для документа "Перемещение" (товар с одного склада на другой перекинуть надо) создать запрос который будет рассчитывать стоимость "По среднему" от закупочной цены конкретного товара именно с этого склада (у меня получается считать только от общего количества на всех складах) (регистры "СтоимостьМатериала", "остатокМатериала")

я никак не могу понять как такое простое действие как выбрать по первому пункту - соответствие введенной номенклатуры и одновременно второму - отсортировать по складу нельзя высчитать суммарный итог!

Klyacksa

Видимо, нужно где-то отбор добавить. Запостите код.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Chuchi

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

     КонецЦикла;
        Движения.ОстаткиМатериалов.Записать();
         Движения.СтоимостьМатериалов.Записать();

КонецПроцедуры

Klyacksa

Ну хорошо, давайте разбираться.
Все-таки нас интересует один конкретный склад, или информация по каждому складу?
Я так поняла, что один конкретный. Значит, все данные, которые мы берем, нужно отбирать по складу. И остаток, видимо, нас интересует по этому же конкретному складу.

Итого, имеем:
1. Документ Перемещение - из него берем список Номенклатуры и количество каждого товара, которое нужно переместить.
2. Регистр ОстаткиМатериалов - из него берем информацию об остатках по нужному складу
3. Регистр СтоимостьМатериалов - из него берем Стоимость по нужному складу.

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


И, кстати, вычисление поля расчета "среднего" можно добавить в запрос - так должно будет быстрее работать.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск