1с остатки по дням запросом

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

ПериодНоменклатураКоличество
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

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

Источник

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

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

01.01.2011 120
02.01.2011 120
03.01.2011 0
04.01.2011 0
05.01.2011 50
.
31.01.2011 32

А вообще нужно еще остаток на первую и последнюю дату в выборке поделить пополам, это возможно?
Если нет, то хотя бы просто остатки в таком вот виде выдернуть.

Используй ОстаткиИОбороты, в параметрах виртуальной таблицы поставь «День», как остатки бери «КонечныйОстаток».
Что-то вроде этого:

А можно пример запроса?

(5)Там на примере СКД, а мне в запросе это получить надо по каждой номенклатуре для дальнейшей обработки

Если в запросе, то тоже есть вариант, примерно так:

А средние запасы в указанной обработке расчитаны иначе, чем мне нужно, насколько я понимаю. Вот выдержка из моего ТЗ:

«Правильная формула для подсчета среднего товарного запаса такая:

n – количество дат в периоде.»

Из за этого и весь сыр-бор.

(12)
Если я правильно понял смысл формулы,то он в том, что при усреднении остатков по периодам внутри интервала мы усредняем не остатки на конец каждого периода,а среднее остатков на начало и конец каждого периода. То есть мы не можем решить, что есть остаток для, например,заданного дня: остаток на начало дня или остаток на конец дня. Поэтому остатком считаем среднее остатка на начало и конец. Отсюда и следует предложенная формула. Для выкладок и написания запроса ее удобнее записать так:

= So*n + Сумма по i=1,n Di*(n+1/2-i).

Разделив на n, получим

В итоге запрос должен выглядеть так:

Конечно, желательно все еще раз проверить и протестировать на проверяемых вручную данных.

Источник

Запрос по остаткам регистра накопления на каждый день

Отсюда можно взять очень полезный запрос с календариком » Работаем с датами в запросе «.

(7) ildarovich, Вы поторопились группировать по номенклатуре, ведь движение на дату может быть null, запрос топикастера более верный. Но он не учитывает варианта, когда товар вообще появился на складе после начала периода, во-вторых, остатки обачно нужны на конец дня, а не начало, в этом случае поможет отнимание оборотов от конечного остатка(&КонецПериода оканчивается на 23:59:59):

ВЫБРАТЬ
ТоварыНаСкладах2Обороты.Период,
-ТоварыНаСкладах2Обороты.КоличествоОборот КАК КоличествоОборот,
ТоварыНаСкладах2Обороты.Номенклатура
ПОМЕСТИТЬ Движения
ИЗ
РегистрНакопления.ПартииНоменклатуры.Обороты(
&НачалоПериода,
&КонецПериода,
День,
Номенклатура = &ном
И склад = &склад) КАК ТоварыНаСкладах2Обороты

//////////////////////////////////////////////////////////// ­////////////////////
ВЫБРАТЬ
Дни.Период КАК Период,
Движения.Номенклатура КАК Номенклатура,
СУММА(Движения.КоличествоОборот) КАК КоличествоОстаток
ИЗ
тДаты КАК Дни
ЛЕВОЕ СОЕДИНЕНИЕ Движения КАК Движения
ПО (Движения.Период > Дни.Период)

СГРУППИРОВАТЬ ПО
Дни.Период,
Движения.Номенклатура

. здесь также есть недостатки. Окончательный вариант приведен в комментарии (14)

(14) Да, классно, конечно!

Но мне понадобилось выбрать и начальный, и обороты (и приход, и расход) и конечный. Выкрутился так, в подчиненном запросе все кроме начальных остатков, по приниципу как в 14-м комменте у ildarovich, а уже из подчиненного по конечному и обороту вычисляю начальный в «верхнем» запросе, т.е. так:

Но может можно красивее или еще какую критику кто-то выскажет?

(14)
Если в РН по отборам будет пусто. Итоговая таблица тоже будет пустая.

Чуть модифицировал (16) для случая, когда периоды нам нужны исключительно до указанной даты. Так же в запросе добавил выборку регистраторов, которые двигали указанную номенклатуру в пределах дня:

(32) Не много по другому сделал

ВЫБРАТЬ
0 КАК Р
ПОМЕСТИТЬ Разряды

//////////////////////////////////////////////////////////// ­­////////////////////
ВЫБРАТЬ
ТаблицаДат.Период КАК ТДПериод,
МАКСИМУМ(ВТ_Остатки.Период) КАК ПериодРО,
ВТ_Остатки.Номенклатура
ПОМЕСТИТЬ ВТ_БлижайшиеДатыОстатков
ИЗ
ТаблицаДат КАК ТаблицаДат
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
ПО ТаблицаДат.Период >= ВТ_Остатки.Период

СГРУППИРОВАТЬ ПО
ТаблицаДат.Период,
ВТ_Остатки.Номенклатура
;

