Загрузка данных
Процедура ПолучитьЦеныНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Цены.Номенклатура КАК Номенклатура,
| Цены.Цена КАК Цена,
| ЦелоеЧастное(РАЗНОСТЬДАТ(Цены.Период, &КонецПериода, МЕСЯЦ), 3) КАК НомерОкна
|ПОМЕСТИТЬ Вт_Записи
|ИЗ
| РегистрСведений.ЦеныНоменклатуры25 КАК Цены
|ГДЕ
| Цены.ВидЦены = &ВидЦены
| И Цены.Период МЕЖДУ &НачалоПериода И &КонецПериода
| И Цены.Цена <> 0
| И ВЫРАЗИТЬ(Цены.Регистратор КАК Документ.УстановкаЦенНоменклатуры).ДокументОснование ССЫЛКА Документ.ПоступлениеТоваровУслуг
|;
|
|//////////////////////////////////////////////////////////////
|// Кол-во записей по каждому окну (номенклатура + номер окна)
|ВЫБРАТЬ
| Записи.Номенклатура КАК Номенклатура,
| Записи.НомерОкна КАК НомерОкна,
| КОЛИЧЕСТВО(*) КАК КолвоВОкне
|ПОМЕСТИТЬ Вт_ПоОкнам
|ИЗ
| Вт_Записи КАК Записи
|СГРУППИРОВАТЬ ПО
| Записи.Номенклатура,
| Записи.НомерОкна
|;
|
|//////////////////////////////////////////////////////////////
|// Кумулятивное кол-во: для окна N суммируем все окна <= N
|ВЫБРАТЬ
| Тек.Номенклатура КАК Номенклатура,
| Тек.НомерОкна КАК НомерОкна,
| СУММА(Пред.КолвоВОкне) КАК КолвоНарастающим
|ПОМЕСТИТЬ Вт_Кумулятив
|ИЗ
| Вт_ПоОкнам КАК Тек
| ЛЕВОЕ СОЕДИНЕНИЕ Вт_ПоОкнам КАК Пред
| ПО Тек.Номенклатура = Пред.Номенклатура
| И Пред.НомерОкна <= Тек.НомерОкна
|СГРУППИРОВАТЬ ПО
| Тек.Номенклатура,
| Тек.НомерОкна
|;
|
|//////////////////////////////////////////////////////////////
|// Минимальное окно, где накопилось >= 2 записей
|ВЫБРАТЬ
| Кум.Номенклатура КАК Номенклатура,
| МИНИМУМ(Кум.НомерОкна) КАК ГраницаОкна
|ПОМЕСТИТЬ Вт_Граница
|ИЗ
| Вт_Кумулятив КАК Кум
|ГДЕ
| Кум.КолвоНарастающим >= 2
|СГРУППИРОВАТЬ ПО
| Кум.Номенклатура
|;
|
|//////////////////////////////////////////////////////////////
|// Средняя по всем записям с НомерОкна <= найденной границы
|ВЫБРАТЬ
| Записи.Номенклатура КАК Номенклатура,
| СРЕДНЕЕ(Записи.Цена) КАК СредняяЦена
|ПОМЕСТИТЬ Вт_СредниеЦены
|ИЗ
| Вт_Записи КАК Записи
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Вт_Граница КАК Граница
| ПО Записи.Номенклатура = Граница.Номенклатура
| И Записи.НомерОкна <= Граница.ГраницаОкна
|СГРУППИРОВАТЬ ПО
| Записи.Номенклатура
|;
|
|//////////////////////////////////////////////////////////////
|// Финал: срез последних (last_price) + средняя
|ВЫБРАТЬ
| ЦеныСрез.Номенклатура КАК Номенклатура,
| ЦеныСрез.Цена КАК Цена,
| ВЫРАЗИТЬ(ЕСТЬNULL(Ср.СредняяЦена, ЦеныСрез.Цена) КАК ЧИСЛО(15, 2)) КАК СредняяЦена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры25.СрезПоследних(&КонецПериода, ВидЦены = &ВидЦены) КАК ЦеныСрез
| ЛЕВОЕ СОЕДИНЕНИЕ Вт_СредниеЦены КАК Ср
| ПО ЦеныСрез.Номенклатура = Ср.Номенклатура
|ГДЕ
| ЦеныСрез.Цена <> 0";
Запрос.УстановитьПараметр("ВидЦены",Справочники.ВидыЦен.НайтиПоРеквизиту("Идентификатор","ЗакупочнаяЦена"));
Запрос.УстановитьПараметр("НачалоПериода",Дата("20260101"));
Запрос.УстановитьПараметр("КонецПериода",ТекущаяДатаСеанса());
Выборка = Запрос.Выполнить().Выбрать();
МассивЦен = Новый Массив;
Пока Выборка.Следующий() Цикл
Элемент = Новый Структура;
Элемент.Вставить("guid", Строка(Выборка.Номенклатура.УникальныйИдентификатор()));
Элемент.Вставить("name", СокрЛП(Строка(Выборка.Номенклатура)));
Элемент.Вставить("last_price", Выборка.Цена);
Элемент.Вставить("avg_price", Выборка.СредняяЦена);
МассивЦен.Добавить(Элемент);
КонецЦикла;
ДанныеJSON = ОбщегоНазначения.ЗначениеВJSON(МассивЦен);
КонецПроцедуры