Добрые люди, знатоки, профессионалы !! Хочу вывести среднюю цену номенклатур в форме списка справочника из РегистрНакопления(обороты) . Есть решение этой задачи ?
---
Неверно, конечно. С учетом исправленного регистра (надо накапливать общую сумму закупок, а не цену закупки) запрос может выглядеть так:

```1c
    ВЫБРАТЬ
    ОбщиеОбороты.Номенклатура КАК Номенклатура,
    ОбщиеОбороты.Остаток КАК Остаток,
    ВЫБОР
    КОГДА ЕСТЬNULL(ОбщиеОбороты.Количество, 0) = 0
    ТОГДА 0
    ИНАЧЕ ОбщиеОбороты.Сумма / ОбщиеОбороты.Количество
    КОНЕЦ КАК СредняяСтоимость
    ИЗ
    (ВЫБРАТЬ
    ОстаткиТовараОстатки.Номенклатура КАК Номенклатура,
    ОстаткиТовараОстатки.КоличествоОстаток КАК Остаток,
    СУММА(ЗакупкиОбороты.СуммаОборот) КАК Сумма,
    СУММА(ЗакупкиОбороты.КоличествоОборот) КАК Количество
    ИЗ
    РегистрНакопления.ОстаткиТовара.Остатки КАК ОстаткиТовараОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки.Обороты КАК ЗакупкиОбороты
    ПО ОстаткиТовараОстатки.Номенклатура = ЗакупкиОбороты.Номенклатура

    СГРУППИРОВАТЬ ПО
    ОстаткиТовараОстатки.Номенклатура,
    ОстаткиТовараОстатки.КоличествоОстаток) КАК ОбщиеОбороты
```

Но еще раз подчеркиваю - это правильный запрос с точки зрения корректности данных, но абсолютно неверно использовать такой запрос в динамических списках.
---
Задачи агрегации решаются через доп регистры сведений (денормализация), пример: состояния заказов покупателей в УТ 11. При записи в РС Цены номенклатуры пересчитайте как нужно среднюю, после левым соединением добавляйте в список.
---
Можно подцепить к справочнику Номенклатура левым соединением вложенный запрос по виртуальной таблице обороты вашего регистра накопления. Во вложенный запрос взять номенклатуру, количество расход, сумму расход.
В главный запрос вывести Сумма расход / Количество расход.

Но это большие тормоза для формы списка. И с накоплением данных тормоза будут всё тормознее.
---
а если подробнее с кодом ? Я новичок в теме запросов )
---
Например так. Это УТ 11. Регистр накопления взял для примера.

```1c
    ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Номенклатура,
    ВЫБОР
    КОГДА СуммыДвижений.Количество > 0
    ТОГДА ЕСТЬNULL(СуммыДвижений.Сумма, 0) / СуммыДвижений.Количество
    ИНАЧЕ 0
    КОНЕЦ КАК СредняяЦена
    ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот КАК Количество,
    ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиБезНДСОборот КАК Сумма
    ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты КАК ВыручкаИСебестоимостьПродажОбороты) КАК СуммыДвижений
    ПО (СправочникНоменклатура.Ссылка = СуммыДвижений.Номенклатура)
```
---
где я ошибаюсь подскажите
---
Нигде, запрос нормальный :) что не устраивает?
---
При выполнении консоль запросов ошибку дает : Поле не найдено "Закупки.Цена"
<<?>>Закупки.Цена КАК цена,
---
Если это динамический список справочника номенклатуры, то с вероятностью 99% получишь сообщение "Обнаружено дублирование ключевых значений в колонке Ссылка", так как в РН Закупки будет несколько записей с одной и той же номенклатурой.
Соединять надо с уже сгруппированой по номенклатуре таблицей.
---
1. После "РегистрНакопления.Закупки КАК Закупки" скобку закрыть и псевдоним какой-то поставить, например РегистрЗакупок
2. В условии соединения "ПО..." вместо "Закупки" написать "РегистрЗакупок"
3. В "ВЫБРАТЬ" добавить собственно поле цены: РегистрЗакупок.Цена

...но этот запрос не подходит для формы списка.
Во-первых:
(9) Если это динамический список справочника номенклатуры, то с вероятностью 99% получишь сообщение "Обнаружено дублирование ключевых значений в колонке Ссылка", так как в РН Закупки будет несколько записей с одной и той же номенклатурой.
Соединять надо с уже сгруппированой по номенклатуре таблицей.
Во-вторых - даже если вдруг в форме списка не динамический список (что было бы очень странно), Номенклатура размножится на количество закупок: было 20 приходов "Стол письменный коричневый" - получишь в списке 20 одинаковых столов письменных коричневых.

