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


Запрос (одно окно; границы &НачалоПериода, &КонецПериода подставляются в цикле):
ВЫБРАТЬ
    Цены.Номенклатура КАК Номенклатура,
    Цены.Цена КАК Цена,
    Цены.Период КАК Период
ИЗ
    РегистрСведений.ЦеныНоменклатуры25 КАК Цены
ГДЕ
    Цены.Номенклатура = &Номенклатура
    И Цены.ВидЦены = &ВидЦеныЗакупочная
    И Цены.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И ВЫРАЗИТЬ(Цены.Регистратор КАК Документ.УстановкаЦенНоменклатуры).ДокументОснование ССЫЛКА Документ.ПоступлениеТоваровУслуг
УПОРЯДОЧИТЬ ПО
    Период УБЫВ
Обёртка на выборку окон по одной номенклатуре:
Функция ПолучитьСреднююЦену(Номенклатура, ВидЦены) Экспорт
    ГраницаМинимум = Дата(2026, 1, 1, 0, 0, 0);
    КонецПериода    = ТекущаяДата();
    ШагМесяцев      = 3;

    Пока Истина Цикл
        НачалоПериода = ДобавитьМесяц(КонецПериода, -ШагМесяцев);
        Если НачалоПериода < ГраницаМинимум Тогда
            НачалоПериода = ГраницаМинимум;
        КонецЕсли;

        Запрос = Новый Запрос(ТекстЗапроса); // текст выше
        Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
        Запрос.УстановитьПараметр("ВидЦеныЗакупочная", ВидЦены);
        Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
        Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

        Выборка = Запрос.Выполнить().Выбрать();

        Если Выборка.Количество() >= 2 Тогда
            Сумма = 0; Кол = 0;
            Пока Выборка.Следующий() Цикл
                Сумма = Сумма + Выборка.Цена;
                Кол   = Кол + 1;
            КонецЦикла;
            Возврат Сумма / Кол;
        КонецЕсли;

        // не нашли 2 записи — расширяем окно вниз
        Если НачалоПериода <= ГраницаМинимум Тогда
            Прервать; // дошли до 01.01.2026, глубже нельзя
        КонецЕсли;
        КонецПериода = НачалоПериода; // следующее окно продолжает вниз
    КонецЦикла;

    Возврат Неопределено; // не набралось 2 записей до 01.01.2026
КонецФункции