Запрос для получения остатков по дням даже если не было движений
Период | Номенклатура | Количество |
01.05.2016 | Товар 01 | 4 |
11.05.2016 | Товар 01 | 3 |
16.05.2016 | Товар 01 | 2 |
31.05.2016 | Товар 01 | 2 |
Нам же в рамках нашей задачи нужна таблица, показывающая остаток на каждый день месяца:
Период | Номенклатура | Количество |
01.05.2016 | Товар 01 | 4 |
02.05.2016 | Товар 01 | 4 |
03.05.2016 | Товар 01 | 4 |
04.05.2016 | Товар 01 | 4 |
05.05.2016 | Товар 01 | 4 |
06.05.2016 | Товар 01 | 4 |
07.05.2016 | Товар 01 | 4 |
08.05.2016 | Товар 01 | 4 |
09.05.2016 | Товар 01 | 4 |
10.05.2016 | Товар 01 | 4 |
11.05.2016 | Товар 01 | 3 |
12.05.2016 | Товар 01 | 3 |
13.05.2016 | Товар 01 | 3 |
14.05.2016 | Товар 01 | 3 |
15.05.2016 | Товар 01 | 3 |
16.05.2016 | Товар 01 | 2 |
17.05.2016 | Товар 01 | 2 |
18.05.2016 | Товар 01 | 2 |
19.05.2016 | Товар 01 | 2 |
20.05.2016 | Товар 01 | 2 |
21.05.2016 | Товар 01 | 2 |
22.05.2016 | Товар 01 | 2 |
23.05.2016 | Товар 01 | 2 |
24.05.2016 | Товар 01 | 2 |
25.05.2016 | Товар 01 | 2 |
26.05.2016 | Товар 01 | 2 |
27.05.2016 | Товар 01 | 2 |
28.05.2016 | Товар 01 | 2 |
29.05.2016 | Товар 01 | 2 |
30.05.2016 | Товар 01 | 2 |
31.05.2016 | Товар 01 | 2 |
Посмотрим как мы можем это получить. Вот текст самого запроса:
2. Получаем таблицу номенклатуры из справочника (чтобы выводить в результат даже ту номенклатуру, по которой записей в регистре отродясь не было);
Номенклатура | Период (таблица периодов) | Период (таблица регистра) |
Товар 01 | 15.05.2016 | 01.05.2016 |
Товар 01 | 15.05.2016 | 11.05.2016 |
Номенклатура | Период (таблица периодов) | Период (таблица регистра) |
Товар 01 | 15.05.2016 | 11.05.2016 |
. и мы получаем полезную таблицу, в которой есть номенклатура, период конкретного дня отчета, и дата максимального периода из таблицы регистра, по которому можно вытащить актуальную для этого дня цифирку.
Остатки на каждый день в запросе
Запрос формирует остатки товаров на каждый день в пределах выбранного периода.
(9) Прогнал запрос у себя. Да есть такое дело. Решение Вы уже описали. Если нужны остатки взаиморасчетов по дням например с 2.01.2017 по 1.27.2017 тогда параметр НачалоПериода устанавливаем на конец предыдущего дня, то есть 1.01.2017 23:59:59. В таком случае в результирующей таблице мы будем видеть корректные остатки начиная с 2.01.2017.
Это конечно не глюк, скорее специфика работы системы. Я когда-то разбирался, пытался понять из-за чего так происходит. Если память мне не изменяет, то такое поведение образуется из-за
Остаток на каждый месяц по счету 02 для бух корп
ни запрос из статьи ни запрос из (18) не работают в случае отсутствия товара на остатках на НачалоПериода, но его появления на остатках потом. Такой возможностью не стоит пренебрегать
вот вроде рабочий запрос
таким же образом (казалось бы!) можно получить и Начальный остаток. и Приход/ Расход
но тут есть свои подводные камни.
1-ый далеко НЕ во всех конфигурациях есть РегистрСведений.РегламентированныйПроизводственныйКалендарь
«легко» заменяем на Таблицу Значений. не забывая определить тип поля и правильно посчитав число нужных дней!
2-ой Совсем не такие условия нужны для Начального остатка. помучаться придётся. чтоб ещё 2-ое условие добавить
3-ий остатки и движения по Товарам на складах (о ужас!) не всегда совпадают с движениями по Партиям товаров на складах, а нам, например, надо сравнивать эти движения с Продажами и Поступлениями!
(при ордерной схеме, как «обычно» и бывает у многих, Закупка и Продажи НЕ совпадают с движением по складу!)
АйТиБложик
Маленький IT блог с характером 1С.
Получение остатков и оборотов по каждому товару на каждый день запросом
Как-то на собеседовании мне прилетело тестовое задание, в котором одним из пунктов было получение остатков и оборотов по каждому товару на каждый день одним запросом. Делюсь своим вариантом решения в надежде что кто-то в комментариях поделится своим вариантом решения.
Вся соль задачи состоит в том, что обращения к виртуальной таблице остатков и оборотов в запросе не достаточно, так как эта виртуальная таблица содержит периоды, по которым были движения, если так можно выразиться (см. рисунок 1). Иными словами, если Товар №1 поступил в магазин в начале недели (в понедельник) в количестве 5ти штук и за неделю не было ни одной продажи, то виртуальная таблица по этому товару за эту неделю выдаст лишь одну запись за понедельник, которая будет отражать остатки на начало и конец дня, приход (+5), расход (0) и оборот (0).
Данную задачу я решил разделить на несколько подзадач, ведь слона легче есть кусками, чем сразу целиком. Получились такие подзадачи:
Первая подзадача решается довольно просто. Создаем таблицу значений с колонкой Дата. Зная границы периода, в цикле заполняем таблицу датами на каждый день.
Получившуюся таблицу значений помещаем во временную таблицу запроса с последующим выводом содержимого временной таблицы через основной запрос.
В результате выполнения запроса получим даты на каждый день, что нам и нужно было. Так же на просторах интернета можно найти получение дат на каждый день только одним запросом, не прибегая к написанию дополнительного программного кода, но это уже больше отдельная тема для обсуждения. Если же в конфигурации имеется регистр сведений, который хранит какие-то данные на каждый день, то смело можно использовать его и задача упрощается до обычной выборки дат из этого регистра.
Вторая подзадача не сложнее первой, необходимо создать запрос, в котором обращаемся к таблице товаров и к виртуальной таблице остатков и оборотов, главное правильно указать параметры виртуальной таблицы и выбрать нужный тип соединения таблиц.
Рисунок 1. Остатки и обороты по товару «Стол дуб.» за 2015 год |
А вот и самое интересное, решение третьей подзадачи. Соединяем таблицы первой и второй подзадачи таким образом, что бы в результате каждому дню соответствовал необходимый период остатков и оборотов, результат помещаем во временную таблицу (см. рисунок 2).
Рисунок 2. Промежуточная таблица с ключом соединения по товару и периоду |
Полученную временную таблицу соединяем с таблицей второй подзадачи по составному ключу , на поля выборки НачальныйОстаток, КонечныйОстаток, Приход, Расход и Оборот накладываем условие по периоду остатков и оборотов для правильного расчета значений (см. последний запрос в пакете запросов), в итоге получаем остатки и обороты на каждый день.
Конечный текст пакета запросов:
Скорость выполнения запроса на реальных данных не замерял, по оптимальности ничего не скажу. Если убрать из запроса обороты, то можно получить только остатки на каждый день, причем на начало и на конец дня.