Задача по 1С - в базе данных есть таблица движения товара, пишем запрос для определения среднего значения остатка товара

01.03.22

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

В базе данных есть таблица движения товара, плюс означает, что товар пришел на склад, минус означает, что товар выбыл со склада: Необходимо написать запрос на 1С или SQL (по желанию), который вернет среднее значение остатка товара за январь 2021 (с 1 по 31). В результате должно получиться ProdID 1 = 1.58 ProdID 2 = 0.77

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

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

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

В параметрах таблица как на картинке и ДатаОкончания - 31.01.2022

 

Сам запрос:

ВЫБРАТЬ
	ТаблицаДвижений.ProdiD КАК ProdiD,
	ТаблицаДвижений.Количество КАК Количество,
	ТаблицаДвижений.cDate КАК cDate
ПОМЕСТИТЬ ТабДвижений
ИЗ
	&ТаблицаДвижений КАК ТаблицаДвижений
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ТабДвижений.ProdiD КАК ProdiD,
	ТабДвижений.Количество КАК Количество,
	ТабДвижений.cDate КАК cDate,
	СУММА(ТабДвижений1.Количество) КАК Количество1
ПОМЕСТИТЬ ОстатокНаКонецДня
ИЗ
	ТабДвижений КАК ТабДвижений
		ЛЕВОЕ СОЕДИНЕНИЕ ТабДвижений КАК ТабДвижений1
		ПО ТабДвижений.cDate >= ТабДвижений1.cDate
			И ТабДвижений.ProdiD = ТабДвижений1.ProdiD

СГРУППИРОВАТЬ ПО
	ТабДвижений.ProdiD,
	ТабДвижений.Количество,
	ТабДвижений.cDate
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ОстатокНаКонецДня.ProdiD КАК ProdiD,
	ОстатокНаКонецДня.cDate КАК cDate,
	ОстатокНаКонецДня.Количество1 КАК Количество1
ПОМЕСТИТЬ НомерДняВр
ИЗ
	ОстатокНаКонецДня КАК ОстатокНаКонецДня
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	НомерДняВр.ProdiD КАК ProdiD,
	&ДатаОкончания КАК ДатаОкончания
ПОМЕСТИТЬ КонецМесяца
ИЗ
	НомерДняВр КАК НомерДняВр
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	НомерДняВр.ProdiD КАК ProdiD,
	НомерДняВр.cDate КАК cDate,
	НомерДняВр.Количество1 КАК Количество
ПОМЕСТИТЬ ДвиженияПлюсКонецМесяца
ИЗ
	НомерДняВр КАК НомерДняВр

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ РАЗЛИЧНЫЕ
	КонецМесяца.ProdiD,
	КонецМесяца.ДатаОкончания,
	0
ИЗ
	КонецМесяца КАК КонецМесяца
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ДвиженияПлюсКонецМесяца.ProdiD КАК ProdiD,
	ДвиженияПлюсКонецМесяца.cDate КАК cDate,
	ДвиженияПлюсКонецМесяца.Количество КАК Количество,
	ДЕНЬ(ДвиженияПлюсКонецМесяца.cDate) КАК День
ПОМЕСТИТЬ НомерДня
ИЗ
	ДвиженияПлюсКонецМесяца КАК ДвиженияПлюсКонецМесяца
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	НомерДня.ProdiD КАК ProdiD,
	НомерДня.cDate КАК cDate,
	НомерДня.Количество КАК Количество,
	НомерДня.День КАК День,
	КОЛИЧЕСТВО(НомерДня1.cDate) КАК Номер
ПОМЕСТИТЬ НумерацияСтрок
ИЗ
	НомерДня КАК НомерДня
		ЛЕВОЕ СОЕДИНЕНИЕ НомерДня КАК НомерДня1
		ПО НомерДня.cDate >= НомерДня1.cDate
			И НомерДня.ProdiD = НомерДня1.ProdiD