//////////////////////////////////////////////////////////// ­­////////////////////
ВЫБРАТЬ
ВТ_БлижайшиеДатыОстатков.ТДПериод КАК ТДПериод,
ВТ_Остатки.Номенклатура,
ВЫБОР
КОГДА ТДПериод = ВТ_Остатки.Период
ТОГДА ВТ_Остатки.КоличествоНачальныйОстаток
ИНАЧЕ КоличествоКонечныйОстаток
КОНЕЦ КАК КоличествоНачальныйОстаток,
ВЫБОР
КОГДА ТДПериод = ВТ_Остатки.Период
ТОГДА ВТ_Остатки.КоличествоПриход
ИНАЧЕ 0
КОНЕЦ КАК КоличествоПриход,
ВЫБОР
КОГДА ТДПериод = ВТ_Остатки.Период
ТОГДА ВТ_Остатки.КоличествоРасход
ИНАЧЕ 0
КОНЕЦ КАК КоличествоРасход, ВТ_Остатки.КоличествоКонечныйОстаток,
ТоварыНаСкладахОбороты.Регистратор
ИЗ
ВТ_БлижайшиеДатыОстатков КАК ВТ_БлижайшиеДатыОстатков
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)
ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура

Источник

АйТиБложик

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Как получить остатки на каждый день по регистру накопления?

Как Вы обычно решаете эту проблему?

(1) barm, Подобный запрос, для получения остатков на каждый день, для бухгалтерии, смысл, я думаю, уловите:

ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Период,
ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстатокКт,
ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйОстатокКт,
ХозрасчетныйОстаткиИОбороты.Валюта,
ХозрасчетныйОстаткиИОбороты.Субконто1,
ХозрасчетныйОстаткиИОбороты.Субконто2,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокКт
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
&ДатаНачала,
&ДатаОкончания,
День,
ДвиженияИГраницыПериода,
Счет В ИЕРАРХИИ (&Счет),
,
Субконто1 = &Контрагент
И Субконто2 = &Договор
И Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
;

X
ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
ВложенныйЗапрос.Субконто1,
ВложенныйЗапрос.Субконто2,
ВложенныйЗапрос.Валюта
ПОМЕСТИТЬ ВТ_Календарь
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь,
(ВЫБРАТЬ
ВТ_Остатки.Субконто1 КАК Субконто1,
ВТ_Остатки.Субконто2 КАК Субконто2,
ВТ_Остатки.Валюта КАК Валюта
ИЗ
ВТ_Остатки КАК ВТ_Остатки

СГРУППИРОВАТЬ ПО
ВТ_Остатки.Субконто1,
ВТ_Остатки.Субконто2,
ВТ_Остатки.Валюта) КАК ВложенныйЗапрос
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания
;

X
ВЫБРАТЬ
ВложенныйЗапрос.Субконто1 КАК Контрагент,
ВложенныйЗапрос.Субконто2 КАК Договор,
ВложенныйЗапрос.Дата КАК Дата,
ЕСТЬNULL(ВТ_Остатки.ВалютнаяСуммаНачальныйОстатокДт, 0) КАК ВалютныйОстатокНачалоДт,
ЕСТЬNULL(ВТ_Остатки.ВалютнаяСуммаНачальныйОстатокКт, 0) КАК ВалютныйОстатокНачалоКт,
ЕСТЬNULL(ВТ_Остатки1.ВалютнаяСуммаКонечныйОстатокДт, 0) КАК ВалютныйОстатокКонецДт,
ЕСТЬNULL(ВТ_Остатки1.ВалютнаяСуммаКонечныйОстатокКт, 0) КАК ВалютныйОстатокКонецКт,
ЕСТЬNULL(ВТ_Остатки.СуммаНачальныйОстатокДт, 0) КАК РублевыйОстатокНачалоДт,
ЕСТЬNULL(ВТ_Остатки.СуммаНачальныйОстатокКт, 0) КАК РублевыйОстатокНачалоКт,
ЕСТЬNULL(ВТ_Остатки1.СуммаКонечныйОстатокДт, 0) КАК РублевыйОстатокКонецДт,
ЕСТЬNULL(ВТ_Остатки1.СуммаКонечныйОстатокКт, 0) КАК РублевыйОстатокКонецКт
ИЗ
(ВЫБРАТЬ
МИНИМУМ(ВТ_Остатки.Период) КАК ПериодНач,
МАКСИМУМ(ВТ_Остатки1.Период) КАК ПериодКон,
ВТ_Календарь.ДатаКалендаря КАК Дата,
ВТ_Календарь.Субконто1 КАК Субконто1,
ПРЕДСТАВЛЕНИЕ(ВТ_Календарь.Субконто1) КАК Субконто1Представление,
ВТ_Календарь.Субконто2 КАК Субконто2,
ПРЕДСТАВЛЕНИЕ(ВТ_Календарь.Субконто2) КАК Субконто2Представление,
ВТ_Календарь.Валюта КАК Валюта,
ПРЕДСТАВЛЕНИЕ(ВТ_Календарь.Валюта) КАК ВалютаПредставление
ИЗ
ВТ_Календарь КАК ВТ_Календарь
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
ПО ВТ_Календарь.ДатаКалендаря = ВТ_Остатки1.Период
И ВТ_Календарь.Субконто2 >= ВТ_Остатки1.Субконто2

СГРУППИРОВАТЬ ПО
ВТ_Календарь.ДатаКалендаря,
ВТ_Календарь.Субконто1,
ВТ_Календарь.Субконто2,
ВТ_Календарь.Валюта) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
ПО ВложенныйЗапрос.ПериодНач = ВТ_Остатки.Период
И ВложенныйЗапрос.Субконто2 = ВТ_Остатки.Субконто2
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки1
ПО ВложенныйЗапрос.ПериодКон = ВТ_Остатки1.Период
И ВложенныйЗапрос.Субконто2 = ВТ_Остатки1.Субконто2

УПОРЯДОЧИТЬ ПО
Контрагент,
Договор,
Дата

Источник

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

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