1с остатки и обороты на каждый день в запросе

АйТиБложик

Маленький IT блог с характером 1С.

Получение остатков и оборотов по каждому товару на каждый день запросом

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

Вся соль задачи состоит в том, что обращения к виртуальной таблице остатков и оборотов в запросе не достаточно, так как эта виртуальная таблица содержит периоды, по которым были движения, если так можно выразиться (см. рисунок 1). Иными словами, если Товар №1 поступил в магазин в начале недели (в понедельник) в количестве 5ти штук и за неделю не было ни одной продажи, то виртуальная таблица по этому товару за эту неделю выдаст лишь одну запись за понедельник, которая будет отражать остатки на начало и конец дня, приход (+5), расход (0) и оборот (0).

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

Первая подзадача решается довольно просто. Создаем таблицу значений с колонкой Дата. Зная границы периода, в цикле заполняем таблицу датами на каждый день.

Получившуюся таблицу значений помещаем во временную таблицу запроса с последующим выводом содержимого временной таблицы через основной запрос.

В результате выполнения запроса получим даты на каждый день, что нам и нужно было. Так же на просторах интернета можно найти получение дат на каждый день только одним запросом, не прибегая к написанию дополнительного программного кода, но это уже больше отдельная тема для обсуждения. Если же в конфигурации имеется регистр сведений, который хранит какие-то данные на каждый день, то смело можно использовать его и задача упрощается до обычной выборки дат из этого регистра.

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

1с остатки и обороты на каждый день в запросе
Рисунок 1. Остатки и обороты по товару «Стол дуб.» за 2015 год

А вот и самое интересное, решение третьей подзадачи. Соединяем таблицы первой и второй подзадачи таким образом, что бы в результате каждому дню соответствовал необходимый период остатков и оборотов, результат помещаем во временную таблицу (см. рисунок 2).

1с остатки и обороты на каждый день в запросе
Рисунок 2. Промежуточная таблица с ключом соединения по товару и периоду

Полученную временную таблицу соединяем с таблицей второй подзадачи по составному ключу , на поля выборки НачальныйОстаток, КонечныйОстаток, Приход, Расход и Оборот накладываем условие по периоду остатков и оборотов для правильного расчета значений (см. последний запрос в пакете запросов), в итоге получаем остатки и обороты на каждый день.

Конечный текст пакета запросов:

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

Источник

Остатки на каждый день в запросе

Запрос формирует остатки товаров на каждый день в пределах выбранного периода.

(9) Прогнал запрос у себя. Да есть такое дело. Решение Вы уже описали. Если нужны остатки взаиморасчетов по дням например с 2.01.2017 по 1.27.2017 тогда параметр НачалоПериода устанавливаем на конец предыдущего дня, то есть 1.01.2017 23:59:59. В таком случае в результирующей таблице мы будем видеть корректные остатки начиная с 2.01.2017.

Это конечно не глюк, скорее специфика работы системы. Я когда-то разбирался, пытался понять из-за чего так происходит. Если память мне не изменяет, то такое поведение образуется из-за

Остаток на каждый месяц по счету 02 для бух корп

ни запрос из статьи ни запрос из (18) не работают в случае отсутствия товара на остатках на НачалоПериода, но его появления на остатках потом. Такой возможностью не стоит пренебрегать

вот вроде рабочий запрос

таким же образом (казалось бы!) можно получить и Начальный остаток. и Приход/ Расход
но тут есть свои подводные камни.

1-ый далеко НЕ во всех конфигурациях есть РегистрСведений.РегламентированныйПроизводственныйКалендарь
«легко» заменяем на Таблицу Значений. не забывая определить тип поля и правильно посчитав число нужных дней!

2-ой Совсем не такие условия нужны для Начального остатка. помучаться придётся. чтоб ещё 2-ое условие добавить

3-ий остатки и движения по Товарам на складах (о ужас!) не всегда совпадают с движениями по Партиям товаров на складах, а нам, например, надо сравнивать эти движения с Продажами и Поступлениями!
(при ордерной схеме, как «обычно» и бывает у многих, Закупка и Продажи НЕ совпадают с движением по складу!)

Источник

Запрос для получения остатков по дням даже если не было движений

ПериодНоменклатураКоличество
01.05.2016Товар 014
11.05.2016Товар 013
16.05.2016Товар 012
31.05.2016Товар 012

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

ПериодНоменклатураКоличество
01.05.2016Товар 014
02.05.2016Товар 014
03.05.2016Товар 014
04.05.2016Товар 014
05.05.2016Товар 014
06.05.2016Товар 014
07.05.2016Товар 014
08.05.2016Товар 014
09.05.2016Товар 014
10.05.2016Товар 014
11.05.2016Товар 013
12.05.2016Товар 013
13.05.2016Товар 013
14.05.2016Товар 013
15.05.2016Товар 013
16.05.2016Товар 012
17.05.2016Товар 012
18.05.2016Товар 012
19.05.2016Товар 012
20.05.2016Товар 012
21.05.2016Товар 012
22.05.2016Товар 012
23.05.2016Товар 012
24.05.2016Товар 012
25.05.2016Товар 012
26.05.2016Товар 012
27.05.2016Товар 012
28.05.2016Товар 012
29.05.2016Товар 012
30.05.2016Товар 012
31.05.2016Товар 012

Посмотрим как мы можем это получить. Вот текст самого запроса:

2. Получаем таблицу номенклатуры из справочника (чтобы выводить в результат даже ту номенклатуру, по которой записей в регистре отродясь не было);

НоменклатураПериод (таблица периодов)Период (таблица регистра)
Товар 0115.05.201601.05.2016
Товар 0115.05.201611.05.2016
НоменклатураПериод (таблица периодов)Период (таблица регистра)
Товар 0115.05.201611.05.2016

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *