Запрос: Среднедневной остаток любого ресурса для любого регистра остатков за любой период через движения регистра

16.12.24

Разработка - Запросы

Быстрый способ получения среднедневного остатка регистра накопления через его обороты.

Представим остатки товара на складе в виде последовательности чисел.

Например, за период с 1 по 5 число остатки товара на складе были равны:

10   10   10    0    5

Данная ситуация сложилась, потому что наш регистр накопления содержал следующие движения:

1 день.  +10

4 день.  -10

5 день.  +5

Для решения задачи в лоб необходимо получить среднее арифметическое конечных остатков товара за каждый день периода. (10 + 10 + 10 + 0 + 5) / 5 = 7

Как сделать то же самое, если имеем только движения регистра за определенные дни (+10,-10,+5)?

Любую последовательность чисел можно разложить на несколько, покомпонентная сумма которых будет равна нашей последовательности.

В виде покомпонентной суммы каких последовательность можно представить нашу последовательность? В виде следующих трёх, каждая из которых состоит из одинаковых чисел.

Обратите внимание, что каждое число последовательностей равно обороту движения регистра за определенный день.


    10  10  10  10  10

+   0    0   0  -10 -10

+   0    0   0    0    5

------------------------

=   10  10  10  0   5

 

Найдём среднее арифметическое для каждой из этих трёх последовательностей:

1. (10+10+10+10+10) / 5 =  10 * 5 / 5

2. (0 + 0 + 0  -10- 10) / 5 = -10 * 2 / 5

3. (0 + 0 + 0  +0  +5)  / 5 =   5 * 1 / 5

Так как наша первоначальная последовательность получена с помощью покомпонентного сложения этих трёх последовательностей, то среднее арифметическое первоначальной последовательности равно сумме средних арифметических этих трёх последовательностей.

То есть ср.арифметическое μ (10  10  10  0  5) = 10*5/5  - 10*2/5  +5*1/5

Данная формула будет справедлива для любой последовательности n чисел.:

 , где

n - количество календарных дней в периоде отчёта (в нашем примере = 5)

k - количество дней, в которых есть движения регистра (в нашем примере = 3)

ak - это значение движения по регистру за определенный день (в нашем примере -- это 10, -10, 5)

bk - номер дня, в котором находится движение регистра (в нашем примере выше -- это дни 1, 4, 5)

 

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

// ak   = ПартииТоваров.КоличествоОборот
// n-bk = РАЗНОСТЬДАТ(ПартииТоваров.Период, &ДатаКонца, ДЕНЬ)
// n    = (РАЗНОСТЬДАТ(&ДатаНачала, &ДатаКонца, ДЕНЬ) + 1)

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

 

//ДатаНач, ДатаКон - даты начала и конца периода отчёта

ДатаНачала = ?(ДатаНач = Дата('00010101000000'), ДатаНач, НачалоДня(ДатаНач))
ДатаКонца =  ?(ДатаКон = Дата('00010101000000'), Дата("39991231"), КонецДня(ДатаКон))

 

красивые запросы оптимизация запросов среднедневной остаток

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169256    937    403    

905

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11390    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6338    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    9066    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2727    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10218    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3623    andrey_sag    10    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RocKeR_13 1378 16.12.24 16:55 Сейчас в теме
Странная какая-то формула: n - это всё-таки индекс суммирования или константа?) Если взять индекс суммирования n=1 и вычислить слагаемое по формуле, то получим:
ak*(1-bk+1)/1=-ak*bk
Прикрепленные файлы:
khakasia; +1 Ответить
3. khakasia 144 18.12.24 14:26 Сейчас в теме
(1) Благодарю за замечание. Исправили.
RocKeR_13; +1 Ответить
2. ildarovich 7939 16.12.24 18:06 Сейчас в теме
В принципе, эта информация уже здесь была: Расчет средних по периодам в запросе - это элементарно! Возможно, объяснение из статьи по ссылке кому-то будет понятнее.
4. khakasia 144 18.12.24 14:31 Сейчас в теме
Действительно, Сергей. Честно пытался найти что-нибудь подобное, когда коллега попросил объяснить принцип работы запроса. Видимо, плохо искал, потому что не нашёл ни вашей статьи, ни отчётов с запросами аналогичного типа. Надеюсь, не зря проделал всю эту работу и, вполне может быть, моё объяснение хоть кому-нибудь покажется более доступным :)
Оставьте свое сообщение