Загрузка данных


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