СГРУППИРОВАТЬ ПО
	НомерДня.ProdiD,
	НомерДня.cDate,
	НомерДня.Количество,
	НомерДня.День
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	НумерацияСтрок.ProdiD КАК ProdiD,
	НумерацияСтрок.cDate КАК cDate,
	НумерацияСтрок.Количество КАК Количество,
	НумерацияСтрок.День КАК День,
	НумерацияСтрок.Номер КАК Номер,
	НумерацияСтрок1.День КАК День1,
	ВЫБОР
		КОГДА НЕ НумерацияСтрок1.День ЕСТЬ NULL
			ТОГДА ВЫБОР
					КОГДА НумерацияСтрок1.День = ДЕНЬ(&ДатаОкончания)
						ТОГДА НумерацияСтрок1.День - НумерацияСтрок.День + 1
					ИНАЧЕ НумерацияСтрок1.День - НумерацияСтрок.День
				КОНЕЦ
		ИНАЧЕ 0
	КОНЕЦ КАК КолДнейПериодОстатка
ПОМЕСТИТЬ ВрТч
ИЗ
	НумерацияСтрок КАК НумерацияСтрок
		ЛЕВОЕ СОЕДИНЕНИЕ НумерацияСтрок КАК НумерацияСтрок1
		ПО (НумерацияСтрок.Номер = НумерацияСтрок1.Номер - 1)
			И НумерацияСтрок.ProdiD = НумерацияСтрок1.ProdiD

СГРУППИРОВАТЬ ПО
	НумерацияСтрок.ProdiD,
	НумерацияСтрок.cDate,
	НумерацияСтрок.Количество,
	НумерацияСтрок.День,
	НумерацияСтрок.Номер,
	НумерацияСтрок1.День
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВрТч.ProdiD КАК ProdiD,
	ВрТч.cDate КАК cDate,
	ВрТч.Количество КАК Количество,
	ВрТч.День КАК День,
	ВрТч.Номер КАК Номер,
	ВрТч.День1 КАК День1,
	ВрТч.КолДнейПериодОстатка КАК КолДнейПериодОстатка,
	ВЫБОР
		КОГДА ВрТч.КолДнейПериодОстатка > 0
				И ВрТч.Количество > 0
			ТОГДА ВрТч.КолДнейПериодОстатка * ВрТч.Количество
		ИНАЧЕ 0
	КОНЕЦ КАК СуммаОстаткаПоПериоду
ПОМЕСТИТЬ ИтоговыеДанные
ИЗ
	ВрТч КАК ВрТч
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ИтоговыеДанные.ProdiD КАК ProdiD,
	СУММА(ИтоговыеДанные.СуммаОстаткаПоПериоду) КАК СуммаОстаткаПоПериоду
ПОМЕСТИТЬ СуммировалОстатки
ИЗ
	ИтоговыеДанные КАК ИтоговыеДанные

СГРУППИРОВАТЬ ПО
	ИтоговыеДанные.ProdiD
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СуммировалОстатки.ProdiD КАК ProdiD,
	СуммировалОстатки.СуммаОстаткаПоПериоду КАК СуммаОстаткаПоПериоду,
	ВЫРАЗИТЬ(СуммировалОстатки.СуммаОстаткаПоПериоду / ДЕНЬ(&ДатаОкончания) КАК ЧИСЛО(15, 2)) КАК aCount
ИЗ
	СуммировалОстатки КАК СуммировалОстатки

 

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

См. также

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    128567    694    389    

744

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

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

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

11.04.2024    2568    andrey_sag    10    

31

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6236    KawaNoNeko    23    

26

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2255    2    Yashazz    0    

31

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

15.01.2024    6983    32    mkalimulin    32    

53

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1993    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Запросы Россия Абонемент ($m)

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3453    52    DrZombi    54    

21

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5767    user1923546    26    

46
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1559647 23.08.22 23:56 Сейчас в теме
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ТабДвижений.ProdId КАК ProdiD,
	ТабДвижений.Count КАК Count,
	ТабДвижений.cDate КАК cDate,
	СУММА(ТабДвижений1.Count) КАК Count1
ПОМЕСТИТЬ ОстаткиНаКонецДня
ИЗ
	РегистрСведений.ТаблицаДвижений КАК ТабДвижений
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТаблицаДвижений КАК ТабДвижений1
			ПО ТабДвижений.cDate >= ТабДвижений1.cDate
				И ТабДвижений.ProdId = ТабДвижений1.ProdId
		
