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

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С.

15500 руб.

02.09.2020    183650    1023    403    

966

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

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

2 стартмани

06.02.2025    2147    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

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

03.12.2024    5621    artemusII    11    

23

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

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

18.10.2024    13030    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

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

11.10.2024    8125    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3131    PROSTO-1C    0    

23

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

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

16.08.2024    10711    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RocKeR_13 1411 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 7957 16.12.24 18:06 Сейчас в теме
В принципе, эта информация уже здесь была: Расчет средних по периодам в запросе - это элементарно! Возможно, объяснение из статьи по ссылке кому-то будет понятнее.
4. khakasia 144 18.12.24 14:31 Сейчас в теме
Действительно, Сергей. Честно пытался найти что-нибудь подобное, когда коллега попросил объяснить принцип работы запроса. Видимо, плохо искал, потому что не нашёл ни вашей статьи, ни отчётов с запросами аналогичного типа. Надеюсь, не зря проделал всю эту работу и, вполне может быть, моё объяснение хоть кому-нибудь покажется более доступным :)
Оставьте свое сообщение