Вывод Итога через запрос

Новая тема
Показывать по 10 20 40 сообщений
"В Табличной части документа нужно в одной ячейке вывести среднее значение суммы всех товаров ( взять таблицу проданных товаров регистре накопления)

Как я понял должно получиться что-то вроде
Функция ВозвратСреднегоЗначения(Склад,Товар)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиТоваровОстатки.СкладКомпании КАК СкладКомпании,
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровОстатки.ОстатокОстаток КАК ОстатокОстаток,
| ОстаткиТоваровОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.СкладКомпании = &СкладКомпании
| И ОстаткиТоваровОстатки.Номенклатура = &Номенклатура
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("СкладКомпании", СкладКомпании);
Результат = Запрос.Выполнить();
Sum = Итог("СуммаОстаток");                                 (В регистре накопления это значение суммы товаров)    
Kol = Итог("ОстатокОстаток");                                (В регистре накопления это значение кол-ва товаров)
itog = sum / kol ;      
Возврат itog;"
"
Функция ВозвратСреднегоЗначения()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
              | СРЕДНЕЕ(ВЫБОР
              | КОГДА ЕСТЬNULL(ОстаткиНаСкладеОстатки.ОстатокОстаток, 0) = 0
              | ТОГДА 0
              | ИНАЧЕ ЕСТЬNULL(ОстаткиНаСкладеОстатки.ЦенаОстаток, 0) / ОстаткиНаСкладеОстатки.ОстатокОстаток
              | КОНЕЦ) КАК Средняя
              |ИЗ
              | РегистрНакопления.ОстаткиНаСкладе.Остатки(
              | &Период,
              | Номенклатура = &Номенклатура
              | И СкладКомпании = &СкладКомпании) КАК ОстаткиНаСкладеОстатки";
Запрос.УстановитьПараметр("Номенклатура", Объект.Товар);
Запрос.УстановитьПараметр("СкладКомпании", Объект.СкладКомпании);
Запрос.УстановитьПараметр("Период", Объект.Период);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Возврат Результат.Средняя;
КонецЦикла;
КонецФункции
"
"Увы получаю такое сообщение об ошибке:
{Документ.РеализацияТоваров.Форма.ФормаДокумента.Форма(20)}: Ошибка при вызове метода контекста (Выполнить)      Результат = Запрос.Выполнить().Выбрать();по причине:{(10, 25)}: Неверные параметры "РегистрНакопления.ОстаткиТоваров.Остатки, 0"<>И СкладКомпании = &СкладКомпании) КАК ОстаткиТоваровОстатки"
В приведенной мной функции такого кода нет, а т.к. телепатическими способностями меня природа не наделила, то приводите сюда свой код функции полностью методом copy-past.
Есть документ "РеализацияТоваров". При выборе реквизита "Склад" и выбора реквизита "Номенклатура" нужно, чтобы осуществился запрос к регистру "ОстаткиТовара". Во время результата запроса должен быть посчитан общая стоимость товара (в регистре есть соответствующий ресурс) (которые лежат на выбранном складе) и их общее кол-во (в регистре также есть ресурс кол-во). Результатом запроса должен служить результат выражения Общаясумма/общее кол-во.
"Пока пробую что-то вроде этого, но без успешно

&НаСервереБезКонтекста
Функция ПолучитьЗакупочнуюЦенуТовара(Склад, Номенклатура)

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

КонецФункции"
"Зачем Вам в результате запроса нужна номенклатура и склад? Вам ведь нужна только средняя цена - вот ее и оставьте ("ИТОГ").  Номенклатура и склад итак известны.
Т.к. количество в регистре может оказаться нулем (допустим отсторнировали количество), то нужна проверка на "деление на ноль"
ВЫБОР
КОГДА ОстаткиТоваровОстатки.ОстатокОстаток = 0 ТОГДА 0
ИНАЧЕ ОстаткиТоваровОстатки.СуммаОстаток / ОстаткиТоваровОстатки.ОстатокОстаток
КОНЕЦ


Далее вышеприведенную конструкцию добавляете в группировку (в суммируемое поле) с функцией "Среднее", т.е. сложить все строки и разделить на количество
СРЕДНЕЕ(ВЫБОР
КОГДА ОстаткиТоваровОстатки.ОстатокОстаток = 0 ТОГДА 0
ИНАЧЕ ОстаткиТоваровОстатки.СуммаОстаток / ОстаткиТоваровОстатки.ОстатокОстаток
КОНЕЦ) КАК ИТОГ


Условие ГДЕ, в данном случае, лучше поместить в параметры виртуальной таблицы остатки:
ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(&Период, Номенклатура = &Номенклатура И СкладКомпании = &Склад) КАК ОстаткиТоваровОстатки


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


P.S.: Попробуйте использовать для построения запросов конструктор (в тексте кода правый клик - конструктор запроса с обработкой результата)."
неужели не видишь,что он даже скопипастить не может!?
"Тут не в копипасте проблема. Если брать способ Bloodwiser , то выдаёт данную ошибку. Если пробую вот так:

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

То ошибок нет, но в возврате значений нет. (В табл. ОстаткиТоваров значения есть)"
У вас проблема с переменной номенклатура.

Но т.к. я в первом топике пропустил
> ...среднее значение суммы всех товаров...
то уберите отбор по номенклатуре.

P.S.: получать остатки без даты - методологически неверно.
P.P.S.: считать среднюю цену по 5 мониторам за 5000 руб. и 3 мышкам за 500 руб. - маразм =).
Читают тему
(гостей: 1)

Быстрый переход