Ну а про этот ящик Пандоры лучше даже не думать))
(8) А какая конфигурация? Потому что есть очень большой вопрос - а средняя цена для какой организации должна быть выведена?
---
```1c
    ВЫБРАТЬ

    СправочникНоменклатура.Наименование,
    СправочникНоменклатура.Характеристика,

    ВЫБОР
    КОГДА СправочникНоменклатура.ПометкаУдаления
    ТОГДА 6
    ИНАЧЕ 0
    КОНЕЦ КАК ВариантКартинки

    ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура

    ЛЕВОЕ СОЕДИНЕНИЕ

    (ВЫБРАТЬ
    Закупки.Цена КАК цена,
    Закупки.Номенклатура КАК Номенклатура
    ИЗ

    РегистрНакопления.Закупки) КАК РегистрЗакупок

    ПО СправочникНоменклатура.Ссылка = РегистрЗакупок.Номенклатура
```

все равно дает ошибку : Поле не найдено "Закупки.Цена"
                                               <<?>>Закупки.Цена КАК цена,
---
А в регистре Закупки (если такой есть) есть ресурс Цена?
Ну и какой-то ресурс "количество" там есть? Без него будет сложнее.
Можете скриншот регистра сделать, как он выглядит в конфигурации? В таком развёрнутом виде:
---
А зачем нам цена? Цена не отражает объёма закупки для расчета корректной средней стоимости единицы товара. Все, что необходимо - это объемы закупок. Сумма и количество.

Вообще, я думаю, что автор со словом "средняя цена" немного намудрил. Правильнее говорить "средняя стоимость".
---
Я подумал, вдруг там в регистре только Цена и есть, тогда у нас для вычисления средней температуры по Коммунарке только Цена и... количество приходов...
---
Вот-вот! А расчет средней "по количеству приходов" - математический бред, не содержащий в себе никакой прикладной сути ценности для бизнеса ))) Это именно что "Коммунарка".
---
А попробуйте такой вариант. Здесь на форме только список номенклатуры, больше ничего обработка не делает. Если взлетит в таком виде, буду ещё кое-что уточнять.
---
постойте ка ! я тут ошибался сорри. а как присвоить псевдоним ?
---
Вот дописать нужно КАК Закупки перед скобкой

```1c
    РегистрНакопления.Закупки КАК Закупки) КАК РегистрЗакупок
```
---
все равно поле Закупки не находит
---
А какая конфигурация? Потому что есть очень большой вопрос - а средняя цена для какой организации должна быть выведена?
---
Не типовая конфигурация, не ведется учет по организациям
---
Прекрасно, осталось определить - что вы понимаете под средней ценой?
Например (по мере возрастания бесполезности):
1. Средняя цена закупки, рассчитанная по остаткам с учетом партионного учета.
2. Средняя цена закупки за определенный период (скользящая).
3. Средняя цена продажи за определенный период (скользящая).
4. Средняя цена закупки за все время учета
5. Средняя цена продажи за все время учета

По технической части:
Как вам уже сказали выше - при выводе в динамический список левого соединения по оборотам будут наблюдаться тормоза.
Способ решения зависит от того, для какой цели вам необходима данная информация.На мой взгляд никакой оперативности в данном вопросе не требуется, вполне подойдет рассчитанная цена "по состоянию на утро".
Масштабируемое решение выглядело бы так, на мой взгляд:
1. Регистр сведений с хранимыми показателями номенклатуры.
2. Регламентной задание, которое по ночам рассчитывает необходимые средние показатели.
3. Левое соединение к этому регистру в запросе динамического списка.
---
Средняя цена закупки за все время учета

Средняя цена закупки за все время учета
---
Прекрасно. Рассказать, как рассчитывается средняя? ОбщаяСуммаЗакупки/ОбщееКоличествоЗакупки.
Это линейная средняя. Есть еще средневзвешенная...
---
(17) Прекрасно. Рассказать, как рассчитывается средняя? ОбщаяСуммаЗакупки/ОбщееКоличествоЗакупки.
Это линейная средняя.

в точку ...
---
а реализовать как ?) в запросе динамического списка в форме списка ном-туры использовав левое соединение можно решить эту задачу ? или я ошибаюсь
---
Я же все написал. И вам написали. Левым соединением решить можно все. Вопрос только в тормозах.
Самый простой вариант - левое соединение с вложенным запросом, сформированного по оборотам регистра накопления закупок. Но это и самый неправильный вариант одновременно с точки зрения производительности.
---
(24) Но это и самый неправильный вариант одновременно с точки зрения производительности.