СГРУППИРОВАТЬ ПО
	ТабДвижений.ProdId,
	ТабДвижений.Count,
	ТабДвижений.cDate
	;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ОстаткиНаКонецДня.ProdiD КАК ProdiD,
	Сумма(Выразить(ОстаткиНаКонецДня.Count1 * РазностьДат(ОстаткиНаКонецДня.cDate, ЕстьNull(ОстаткиНаКонецДня1.cDate, ДобавитьКДате(&ДатаКон, ДЕНЬ, 1)), ДЕНЬ)/День(&ДатаКон) КАК Число(10, 3))) КАК aCount	
ИЗ
	ОстаткиНаКонецДня КАК ОстаткиНаКонецДня
        Левое Соединение ОстаткиНаКонецДня КАК ОстаткиНаКонецДня1
        ПО ОстаткиНаКонецДня.ProdiD = ОстаткиНаКонецДня1.ProdiD
        И ОстаткиНаКонецДня.cDate < ОстаткиНаКонецДня1.cDate 
Сгруппировать По
 ОстаткиНаКонецДня.ProdID 
        
;
Показать



Создал непереодический регистр сведений ТаблицаДвижений с измерениями cDate и ProdId и ресурсом Count и занес туда условие задачи
user622095_admin; +1 Ответить
2. Greamdevil 6 24.08.22 04:59 Сейчас в теме
дак само собой на регистрах все просто, суть в том что регистрами нельзя пользоваться :)
3. user1559647 24.08.22 23:05 Сейчас в теме
(2) а что я использовал из возможностей регистров? никаких срезов, только основная таблица, даже регистр непериодический
4. pvlunegov 157 09.03.23 10:24 Сейчас в теме
Зачем такие сложные запросы?
Вполне достаточно очень простого запроса:
ВЫБРАТЬ
	ДвиженияТовара.cDate,
	ДвиженияТовара.ProdID,
	ДвиженияТовара.Count
ПОМЕСТИТЬ ТаблицаДвиженийТоваров
ИЗ
	&ДвиженияТовара КАК ДвиженияТовара
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	КОНЕЦПЕРИОДА(ТаблицаДвиженийТоваров.cDate, МЕСЯЦ) КАК КонецМесяца,
	ТаблицаДвиженийТоваров.ProdID КАК ID_Товара,
	СУММА(ТаблицаДвиженийТоваров.Count) КАК Количество
ИЗ
	ТаблицаДвиженийТоваров КАК ТаблицаДвиженийТоваров

СГРУППИРОВАТЬ ПО
	ТаблицаДвиженийТоваров.ProdID,
	КОНЕЦПЕРИОДА(ТаблицаДвиженийТоваров.cDate, МЕСЯЦ)
Показать


группировка дат из первой таблицы помесячно, по ID товара. суммируем все записи таблицы по группировкам (конец месяца, ID товара). Получим суммы движений товаров (остаток) на конец каждого месяца.
В последней таблице дополнительно наложил условие на то, что месяц = январь (номер месяца = 1)
5. user1647484 9 17.03.23 10:45 Сейчас в теме
как не старался посчитать, но получаю результаты ProdID1 = 1 ProdID2 = 0.5
6. mrGREYka 6 20.02.24 12:56 Сейчас в теме
DECLARE @startDate DATE	= '2021-01-01';
DECLARE @endDate DATE	= '2021-01-31';

IF EXISTS( Sel ect ID fr om tempdb..sysobjects  where id = OBJECT_ID( 'tempdb..' + LTRIM( RTRIM( '#all_day_of_month' ) ) ) )
	BEGIN
		DR OP   TABLE #all_day_of_month;
	END


SEL ECT [Date] = DATEADD(Day,Number,@startDate) 
INTO
	#all_day_of_month
FROM  master..spt_values 
WH ERE Type='P'
AND DATEADD(day,Number,@startDate) <= @endDate;

DECLARE @count_day_of_month INT = ( SELECT COUNT(*) FR OM #all_day_of_month );

SELECT 
	remains.[ProdID] AS ProdID
	,CONVERT( numeric(10,2),( SUM( remains.[Count] ) / @count_day_of_month ) ) AS aCount
FR OM 
	#all_day_of_month AS all_day_of_month
JOIN
	[dbo].[remains] AS remains
		ON remains.cDate <= all_day_of_month.[Date]
GROUP BY
	remains.[ProdID];
Показать
Прикрепленные файлы:
Оставьте свое сообщение