у нас еще совсем небольшое предприятие) думаю это пока для нас не является проблемой )
---
Вопрос не в проблеме предприятия. Вопрос в квалификации программиста. Приучаются на маленьких предприятиях делать "лишь бы работало", потом привыкают к этой философии сами и приучают работодателя.
Душить такую философию в зародыше.
---
правильно, с вами согласен !!! А прикол в том что я сам являюсь предпринимателем малобюджетного предприятия. Нахожусь в Узбекистане. С бюджетом то ладно, можно найти деньги если сильно захотеть. Но я искал программистов у нас тут, нашел но у них только типовые конфигурации. мы оказываем услуги Авиакассы и продаем товары, и еще другие компьютерные услуги. Программисты предлагают варианты у которых есть авиабилеты но нету других услуг, или наоборот есть одно нету другого.))
---
Тогда тем более - прежде чем определяться с механизмом реализации и внесением изменений, необходимо понять какой управленческой цели вы добиваетесь. От этого зависит как стоимость самой реализации, так и стоимость её дальнейшей поддержки.
---
и еще некоторые совсем перестали на звонки отвечать (при том что цена еще не озвучена) )) такая трудная задача была перед ними ?))
---
а в модуле формы списка номенклатуры не получится с помощью процедуры ???
---
Например какой процедуры? Что она будет делать?
---
в прежней конфигурации использовал срез последних в модуле формы документа :

```1c
    &НаКлиенте
    Процедура НоменклатураПриИзменении(Элемент)
    //Получение цен
    Объект.ЦенаТовара = ВыводитьЦенуПродажи.УстановленнаяЦена(Объект.Дата,Объект.Номенклатура);
    Объект.ЗакупочнаяЦена = ВыводитьЦенуПродажи.ЗакупочнаяЦена(Объект.Дата,Объект.Номенклатура);

    //ПроверкаОстатокТовара
    Объект.Остатки = ВыводитьОстатокНоменклатуры.ОстатокВСкладе(Объект.Дата,Объект.Номенклатура);

    Расчёты();

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

В общем модуле :

```1c
    Функция УстановленнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
    Отбор = Новый Структура("Номенклатура",ЭлементНоменклатуры);
    ЗначениеРесурсов = РегистрыСведений.ЦеныПродажи.ПолучитьПоследнее(АктуальнаяДата,Отбор);
    Возврат ЗначениеРесурсов.УстановленнаяЦена;
    КонецФункции

    Функция ЗакупочнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт
    Отбор = Новый Структура("Номенклатура",ЭлементНоменклатуры);
    ЗначениеРесурсов = РегистрыСведений.ЦеныПоставщика.ПолучитьПоследнее(АктуальнаяДата,Отбор);
    Возврат ЗначениеРесурсов.ЗакупочнаяЦена;
    КонецФункции
```

Вот так и выводил закупочную цену но это было неправильно как вы знаете ) А надо оказывается считать среднюю цену так как закуп цены могут меняться
---
Общим модуль с названием "ВыводитьЦенуПродажи"? Ну, ладно...

PS. А зачем из клиентской процедуры два раза дергать сервер?
---
все из-за нехватки знаний ((
---
```1c
    &НаКлиенте
    Процедура НоменклатураПриИзменении(Элемент)
    НоменклатураПриИзмененииНаСервере();
    Расчёты();
    КонецПроцедуры

    &НаСервере
    Процедура НоменклатураПриИзмененииНаСервере()
    //Получение цен
    Объект.ЦенаТовара = ВыводитьЦенуПродажи.УстановленнаяЦена(Объект.Дата,Объект.Номенклатура);
    Объект.ЗакупочнаяЦена = ВыводитьЦенуПродажи.ЗакупочнаяЦена(Объект.Дата,Объект.Номенклатура);

    //ПроверкаОстатокТовара
    Объект.Остатки = ВыводитьОстатокНоменклатуры.ОстатокВСкладе(Объект.Дата,Объект.Номенклатура);

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

Понять бы еще, что там за Остаток в складе() и Расчёты(). (За букву Ё в коде надо отдельно пороть)
---
Прикрепляю свою не доделанную конф чтоб понять было легче
---
Это еще что такое!!! Ты решил в оборотах хранить цену? Тут в ресурсах должна быть Сумма и Количество. Цена - это не оборот, это просто характеристика сделки, образно говоря. Её нельзя накапливать (суммировать с течением времени).

Исходя из твоей конфигурации происходит следующее:
1. Покупка 10 стульев по 50 рублей. Итого Количество = 0+10 = 10. Итого Цена = 0+50 = 50.
2. Покупка 15 стульев по 50 рублей. Итого Количество = 10+15 = 25. Итого Цена = 50+50 = 100.

А должно быть
1. Покупка 10 стульев по 50 рублей. Итого Количество = 0+10 = 10. Итого Сумма = 0+500 = 500.
2. Покупка 15 стульев по 50 рублей. Итого Количество = 10+15 = 25. Итого Сумма = 500+750 = 1250.
---
Добрые люди ! В принципе разобрался с помощью ваших советов. Сделал так с помощью конструктора запроса :

```1c
    ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
    ПОМЕСТИТЬ СправочникНоменклатура
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Закупки.Номенклатура КАК Номенклатура,
    Закупки.Цена КАК Цена
    ПОМЕСТИТЬ РегистрЗакупок
    ИЗ
    РегистрНакопления.Закупки КАК Закупки
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ОстаткиТовараОстатки.Номенклатура КАК Номенклатура,
    ОстаткиТовараОстатки.КоличествоОстаток КАК КоличествоОстаток
    ПОМЕСТИТЬ Остатки
    ИЗ
    РегистрНакопления.ОстаткиТовара.Остатки КАК ОстаткиТовараОстатки
    ;

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

    СГРУППИРОВАТЬ ПО
    СправочникНоменклатура.Ссылка,
    Остатки.КоличествоОстаток
```

только вопрос в том, правильно ли будет учет товаров при таком раскладе ? Конструктор Запросов сам высчитывает среднее, А НЕ ТАК КАК : СУММА( Закупки.Себестоимость) / СУММА(Закупки.Количество).

Уточнительный вопрос: СУММА( Закупки.Себестоимость) / СУММА(Закупки.Количество) - в таком раскладе Имеется ввиду Оборотное количество ИЛИ Количество Остатков ????

Где у нас тут математики ?) помогите ))
---
Неверно, конечно. С учетом исправленного регистра (надо накапливать общую сумму закупок, а не цену закупки) запрос может выглядеть так:

```1c
    ВЫБРАТЬ
    ОбщиеОбороты.Номенклатура КАК Номенклатура,
    ОбщиеОбороты.Остаток КАК Остаток,
    ВЫБОР
    КОГДА ЕСТЬNULL(ОбщиеОбороты.Количество, 0) = 0
    ТОГДА 0
    ИНАЧЕ ОбщиеОбороты.Сумма / ОбщиеОбороты.Количество
    КОНЕЦ КАК СредняяСтоимость
    ИЗ
    (ВЫБРАТЬ
    ОстаткиТовараОстатки.Номенклатура КАК Номенклатура,
    ОстаткиТовараОстатки.КоличествоОстаток КАК Остаток,
    СУММА(ЗакупкиОбороты.СуммаОборот) КАК Сумма,
    СУММА(ЗакупкиОбороты.КоличествоОборот) КАК Количество
    ИЗ
    РегистрНакопления.ОстаткиТовара.Остатки КАК ОстаткиТовараОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки.Обороты КАК ЗакупкиОбороты
    ПО ОстаткиТовараОстатки.Номенклатура = ЗакупкиОбороты.Номенклатура

    СГРУППИРОВАТЬ ПО
    ОстаткиТовараОстатки.Номенклатура,
    ОстаткиТовараОстатки.КоличествоОстаток) КАК ОбщиеОбороты
```

Но еще раз подчеркиваю - это правильный запрос с точки зрения корректности данных, но абсолютно неверно использовать такой запрос в динамических списках.
---
а где можно найти верный способ ?
---
Верный способ - это не использовать постоянно меняющуюся связанную информацию в динамических списках. Они не для этого предназначены. Верный способ - получать такую информацию в отчетах.
---
я как новичок конечно глубоко не понимаю. Но я думал в принципе Динамический список не хранит полученные (суммы, себестоимость, остатки), только выводит при открытие форму списка врем таблицу где можно узнать сколько остатков в наличии . а Среднюю цену позже узнал в динамическом списке выводить не нужно, так как она тут вообще не надо
---
Не хранит. Но он их постоянно обновляет. То есть периодически выполняет данный запрос когда форма открыта.
---
и какой же минус от этого ?
---
или как решить эту задачу
---
К тому же он просто не всю номенклатуру выведет в список, а только с оборотами.
---
С остатками )) Левая таблица у меня - остатки. Не стал я справочник подтягивать. Потому что это запрос для отчета, да.
---
Спасибо вам за обсуждение, советы и помощь !.
---
Обработку мою хоть попробовали?
---
Для получения "тяжелых" данных в динамических списках порекомендовал бы работу с событием ПриПолученииДанныхНаСервере таблицы.