analytics/sql_db_mag_pbi/mag_pbi_procedures.sql
Андрей Лебедев 26c6ca5ea5 Update SQL schema from mag_pbi
2026-03-03 11:15:13 +00:00

11753 lines
482 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

USE [mag_pbi]
GO
/****** Object: StoredProcedure [analytics].[create_forecast_loop] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [analytics].[create_forecast_loop] as begin
--запускать только при изменении дат внутри процедуры
--EXEC [analytics].[sp_fill_seasonality_groups_summ_1];
DECLARE @from_month DATE = '2025-11-01'--DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
DECLARE @to_month_excl DATE = '2028-01-01';
DECLARE @scenario_id INT = 4;
DECLARE @path NVARCHAR(255);
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
SELECT [path]
FROM [pbi].[groups] g
WHERE [lvl] = 2
AND g.[path] NOT LIKE '*%' -- (опционально) исключить служебные группы
/*AND (
g.[path] LIKE N'Р%' OR
g.[path] LIKE N'С%' OR
g.[path] LIKE N'Т%' OR
g.[path] LIKE N'У%' OR
g.[path] LIKE N'Ф%' OR
g.[path] LIKE N'Х%' OR
g.[path] LIKE N'Ц%' OR
g.[path] LIKE N'Ч%' OR
g.[path] LIKE N'Ш%' OR
g.[path] LIKE N'Щ%' OR
g.[path] LIKE N'Э%' OR
g.[path] LIKE N'Ю%' OR
g.[path] LIKE N'Я%'
)*/
ORDER BY [path];
OPEN cur;
FETCH NEXT FROM cur INTO @path;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT CONCAT('Rebuild forecast for: ', @path);
EXEC [analytics].[sp_build_forecast_s4_by_group]
@path = @path,
@from_month = @from_month,
@to_month_excl = @to_month_excl,
@scenario_id = @scenario_id;
FETCH NEXT FROM cur INTO @path;
END
CLOSE cur;
DEALLOCATE cur;
END
GO
/****** Object: StoredProcedure [analytics].[create_seasonality_groups] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE analytics.[create_seasonality_groups] as
BEGIN
/* 1) Таблица результата */
IF NOT EXISTS (
SELECT 1
FROM sys.tables t
JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE s.name = 'analytics' AND t.name = 'seasonality_groups'
)
BEGIN
CREATE TABLE [analytics].[seasonality_groups](
[group_1c_id] BINARY(16) NOT NULL,
[month] TINYINT NOT NULL, -- 1..12
[seasonal_koef] DECIMAL(18,6) NOT NULL,
CONSTRAINT [PK_seasonality_groups] PRIMARY KEY ([group_1c_id], [month])
);
CREATE INDEX [IX_seasonality_groups_month]
ON [analytics].[seasonality_groups]([month]);
END
TRUNCATE TABLE [analytics].[seasonality_groups];
/* 2) Пересчёт коэффициентов сезонности для g и g1 */
;WITH
-- Продажи по товарам за последние 24 месяца (кол-во)
[base_sales] AS (
SELECT
[n].[1c_id] AS [sku_1c_id],
[gcur].[g],
[gcur].[g1],
[v].[Период] AS [dt],
CAST([v].[Количество] AS DECIMAL(18,6)) AS [qty]
FROM [mag_pbi].[pbiProd].[СводныйСебестоимость Для PBI] AS [v]
JOIN [pbi].[nomenclature] AS [n]
ON [n].[1c_id] = [v].[1c_id]
LEFT JOIN [pbi].[groups] AS [gcur]
ON [gcur].[1c_id] = [n].[1c_group]
WHERE [v].[Статья] = N'Реализация'
AND [v].[Период] >= DATEADD(YEAR, -2, CAST(GETDATE() AS date))
),
-- Агрегация по месяцам и уровню g (lvl=0)
[lvl0_monthly] AS (
SELECT
[g0].[1c_id] AS [group_1c_id],
DATEFROMPARTS(YEAR([b].[dt]), MONTH([b].[dt]), 1) AS [month_start],
SUM([b].[qty]) AS [qty_m]
FROM [base_sales] AS [b]
JOIN [pbi].[groups] AS [g0]
ON [g0].[lvl] = 1
AND [g0].[g] = [b].[g]
GROUP BY [g0].[1c_id], DATEFROMPARTS(YEAR([b].[dt]), MONTH([b].[dt]), 1)
),
-- Агрегация по месяцам и уровню g1 (lvl=1)
[lvl1_monthly] AS (
SELECT
[g1].[1c_id] AS [group_1c_id],
DATEFROMPARTS(YEAR([b].[dt]), MONTH([b].[dt]), 1) AS [month_start],
SUM([b].[qty]) AS [qty_m]
FROM [base_sales] AS [b]
JOIN [pbi].[groups] AS [g1]
ON [g1].[lvl] = 2
AND [g1].[g1] = [b].[g1]
GROUP BY [g1].[1c_id], DATEFROMPARTS(YEAR([b].[dt]), MONTH([b].[dt]), 1)
),
-- Объединяем уровни
[monthly_union] AS (
SELECT * FROM [lvl0_monthly]
UNION ALL
SELECT * FROM [lvl1_monthly]
),
-- Средние по «месяцу года»
[per_moy] AS (
SELECT
[u].[group_1c_id],
MONTH([u].[month_start]) AS [month],
AVG([u].[qty_m]) AS [avg_qty_moy]
FROM [monthly_union] AS [u]
GROUP BY [u].[group_1c_id], MONTH([u].[month_start])
),
-- Общая средняя по группе
[overall] AS (
SELECT
[u].[group_1c_id],
AVG([u].[qty_m]) AS [overall_avg_monthly]
FROM [monthly_union] AS [u]
GROUP BY [u].[group_1c_id]
),
-- Черновой коэффициент
[raw_koef] AS (
SELECT
[p].[group_1c_id],
[p].[month],
CASE
WHEN [o].[overall_avg_monthly] = 0 THEN 0
ELSE [p].[avg_qty_moy] / [o].[overall_avg_monthly]
END AS [k_raw]
FROM [per_moy] AS [p]
JOIN [overall] AS [o]
ON [o].[group_1c_id] = [p].[group_1c_id]
),
[norm] AS (
SELECT
[r].[group_1c_id],
[r].[month],
[r].[k_raw] / NULLIF(AVG([r].[k_raw]) OVER (PARTITION BY [r].[group_1c_id]), 0) AS [seasonal_koef]
FROM [raw_koef] AS [r]
)
INSERT INTO [analytics].[seasonality_groups] ([group_1c_id], [month], [seasonal_koef])
SELECT [group_1c_id], [month], CAST([seasonal_koef] AS DECIMAL(18,6))
FROM [norm];
END
GO
/****** Object: StoredProcedure [analytics].[sp_build_deficit_proposal] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/* =======================================================================
[analytics].[sp_build_deficit_proposal]
— Дефицит и рекомендации к заказу с учётом:
• стартовых остатков (склад + МП),
• прихода из заказов (4 статуса, включая 'Согласован'),
• прогноза по сценарию,
НЕТ бэк-ордеров: спрос не «копится» ниже нуля,
остаток считается итеративно и не уходит в минус,
• размер заказа = прогноз окна [T .. T + @cover_months).
======================================================================= */
CREATE PROCEDURE [analytics].[sp_build_deficit_proposal]
@scenario_id INT = 4, -- ID сценария прогноза
@group_path NVARCHAR(255) = N'', -- path группы ('' = весь каталог)
@lead_time_m INT = 4, -- срок поставки (мес.)
@cover_months INT = 6, -- покрытие (мес.)
@from_month DATE = NULL, -- старт (1-е число месяца)
@to_month_excl DATE = '2028-01-01', -- полуинтервал [from, to)
@debug BIT = 0
AS
BEGIN
SET NOCOUNT ON;
/* 0) Чистим прошлые данные по сценарию */
DELETE FROM [analytics].[deficit_proposal] WHERE scenario_id = @scenario_id;
/* Нормализация параметров */
SET @group_path = LTRIM(RTRIM(REPLACE(@group_path, '''', N'')));
IF @from_month IS NULL
SET @from_month = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
/* 1) Календарь */
IF OBJECT_ID('tempdb..#cal') IS NOT NULL DROP TABLE #cal;
CREATE TABLE #cal (month_start DATE NOT NULL PRIMARY KEY);
;WITH cal AS (
SELECT @from_month AS month_start
UNION ALL
SELECT DATEADD(MONTH, 1, month_start)
FROM cal
WHERE month_start < DATEADD(MONTH, -1, @to_month_excl)
)
INSERT INTO #cal(month_start)
SELECT month_start FROM cal
OPTION (MAXRECURSION 32767);
/* 2) SKU по group_path */
IF OBJECT_ID('tempdb..#skus') IS NOT NULL DROP TABLE #skus;
CREATE TABLE #skus (
sku_1c_id BINARY(16) NOT NULL PRIMARY KEY,
code NVARCHAR(36) NULL,
minAvail DECIMAL(18,6) NULL
);
INSERT INTO #skus(sku_1c_id, code, minAvail)
SELECT n.[1c_id], n.[code], n.[minAvailableQty]
FROM [pbi].[nomenclature] n
JOIN [pbi].[groups] g ON g.[1c_id] = n.[1c_group]
WHERE g.[path] LIKE @group_path + N'%';
IF NOT EXISTS (SELECT 1 FROM #skus)
BEGIN
RAISERROR(N'По path=%s не найдено SKU.', 16, 1, @group_path);
RETURN;
END
/* 3) Прогноз по сценарию */
IF OBJECT_ID('tempdb..#fcast') IS NOT NULL DROP TABLE #fcast;
CREATE TABLE #fcast (
sku_1c_id BINARY(16) NOT NULL,
[month] DATE NOT NULL,
qty DECIMAL(18,3) NOT NULL,
PRIMARY KEY (sku_1c_id, [month])
);
INSERT INTO #fcast(sku_1c_id, [month], qty)
SELECT f.[1c_id], f.[month], f.[value]
FROM [analytics].[forecast] f
JOIN #skus s ON s.sku_1c_id = f.[1c_id]
WHERE f.[scenario_id] = @scenario_id
AND f.[month] >= @from_month
AND f.[month] < @to_month_excl;
/* 4) Приходы из заказов (по месяцам) */
IF OBJECT_ID('tempdb..#inb_status') IS NOT NULL DROP TABLE #inb_status;
CREATE TABLE #inb_status (
sku_1c_id BINARY(16) NOT NULL,
[month] DATE NOT NULL,
[status] NVARCHAR(100) NOT NULL,
units DECIMAL(18,3) NOT NULL,
PRIMARY KEY (sku_1c_id, [month], [status])
);
INSERT INTO #inb_status(sku_1c_id, [month], [status], units)
SELECT
s.sku_1c_id,
DATEFROMPARTS(TRY_CONVERT(INT, LEFT(o.[month], 4)),
TRY_CONVERT(INT, SUBSTRING(o.[month], 6, 2)), 1),
o.[status],
SUM(COALESCE(o.[units], 0.0))
FROM [analytics].[get_orders_by_group] o
JOIN #skus s ON s.code = o.[code]
WHERE o.[status] IN (N'В пути', N'В производстве', N'Выгружен на складе'/*, N'Согласован'*/)
AND TRY_CONVERT(INT, LEFT(o.[month], 4)) IS NOT NULL
AND TRY_CONVERT(INT, SUBSTRING(o.[month], 6, 2)) BETWEEN 1 AND 12
GROUP BY s.sku_1c_id,
DATEFROMPARTS(TRY_CONVERT(INT, LEFT(o.[month], 4)),
TRY_CONVERT(INT, SUBSTRING(o.[month], 6, 2)), 1),
o.[status];
IF OBJECT_ID('tempdb..#inb') IS NOT NULL DROP TABLE #inb;
CREATE TABLE #inb (
sku_1c_id BINARY(16) NOT NULL,
[month] DATE NOT NULL,
units DECIMAL(18,3) NOT NULL,
PRIMARY KEY (sku_1c_id, [month])
);
INSERT INTO #inb(sku_1c_id, [month], units)
SELECT sku_1c_id, [month], SUM(units)
FROM #inb_status
WHERE [month] >= @from_month AND [month] < @to_month_excl
GROUP BY sku_1c_id, [month];
/* 5) Стартовые остатки: склад + МП */
IF OBJECT_ID('tempdb..#stock_base') IS NOT NULL DROP TABLE #stock_base;
CREATE TABLE #stock_base (sku_1c_id BINARY(16) NOT NULL PRIMARY KEY, qty DECIMAL(18,3) NOT NULL);
INSERT INTO #stock_base(sku_1c_id, qty)
SELECT s.sku_1c_id, COALESCE(b.qty, 0.0)
FROM #skus s
LEFT JOIN (
SELECT code, SUM(COALESCE(quantity_base,0.0)) AS qty
FROM [analytics].[get_quantity_by_group]
GROUP BY code
) b ON b.code = s.code;
IF OBJECT_ID('tempdb..#stock_mp') IS NOT NULL DROP TABLE #stock_mp;
CREATE TABLE #stock_mp (sku_1c_id BINARY(16) NOT NULL PRIMARY KEY, qty DECIMAL(18,3) NOT NULL);
INSERT INTO #stock_mp(sku_1c_id, qty)
SELECT s.sku_1c_id, COALESCE(m.qty, 0.0)
FROM #skus s
LEFT JOIN (
SELECT code, SUM(COALESCE(quantity_base,0.0)) AS qty
FROM [analytics].[get_mp_quantity_by_group]
GROUP BY code
) m ON m.code = s.code;
IF OBJECT_ID('tempdb..#stock0') IS NOT NULL DROP TABLE #stock0;
CREATE TABLE #stock0 (sku_1c_id BINARY(16) NOT NULL PRIMARY KEY, qty DECIMAL(18,3) NOT NULL);
INSERT INTO #stock0(sku_1c_id, qty)
SELECT s.sku_1c_id, COALESCE(b.qty,0) + COALESCE(mp.qty,0)
FROM #skus s
LEFT JOIN #stock_base b ON b.sku_1c_id = s.sku_1c_id
LEFT JOIN #stock_mp mp ON mp.sku_1c_id = s.sku_1c_id;
/* 6) Лента (сырой спрос/приход) */
IF OBJECT_ID('tempdb..#tl') IS NOT NULL DROP TABLE #tl;
CREATE TABLE #tl (
sku_1c_id BINARY(16) NOT NULL,
[month] DATE NOT NULL,
demand_m DECIMAL(18,3) NOT NULL,
inb_m DECIMAL(18,3) NOT NULL,
cum_d DECIMAL(38,3) NULL, -- кумулятив обслуженного спроса
cum_i DECIMAL(38,3) NULL, -- кумулятив прихода
net_stock DECIMAL(38,3) NULL, -- итоговый остаток месяца (>=0)
served_m DECIMAL(18,3) NULL, -- обслуженный спрос в месяце
lost_m DECIMAL(18,3) NULL, -- потерянный спрос в месяце
PRIMARY KEY (sku_1c_id, [month])
);
INSERT INTO #tl(sku_1c_id, [month], demand_m, inb_m)
SELECT s.sku_1c_id, c.month_start,
COALESCE(f.qty, 0.0),
COALESCE(i.units, 0.0)
FROM #skus s
CROSS JOIN #cal c
LEFT JOIN #fcast f ON f.sku_1c_id = s.sku_1c_id AND f.[month] = c.month_start
LEFT JOIN #inb i ON i.sku_1c_id = s.sku_1c_id AND i.[month] = c.month_start;
/* 6.1) Пронумеруем месяцы (для рекурсивного расчёта без бэк-ордеров) */
IF OBJECT_ID('tempdb..#seq') IS NOT NULL DROP TABLE #seq;
CREATE TABLE #seq (
sku_1c_id BINARY(16) NOT NULL,
[month] DATE NOT NULL,
demand_m DECIMAL(18,3) NOT NULL,
inb_m DECIMAL(18,3) NOT NULL,
rn INT NOT NULL,
PRIMARY KEY (sku_1c_id, rn)
);
INSERT INTO #seq(sku_1c_id, [month], demand_m, inb_m, rn)
SELECT t.sku_1c_id, t.[month], t.demand_m, t.inb_m,
ROW_NUMBER() OVER (PARTITION BY t.sku_1c_id ORDER BY t.[month])
FROM #tl t;
/* 6.2) Рекурсивный расчёт: served/lost/net_stock (без накопления спроса ниже нуля) */
IF OBJECT_ID('tempdb..#flow') IS NOT NULL DROP TABLE #flow;
CREATE TABLE #flow(
sku_1c_id BINARY(16) NOT NULL,
rn INT NOT NULL,
[month] DATE NOT NULL,
demand_m DECIMAL(18,3) NOT NULL,
inb_m DECIMAL(18,3) NOT NULL,
served_m DECIMAL(18,3) NOT NULL,
lost_m DECIMAL(18,3) NOT NULL,
net_stock DECIMAL(38,3) NOT NULL,
PRIMARY KEY (sku_1c_id, rn)
);
;WITH r AS (
/* первый месяц */
SELECT
s.sku_1c_id, s.rn, s.[month], s.demand_m, s.inb_m,
CAST(
CASE WHEN st.qty + s.inb_m >= s.demand_m
THEN s.demand_m
ELSE st.qty + s.inb_m
END
AS DECIMAL(18,3)) AS served_m,
CAST(
CASE WHEN st.qty + s.inb_m >= s.demand_m
THEN 0.0
ELSE s.demand_m - (st.qty + s.inb_m)
END
AS DECIMAL(18,3)) AS lost_m,
CAST(
CASE WHEN st.qty + s.inb_m - s.demand_m < 0
THEN 0
ELSE st.qty + s.inb_m - s.demand_m
END
AS DECIMAL(38,3)) AS net_stock
FROM #seq s
JOIN #stock0 st ON st.sku_1c_id = s.sku_1c_id
WHERE s.rn = 1
UNION ALL
/* последующие месяцы */
SELECT
s.sku_1c_id, s.rn, s.[month], s.demand_m, s.inb_m,
CAST(
CASE WHEN r.net_stock + s.inb_m >= s.demand_m
THEN s.demand_m
ELSE r.net_stock + s.inb_m
END
AS DECIMAL(18,3)) AS served_m,
CAST(
CASE WHEN r.net_stock + s.inb_m >= s.demand_m
THEN 0.0
ELSE s.demand_m - (r.net_stock + s.inb_m)
END
AS DECIMAL(18,3)) AS lost_m,
CAST(
CASE WHEN r.net_stock + s.inb_m - s.demand_m < 0
THEN 0
ELSE r.net_stock + s.inb_m - s.demand_m
END
AS DECIMAL(38,3)) AS net_stock
FROM r
JOIN #seq s
ON s.sku_1c_id = r.sku_1c_id
AND s.rn = r.rn + 1
)
INSERT INTO #flow
SELECT * FROM r
OPTION (MAXRECURSION 32767);
/* 6.3) Обновим #tl: кумулятивы по обслуженному спросу/приходу и итоговый остаток */
;WITH cd AS (
SELECT f.sku_1c_id, s.[month],
SUM(f.served_m) OVER (PARTITION BY f.sku_1c_id ORDER BY f.rn ROWS UNBOUNDED PRECEDING) AS cum_d_served,
SUM(s.inb_m) OVER (PARTITION BY s.sku_1c_id ORDER BY s.rn ROWS UNBOUNDED PRECEDING) AS cum_i_raw,
f.net_stock, f.served_m, f.lost_m
FROM #flow f
JOIN #seq s ON s.sku_1c_id = f.sku_1c_id AND s.rn = f.rn
)
UPDATE t
SET t.cum_d = cd.cum_d_served,
t.cum_i = cd.cum_i_raw,
t.net_stock = cd.net_stock,
t.served_m = cd.served_m,
t.lost_m = cd.lost_m
FROM #tl t
JOIN cd ON cd.sku_1c_id = t.sku_1c_id AND cd.[month] = t.[month];
/* 7) Первый месяц дефицита T (учитываем lead_time) */
DECLARE @start_T DATE =
DATEFROMPARTS(YEAR(DATEADD(MONTH, @lead_time_m, @from_month)),
MONTH(DATEADD(MONTH, @lead_time_m, @from_month)), 1);
IF OBJECT_ID('tempdb..#first_def') IS NOT NULL DROP TABLE #first_def;
CREATE TABLE #first_def (sku_1c_id BINARY(16) NOT NULL PRIMARY KEY, T DATE NULL);
INSERT INTO #first_def(sku_1c_id, T)
SELECT d.sku_1c_id, MIN(d.[month]) AS T
FROM (
SELECT t.sku_1c_id, t.[month]
FROM #tl t
JOIN #skus s ON s.sku_1c_id = t.sku_1c_id
WHERE t.net_stock < COALESCE(s.minAvail, 0.0)
AND t.[month] >= @start_T
) d
GROUP BY d.sku_1c_id;
/* 8) Якоря: T, T+C, T+2C ... */
IF OBJECT_ID('tempdb..#anchors') IS NOT NULL DROP TABLE #anchors;
CREATE TABLE #anchors (
sku_1c_id BINARY(16) NOT NULL,
T DATE NOT NULL,
PRIMARY KEY (sku_1c_id, T)
);
;WITH recur AS (
SELECT fd.sku_1c_id, fd.T
FROM #first_def fd
WHERE fd.T IS NOT NULL
UNION ALL
SELECT r.sku_1c_id, DATEADD(MONTH, @cover_months, r.T)
FROM recur r
WHERE DATEADD(MONTH, @cover_months, r.T) < @to_month_excl
)
INSERT INTO #anchors(sku_1c_id, T)
SELECT sku_1c_id, T
FROM recur
OPTION (MAXRECURSION 32767);
/* 9) Подготовка строк к вставке (размер заказа = прогноз окна) */
IF OBJECT_ID('tempdb..#rows_to_insert') IS NOT NULL DROP TABLE #rows_to_insert;
CREATE TABLE #rows_to_insert (
[scenario_id] INT,
[group_name] NVARCHAR(255),
[1c_id] BINARY(16),
[code] NVARCHAR(36),
[place_month] DATE,
[arrival_month] DATE,
[demand_window_C] DECIMAL(18,3),
[projected_stock_at_T] DECIMAL(18,3),
[order_qty] DECIMAL(18,3)
);
;WITH base AS (
SELECT
s.sku_1c_id,
s.code,
a.T,
st.qty AS stock0,
/* прогноз окна [T .. T+C) */
(SELECT SUM(demand_m)
FROM #tl z
WHERE z.sku_1c_id = s.sku_1c_id
AND z.[month] >= a.T
AND z.[month] < DATEADD(MONTH, @cover_months, a.T)
) AS demand_window,
/* кумулятивы до T-1 (обслуженный спрос и приход) */
(SELECT TOP (1) z.cum_i
FROM #tl z
WHERE z.sku_1c_id = s.sku_1c_id
AND z.[month] < a.T
ORDER BY z.[month] DESC
) AS cum_i_before,
(SELECT TOP (1) z.cum_d
FROM #tl z
WHERE z.sku_1c_id = s.sku_1c_id
AND z.[month] < a.T
ORDER BY z.[month] DESC
) AS cum_d_before,
/* приход именно в T */
(SELECT SUM(inb_m)
FROM #tl z
WHERE z.sku_1c_id = s.sku_1c_id
AND z.[month] = a.T
) AS inb_t
FROM #anchors a
JOIN #skus s ON s.sku_1c_id = a.sku_1c_id
JOIN #stock0 st ON st.sku_1c_id = s.sku_1c_id
)
INSERT INTO #rows_to_insert
SELECT
@scenario_id,
@group_path,
b.sku_1c_id,
b.code,
DATEADD(MONTH, -@lead_time_m, b.T) AS place_month,
b.T AS arrival_month,
CAST(ISNULL(b.demand_window,0) AS DECIMAL(18,3)) AS demand_window_C,
/* старт на T (после прихода T), снизу 0 */
CAST(
CASE
WHEN ( ISNULL(b.stock0,0)
+ ISNULL(b.cum_i_before,0)
+ ISNULL(b.inb_t,0)
- ISNULL(b.cum_d_before,0) ) < 0
THEN 0
ELSE ( ISNULL(b.stock0,0)
+ ISNULL(b.cum_i_before,0)
+ ISNULL(b.inb_t,0)
- ISNULL(b.cum_d_before,0) )
END
AS DECIMAL(18,3)) AS projected_stock_at_T,
/* размер заказа = прогноз окна */
CAST(ISNULL(b.demand_window,0) AS DECIMAL(18,3)) AS order_qty
FROM base AS b;
/* 10) Вставка рекомендаций (незначащие — отбрасываем) */
INSERT INTO [analytics].[deficit_proposal]
([scenario_id], [group_name], [1c_id], [code],
[place_month], [arrival_month],
[demand_window_C], [projected_stock_at_T], [order_qty],
[updated_at])
SELECT
scenario_id, group_name, [1c_id], [code],
[place_month], [arrival_month],
[demand_window_C], [projected_stock_at_T], [order_qty],
GETDATE()
FROM #rows_to_insert
WHERE [order_qty] > 0;
/* 11) Отладка по желанию */
IF @debug = 1
BEGIN
SELECT TOP (200)
r.[code], r.[arrival_month], r.[place_month],
r.[projected_stock_at_T], r.[demand_window_C], r.[order_qty]
FROM #rows_to_insert r
ORDER BY r.[arrival_month], r.[code];
END
END
GO
/****** Object: StoredProcedure [analytics].[sp_build_forecast_s4_by_group] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_build_forecast_s4_by_group]
@path NVARCHAR(255), -- путь группы (например, N'Игрушки')
@from_month DATE = NULL, -- по умолчанию: 1-е число текущего месяца
@to_month_excl DATE = '2028-01-01', -- полуинтервал [from, to)
@scenario_id INT = 4,
@allow_fallback_all BIT = 0 -- 1 = если группа не найдена/пустая → считать весь каталог с дефолтной сезонностью
AS
BEGIN
SET NOCOUNT ON;
----------------------------------------------------------------
-- Нормализация пути: убираем лишние кавычки и пробелы
----------------------------------------------------------------
SET @path = LTRIM(RTRIM(REPLACE(@path, '''', N'')));
IF @from_month IS NULL
SET @from_month = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
----------------------------------------------------------------
-- Идентификаторы групп для сезонности
----------------------------------------------------------------
DECLARE @season_group_id BINARY(16) = NULL;
DECLARE @DEFAULT_GROUP_ID BINARY(16) = 0x00000000000000000000000000000000;
-- Пытаемся найти группу ровно по path
SELECT @season_group_id = g.[1c_id]
FROM [pbi].[groups] g
WHERE g.[path] = @path;
-- Если нет точного совпадения, ищем верхний узел, начинающийся с @path
IF @season_group_id IS NULL
BEGIN
SELECT TOP (1) @season_group_id = g.[1c_id]
FROM [pbi].[groups] g
WHERE g.[path] LIKE @path + N'%'
ORDER BY g.[lvl] ASC;
END
-- Если группу так и не нашли: по умолчанию НЕ уходим на весь каталог (защита от опечаток)
IF @season_group_id IS NULL AND @allow_fallback_all = 0
BEGIN
RAISERROR (N'Группа с path = %s не найдена. Проверьте параметр @path или запустите с @allow_fallback_all=1 для расчёта по всему каталогу.', 16, 1, @path);
RETURN;
END
-- Если всё-таки нужно фолбэкнуть на дефолтную сезонность
IF @season_group_id IS NULL AND @allow_fallback_all = 1
SET @season_group_id = @DEFAULT_GROUP_ID;
----------------------------------------------------------------
-- TEMP: календарь месяцев [from, to)
----------------------------------------------------------------
IF OBJECT_ID('tempdb..#cal') IS NOT NULL DROP TABLE #cal;
CREATE TABLE #cal (month_start DATE NOT NULL PRIMARY KEY);
;WITH cal AS (
SELECT @from_month AS month_start
UNION ALL
SELECT DATEADD(MONTH, 1, month_start)
FROM cal
WHERE month_start < DATEADD(MONTH, -1, @to_month_excl)
)
INSERT INTO #cal(month_start)
SELECT month_start FROM cal
OPTION (MAXRECURSION 32767);
----------------------------------------------------------------
-- TEMP: SKU под деревом @path; если пусто и разрешён фолбэк → все SKU
----------------------------------------------------------------
IF OBJECT_ID('tempdb..#skus') IS NOT NULL DROP TABLE #skus;
CREATE TABLE #skus (
sku_1c_id BINARY(16) NOT NULL PRIMARY KEY,
code NVARCHAR(36) NULL
);
INSERT INTO #skus(sku_1c_id, code)
SELECT n.[1c_id], n.[code]
FROM [pbi].[nomenclature] n
JOIN [pbi].[groups] g ON g.[1c_id] = n.[1c_group]
WHERE g.[path] LIKE @path + N'%'
OPTION (RECOMPILE);
IF NOT EXISTS (SELECT 1 FROM #skus)
BEGIN
IF @allow_fallback_all = 1
BEGIN
INSERT INTO #skus(sku_1c_id, code)
SELECT n.[1c_id], n.[code]
FROM [pbi].[nomenclature] n;
SET @season_group_id = @DEFAULT_GROUP_ID;
END
ELSE
BEGIN
RAISERROR (N'По path = %s не найдено ни одного SKU. Расчёт не выполнялся.', 16, 1, @path);
RETURN;
END
END
----------------------------------------------------------------
-- TEMP: ставки продаж (шт/день)
----------------------------------------------------------------
IF OBJECT_ID('tempdb..#rate') IS NOT NULL DROP TABLE #rate;
CREATE TABLE #rate (
sku_1c_id BINARY(16) NOT NULL PRIMARY KEY,
rate_per_day DECIMAL(38,6) NOT NULL
);
INSERT INTO #rate(sku_1c_id, rate_per_day)
SELECT a.[1c_id], ISNULL(a.[Продажи шт / день],0)
FROM [analytics].[аналитика за 365 дн.] a
JOIN #skus s ON s.sku_1c_id = a.[1c_id];
----------------------------------------------------------------
-- TEMP: сезонность ТОЛЬКО по @season_group_id; если нет строк — используем дефолт
----------------------------------------------------------------
IF OBJECT_ID('tempdb..#season') IS NOT NULL DROP TABLE #season;
CREATE TABLE #season (
[month] TINYINT NOT NULL PRIMARY KEY, -- 1..12
seasonal_koef DECIMAL(18,6) NOT NULL
);
INSERT INTO #season([month], seasonal_koef)
SELECT
[month]
, ISNULL(AVG([koef]), 1.0)
FROM [mag_pbi].[analytics].[seasonality_groups_summ_1]
GROUP BY [month];
/*IF @@ROWCOUNT = 0
BEGIN
INSERT INTO #season([month], seasonal_koef)
SELECT sg.[month], sg.[seasonal_koef]
FROM [analytics].[seasonality_groups] sg
WHERE sg.[group_1c_id] = @DEFAULT_GROUP_ID;
-- если и дефолта нет, #season останется пустой → в формуле будет 1.0
END
*/
----------------------------------------------------------------
-- Удаляем старые строки сценария (батчами, чтобы не держать тяжёлые блокировки)
----------------------------------------------------------------
WHILE 1 = 1
BEGIN
DELETE TOP (50000) f
FROM [analytics].[forecast] f
JOIN #skus s ON s.sku_1c_id = f.[1c_id]
WHERE f.[scenario_id] = @scenario_id
AND f.[month] >= @from_month
AND f.[month] < @to_month_excl;
IF @@ROWCOUNT = 0 BREAK;
END
----------------------------------------------------------------
-- Вставка прогноза: rate_per_day × дни_в_месяце × seasonal_koef(@path/@default)
----------------------------------------------------------------
INSERT INTO [analytics].[forecast]
([scenario_id], [1c_id], [code], [month], [value], [updated_at], [updated_by])
SELECT
@scenario_id,
s.sku_1c_id,
s.code,
c.month_start,
CAST(ISNULL(r.rate_per_day, 0)
* DAY(EOMONTH(c.month_start))
* ISNULL(se.seasonal_koef, 1.0) AS DECIMAL(18,3)) AS value,
GETDATE(),
SUSER_SNAME()
FROM #skus s
CROSS JOIN #cal c
LEFT JOIN #rate r ON r.sku_1c_id = s.sku_1c_id
LEFT JOIN #season se ON se.[month] = MONTH(c.month_start)
OPTION (RECOMPILE);
END
GO
/****** Object: StoredProcedure [analytics].[sp_create_analytics_365] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_create_analytics_365]
AS
BEGIN
/*
... твой закомментированный блок без изменений ...
*/
-------------------------------------------------------------
-- 1) Базовая таблица аналитики за 365 дней
-------------------------------------------------------------
DROP TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
SELECT
s.[1c_id],
s.Code,
SUM(s.Количество) as [Продано шт]
INTO [mag_pbi].[analytics].[аналитика за 365 дн.]
FROM [pbiProd].[СводныйСебестоимость Для PBI] s
WHERE s.Статья = N'Реализация'
AND s.[Период] >= DATEADD(day, -365, GETDATE())
GROUP BY [1c_id], s.Code;
-------------------------------------------------------------
-- 2) Продажи шт / день
-------------------------------------------------------------
IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Продажи шт / день') IS NULL
BEGIN
ALTER TABLE [analytics].[аналитика за 365 дн.]
ADD [Продажи шт / день] numeric(38,6) NULL;
/*ALTER TABLE [analytics].[аналитика за 365 дн.]
ADD [Продажи шт / день опт] numeric(38,6) NULL;*/
END;
;WITH bounds AS (
SELECT
CAST(DATEADD(day, -365, CAST(GETDATE() AS date)) AS date) AS start_date,
CAST(GETDATE() AS date) AS end_date
),
days365 AS (
SELECT
t.[_IDRREF] AS [1c_id],
SUM(t.[ostatok]) AS days_on_sale_365
--SUM(t.[ostatok10]) AS days_on_sale_365_opt
FROM [pbi].[w_ostatok_da_net] t
CROSS JOIN bounds b
WHERE t.[dt] >= b.start_date
AND t.[dt] < b.end_date -- исключаем текущий день
GROUP BY t.[_IDRREF]
)
UPDATE a
SET
[Продажи шт / день] =
CASE
WHEN d.days_on_sale_365 > 0
THEN CAST(a.[Продано шт] AS numeric(38,6)) / CAST(d.days_on_sale_365 AS numeric(38,6))
ELSE NULL
END
/*[Продажи шт / день опт] =
CASE
WHEN d.days_on_sale_365_opt > 0
THEN CAST(a.[Продано шт] AS numeric(38,6)) / CAST(d.days_on_sale_365_opt AS numeric(38,6))
ELSE NULL
END*/
FROM [analytics].[аналитика за 365 дн.] a
LEFT JOIN days365 d
ON d.[1c_id] = a.[1c_id];
-------------------------------------------------------------
-- 3) Остаток дней продаж
-------------------------------------------------------------
IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Остаток дней продаж') IS NULL
BEGIN
ALTER TABLE [analytics].[аналитика за 365 дн.]
ADD [Остаток дней продаж] numeric(38,6) NULL;
/*ALTER TABLE [analytics].[аналитика за 365 дн.]
ADD [Остаток дней продаж опт] numeric(38,6) NULL;*/
END;
UPDATE a
SET
[Остаток дней продаж] =
CASE
WHEN a.[Продажи шт / день] > 0
THEN sb.[Остаток склад + МП, шт] / a.[Продажи шт / день]
ELSE NULL
END
/*[Остаток дней продаж опт] =
CASE
WHEN a.[Продажи шт / день опт] > 0
THEN sb.[Остаток склад + МП, шт] / a.[Продажи шт / день опт]
ELSE NULL
END*/
FROM [analytics].[аналитика за 365 дн.] a
LEFT JOIN (
SELECT
n.[1c_id],
s.[Остаток склад + МП, шт]
FROM [mag_pbi].[analytics].[stock_balance] s
INNER JOIN [mag_pbi].[pbi].[nomenclature] n
ON n.artic_id = s.artic_id
) sb
ON sb.[1c_id] = a.[1c_id];
-------------------------------------------------------------
-- 4) Сумма продаж, учетка, ТН (год)
-------------------------------------------------------------
IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Продажи / год, руб.') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Продажи / год, руб.] decimal(38,2) NULL;
END;
IF COL_LENGTH('analytics.аналитика за 365 дн.', 'учетная сумма / год, руб.') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [учетная сумма / год, руб.] decimal(38,2) NULL;
END;
IF COL_LENGTH('analytics.аналитика за 365 дн.', 'ТН / год, руб.') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [ТН / год, руб.] decimal(38,2) NULL;
END;
IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Стоимость МП год, руб.') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Стоимость МП год, руб.] decimal(38,2) NULL;
END;
IF COL_LENGTH('analytics.аналитика за 365 дн.', '%ТН год, руб.') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [%ТН год, руб.] decimal(38,2) NULL;
END;
DECLARE @end date = CAST(GETDATE() AS date); -- сегодня (не включаем)
DECLARE @start date = DATEADD(day, -365, @end); -- 365 дней назад
;WITH Y AS (
SELECT
v.[1c_id],
SUM(v.[Сумма продаж]) AS sales_year,
SUM(v.[Учетная сумма]) AS acct_year,
SUM(v.[Стоимость обработки]) AS cost_mp,
SUM(v.[Торговая надбавка]) AS tn_year
FROM [analytics].[Продажи_Учёт_Маржа_по_дням] v
WHERE v.[d] >= @start AND v.[d] < @end
GROUP BY v.[1c_id]
)
UPDATE a
SET
a.[Продажи / год, руб.] = COALESCE(Y.sales_year, 0),
a.[учетная сумма / год, руб.] = COALESCE(Y.acct_year, 0),
a.[ТН / год, руб.] = COALESCE(Y.tn_year, 0),
a.[Стоимость МП год, руб.] = COALESCE(Y.cost_mp, 0),
a.[%ТН год, руб.] = CASE
WHEN NULLIF(COALESCE(Y.acct_year, 0), 0) IS NULL THEN NULL
ELSE
CAST(COALESCE(Y.tn_year, 0) AS decimal(19,6))
/ CAST(NULLIF(Y.acct_year, 0) AS decimal(19,6))
END
FROM [mag_pbi].[analytics].[аналитика за 365 дн.] AS a
LEFT JOIN Y
ON Y.[1c_id] = a.[1c_id];
-------------------------------------------------------------
-- 5) Дней в продаже / год и / квартал
-------------------------------------------------------------
SET @end = CAST(GETDATE() AS date);
DECLARE @startY date = DATEADD(day, -365, @end);
DECLARE @startQ date = DATEADD(month, -3, @end);
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Дней в продаже / год') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Дней в продаже / год] bigint NULL;
END;
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Дней в продаже / квартал') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Дней в продаже / квартал] bigint NULL;
END;
;WITH daysY AS (
SELECT [_IDRREF] AS [1c_id],
COUNT_BIG(*) AS days_in_sale_year
FROM [pbi].[w_ostatok_da_net]
WHERE [dt] >= @startY AND [dt] < @end
AND [ostatok] >= 1
GROUP BY [_IDRREF]
),
daysQ AS (
SELECT [_IDRREF] AS [1c_id],
COUNT_BIG(*) AS days_in_sale_quarter
FROM [pbi].[w_ostatok_da_net]
WHERE [dt] >= @startQ AND [dt] < @end
AND [ostatok] >= 1
GROUP BY [_IDRREF]
),
days AS (
SELECT COALESCE(y.[1c_id], q.[1c_id]) AS [1c_id],
y.days_in_sale_year,
q.days_in_sale_quarter
FROM daysY y
FULL OUTER JOIN daysQ q ON q.[1c_id] = y.[1c_id]
)
UPDATE a
SET
a.[Дней в продаже / год] = d.days_in_sale_year,
a.[Дней в продаже / квартал] = d.days_in_sale_quarter
FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a
LEFT JOIN days d
ON d.[1c_id] = a.[1c_id];
-------------------------------------------------------------
-- 6) Сумма продаж, учетка, ТН (квартал)
-------------------------------------------------------------
IF COL_LENGTH('analytics.аналитика за 365 дн.', 'Продажи / квартал, руб.') IS NULL
BEGIN
ALTER TABLE [analytics].[аналитика за 365 дн.]
ADD [Продажи / квартал, руб.] decimal(38,2) NULL;
END;
IF COL_LENGTH('analytics.аналитика за 365 дн.', 'учетная сумма / квартал, руб.') IS NULL
BEGIN
ALTER TABLE [analytics].[аналитика за 365 дн.]
ADD [учетная сумма / квартал, руб.] decimal(38,2) NULL;
END;
IF COL_LENGTH('analytics.аналитика за 365 дн.', 'ТН / квартал, руб.') IS NULL
BEGIN
ALTER TABLE [analytics].[аналитика за 365 дн.]
ADD [ТН / квартал, руб.] decimal(38,2) NULL;
END;
SET @start = DATEADD(month, -3, @end);
;WITH Q AS (
SELECT
v.[1c_id],
SUM(v.[Сумма продаж]) AS sales_q,
SUM(v.[Учетная сумма]) AS acct_q,
SUM(v.[Торговая надбавка]) AS tn_q
FROM [analytics].[Продажи_Учёт_Маржа_по_дням] v
WHERE v.[d] >= @start AND v.[d] < @end
GROUP BY v.[1c_id]
)
UPDATE a
SET
a.[Продажи / квартал, руб.] = Q.sales_q,
a.[учетная сумма / квартал, руб.] = Q.acct_q,
a.[ТН / квартал, руб.] = Q.tn_q
FROM [analytics].[аналитика за 365 дн.] AS a
LEFT JOIN Q
ON Q.[1c_id] = a.[1c_id];
-------------------------------------------------------------
-- 7) ТН / месяц (по текущей скорости)
-------------------------------------------------------------
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'ТН / месяц, руб.') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [ТН / месяц, руб.] decimal(38,6) NULL;
END;
UPDATE a
SET a.[ТН / месяц, руб.] =
ISNULL(a.[ТН / год, руб.], 0)
/ NULLIF(a.[Продано шт], 0)
* ISNULL(a.[Продажи шт / день], 0)
* 30
FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a;
-------------------------------------------------------------------------------------
-- 8) ДОПОЛНИТЕЛЬНО: Оплаченный остаток и рентабельности (ROIC и по остатку в руб.)
-- (год назад, квартал назад и на будущий год) по 12-месячному окну
-------------------------------------------------------------------------------------
-- новые колонки
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Оплаченный остаток') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Оплаченный остаток] decimal(38,2) NULL;
END;
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность / год') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Рентабельность / год] decimal(38,6) NULL;
END;
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность / квартал') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Рентабельность / квартал] decimal(38,6) NULL;
END;
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность / будущий год') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Рентабельность / будущий год] decimal(38,6) NULL;
END;
-- новые поля рентабельности по остатку в рублях (сразу в %)
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность по остатку / год') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Рентабельность по остатку / год] decimal(38,6) NULL;
END;
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность по остатку / квартал') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Рентабельность по остатку / квартал] decimal(38,6) NULL;
END;
IF COL_LENGTH('mag_pbi.analytics.аналитика за 365 дн.', 'Рентабельность по остатку / будущий год') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[analytics].[аналитика за 365 дн.]
ADD [Рентабельность по остатку / будущий год] decimal(38,6) NULL;
END;
---------------------------------------------------------
-- 8.1 Окно 12 полных месяцев
---------------------------------------------------------
DECLARE @mp_today date = CAST(GETDATE() AS date);
DECLARE @mp_lastFullMonth date = EOMONTH(DATEADD(month, -1, @mp_today));
DECLARE @mp_firstMonthStart date = DATEADD(
month, -11,
DATEFROMPARTS(YEAR(@mp_lastFullMonth), MONTH(@mp_lastFullMonth), 1)
);
DECLARE @mp_curMonthStart date = @mp_firstMonthStart;
IF OBJECT_ID('tempdb..#mp_months') IS NOT NULL DROP TABLE #mp_months;
CREATE TABLE #mp_months (
MonthStart date NOT NULL PRIMARY KEY
);
WHILE @mp_curMonthStart <= DATEFROMPARTS(YEAR(@mp_lastFullMonth), MONTH(@mp_lastFullMonth), 1)
BEGIN
INSERT INTO #mp_months (MonthStart) VALUES (@mp_curMonthStart);
SET @mp_curMonthStart = DATEADD(month, 1, @mp_curMonthStart);
END;
---------------------------------------------------------
-- 8.2 Набор SKU из аналитики 365
---------------------------------------------------------
IF OBJECT_ID('tempdb..#mp_s') IS NOT NULL DROP TABLE #mp_s;
CREATE TABLE #mp_s(
[1c_id] binary(16) NOT NULL,
code nchar(11) NOT NULL,
CONSTRAINT PK_mp_s PRIMARY KEY ([1c_id], code)
);
INSERT INTO #mp_s([1c_id], code)
SELECT DISTINCT a.[1c_id], a.[Code]
FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a;
---------------------------------------------------------
-- 8.3 Внешние остатки
---------------------------------------------------------
IF OBJECT_ID('tempdb..#mp_ext_stock') IS NOT NULL DROP TABLE #mp_ext_stock;
CREATE TABLE #mp_ext_stock(
Dt date NOT NULL,
code nchar(11) NOT NULL,
qty numeric(18,3) NOT NULL,
CONSTRAINT PK_mp_ext_stock PRIMARY KEY (Dt, code)
);
INSERT INTO #mp_ext_stock (Dt, code, qty)
SELECT
CAST(o.[Дата обновления] AS date) AS Dt,
o.code,
SUM(o.[Количество]) AS qty
FROM analytics.[Внешние остатки] o
JOIN #mp_s s
ON s.code = o.code
GROUP BY CAST(o.[Дата обновления] AS date), o.code;
---------------------------------------------------------
-- 8.4 Приходы (Закупка / Приход)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#mp_incoming') IS NOT NULL DROP TABLE #mp_incoming;
CREATE TABLE #mp_incoming(
MonthStart date NOT NULL,
[1c_id] binary(16) NOT NULL,
qty numeric(18,3) NOT NULL,
CONSTRAINT PK_mp_incoming PRIMARY KEY (MonthStart, [1c_id])
);
INSERT INTO #mp_incoming (MonthStart, [1c_id], qty)
SELECT
DATEFROMPARTS(YEAR(s.[Период]), MONTH(s.[Период]), 1) AS MonthStart,
s.[1c_id],
SUM(s.[Количество]) AS qty
FROM pbiProd.[СводныйСебестоимость Для PBI] s
JOIN #mp_s sf
ON sf.[1c_id] = s.[1c_id]
WHERE s.[Статья] = N'Закупка'
AND s.[Вид операции] = N'Приход'
AND s.[Период] >= @mp_firstMonthStart
GROUP BY
DATEFROMPARTS(YEAR(s.[Период]), MONTH(s.[Период]), 1),
s.[1c_id];
---------------------------------------------------------
-- 8.5 Обязательства по месяцам
---------------------------------------------------------
IF OBJECT_ID('tempdb..#mp_obligations') IS NOT NULL DROP TABLE #mp_obligations;
CREATE TABLE #mp_obligations(
MonthStart date NOT NULL,
[1c_id] binary(16) NOT NULL,
obligation numeric(18,2) NOT NULL,
CONSTRAINT PK_mp_obligations PRIMARY KEY (MonthStart, [1c_id])
);
-- 8.5 Обязательства: считаем по manufacturer_payment_stage (поддержка 2, 3 и более этапов)
-- Этап «оплачен», если конец месяца M >= дата прихода + days. Сумма этапа = full_sum * percent/100.
-- Два шага через CTE, чтобы избежать Msg 8124 (correlated subquery с несколькими внешними ссылками).
;WITH base_oblig AS (
SELECT
m.MonthStart,
inc.MonthStart AS inc_month,
inc.[1c_id],
inc.qty * n2.[Цена учетная, руб] AS full_sum,
EOMONTH(inc.MonthStart) AS inc_eom,
EOMONTH(m.MonthStart) AS eval_eom,
man.id AS manufacturer_id
FROM #mp_months m
JOIN #mp_incoming inc ON 1 = 1
JOIN pbi.nomenclature n2 ON n2.[1c_id] = inc.[1c_id]
LEFT JOIN analytics.manufacturers man ON man.[manufacturer] = n2.Производитель
),
oblig_with_paid AS (
SELECT
b.MonthStart,
b.eval_eom,
b.inc_eom,
b.[1c_id],
b.full_sum,
ISNULL(SUM(
CASE WHEN b.eval_eom >= DATEADD(day, st.[days], b.inc_eom)
THEN b.full_sum * st.[percent] / 100.0 ELSE 0 END
), 0) AS paid_to_month
FROM base_oblig b
LEFT JOIN analytics.manufacturer_payment_stage st ON st.manufacturer_id = b.manufacturer_id
GROUP BY b.MonthStart, b.inc_month, b.[1c_id], b.full_sum, b.eval_eom, b.inc_eom, b.manufacturer_id
),
ObligRows AS (
SELECT
MonthStart,
[1c_id],
CASE
WHEN eval_eom < inc_eom THEN 0
WHEN full_sum - paid_to_month > 0 THEN full_sum - paid_to_month
ELSE 0
END AS ObligationPerIncoming
FROM oblig_with_paid
)
INSERT INTO #mp_obligations (MonthStart, [1c_id], obligation)
SELECT
MonthStart,
[1c_id],
SUM(ObligationPerIncoming) AS obligation
FROM ObligRows
GROUP BY
MonthStart,
[1c_id];
---------------------------------------------------------
-- 8.6 ТН по месяцам
---------------------------------------------------------
IF OBJECT_ID('tempdb..#mp_tn_monthly') IS NOT NULL DROP TABLE #mp_tn_monthly;
CREATE TABLE #mp_tn_monthly(
MonthStart date NOT NULL,
[1c_id] binary(16) NOT NULL,
tn_amount numeric(18,2) NULL,
CONSTRAINT PK_mp_tn_monthly PRIMARY KEY (MonthStart, [1c_id])
);
INSERT INTO #mp_tn_monthly (MonthStart, [1c_id], tn_amount)
SELECT
DATEFROMPARTS(YEAR(p.[d]), MONTH(p.[d]), 1) AS MonthStart,
p.[1c_id],
SUM(ISNULL(p.[Торговая надбавка],0)) AS tn_amount
FROM [mag_pbi].[analytics].[Продажи_Учёт_Маржа_по_дням] p
JOIN #mp_s s
ON s.[1c_id] = p.[1c_id]
WHERE p.[d] >= @mp_firstMonthStart
AND p.[d] <= @mp_lastFullMonth
GROUP BY
DATEFROMPARTS(YEAR(p.[d]), MONTH(p.[d]), 1),
p.[1c_id];
---------------------------------------------------------
-- 8.7 Помесячный план по всем SKU (остаток, оплаченный остаток, ТН, рубли-дни, остаток учетка руб)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#mp_plan') IS NOT NULL DROP TABLE #mp_plan;
SELECT
s.[1c_id],
s.code,
m.MonthStart,
[Остаток шт] =
ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0),
[Остаток учетка руб] =
(ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0))
* ISNULL(n.[Цена учетная, руб], 0),
[Оплаченный остаток] =
CAST(
CASE
WHEN paid_raw < 0 THEN 0
ELSE paid_raw
END
AS decimal(18,2)
),
[ТН] = ISNULL(tn.tn_amount, 0),
[рубли-дни] =
CAST(
CASE
WHEN paid_raw < 0 THEN 0
ELSE paid_raw
END * DAY(EOMONTH(m.MonthStart))
AS decimal(18,2)
)
INTO #mp_plan
FROM #mp_months m
CROSS JOIN #mp_s s
OUTER APPLY (
SELECT TOP (1) w1.quantity
FROM [mag_pbi].[pbi].[w_ostatok_da_net] w1
WHERE w1._IDRREF = s.[1c_id]
AND w1.dt <= EOMONTH(m.MonthStart)
ORDER BY w1.dt DESC
) AS intStock
LEFT JOIN #mp_ext_stock ext
ON ext.code = s.code
AND ext.Dt = EOMONTH(m.MonthStart)
LEFT JOIN #mp_obligations ob
ON ob.[1c_id] = s.[1c_id]
AND ob.MonthStart = m.MonthStart
LEFT JOIN [mag_pbi].[pbi].[nomenclature] n
ON n.[1c_id] = s.[1c_id]
LEFT JOIN #mp_tn_monthly tn
ON tn.[1c_id] = s.[1c_id]
AND tn.MonthStart = m.MonthStart
CROSS APPLY (
SELECT
(ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0))
* ISNULL(n.[Цена учетная, руб], 0)
- ISNULL(ob.obligation, 0) AS paid_raw
) p;
---------------------------------------------------------
-- 8.8 Агрегаты по SKU: ROIC (год/квартал/будущий) + рентабельность по остатку (год/квартал/будущий)
---------------------------------------------------------
-- старт квартала (последние 3 месяца окна)
DECLARE @mp_q_start date = DATEADD(
month, -2,
DATEFROMPARTS(YEAR(@mp_lastFullMonth), MONTH(@mp_lastFullMonth), 1)
);
;WITH AggYear AS (
SELECT
p.[1c_id],
tn_year = SUM(p.[ТН]),
rd_year = SUM(p.[рубли-дни]),
avg_cap_year = AVG(NULLIF(p.[Остаток учетка руб], 0.0))
FROM #mp_plan p
GROUP BY p.[1c_id]
),
AggQuarter AS (
SELECT
p.[1c_id],
tn_q = SUM(p.[ТН]),
rd_q = SUM(p.[рубли-дни]),
avg_cap_q = AVG(NULLIF(p.[Остаток учетка руб], 0.0))
FROM #mp_plan p
WHERE p.MonthStart >= @mp_q_start
GROUP BY p.[1c_id]
),
RoicPast AS (
SELECT
ay.[1c_id],
RoicValue =
CASE
WHEN ay.rd_year > 0
THEN ay.tn_year * 365.0 / ay.rd_year * 100.0
ELSE NULL
END,
ay.tn_year,
ay.avg_cap_year
FROM AggYear ay
),
RoicQuarterPast AS (
SELECT
aq.[1c_id],
RoicQ =
CASE
WHEN aq.rd_q > 0
THEN aq.tn_q * 365.0 / aq.rd_q * 100.0
ELSE NULL
END,
aq.tn_q,
aq.avg_cap_q
FROM AggQuarter aq
),
LastRow AS (
SELECT
p.[1c_id],
p.[Оплаченный остаток],
p.[Остаток шт],
p.[Остаток учетка руб],
ROW_NUMBER() OVER (
PARTITION BY p.[1c_id]
ORDER BY p.MonthStart DESC
) AS rn
FROM #mp_plan p
),
FutureBase AS (
SELECT
a.[1c_id],
a.[Продажи шт / день] AS sales_per_day,
a.[Продано шт] AS sold_year,
a.[ТН / год, руб.] AS tn_year_hist,
lr.[Оплаченный остаток] AS paid_stock_now,
lr.[Остаток шт] AS q_stock,
lr.[Остаток учетка руб] AS stock_rub_now
FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a
LEFT JOIN LastRow lr
ON lr.[1c_id] = a.[1c_id]
AND lr.rn = 1
),
FutureInputs AS (
SELECT
f.[1c_id],
f.sales_per_day,
f.sold_year,
tn_year = COALESCE(f.tn_year_hist, rp.tn_year),
f.paid_stock_now,
f.q_stock,
f.stock_rub_now,
tn_per_unit =
CASE
WHEN f.sold_year > 0 AND COALESCE(f.tn_year_hist, rp.tn_year) IS NOT NULL
THEN COALESCE(f.tn_year_hist, rp.tn_year) / f.sold_year
ELSE NULL
END,
max_sell_1y =
CASE
WHEN f.sales_per_day IS NULL THEN NULL
ELSE f.sales_per_day * 365.0
END
FROM FutureBase f
LEFT JOIN RoicPast rp
ON rp.[1c_id] = f.[1c_id]
),
FutureCalc AS (
SELECT
fi.[1c_id],
RoicFuture =
CASE
WHEN fi.paid_stock_now IS NULL OR fi.paid_stock_now <= 0
OR fi.sales_per_day IS NULL OR fi.sales_per_day <= 0
OR fi.tn_per_unit IS NULL
OR fi.q_stock IS NULL OR fi.q_stock <= 0
OR fi.max_sell_1y IS NULL OR fi.max_sell_1y <= 0
THEN NULL
ELSE
(
(
fi.tn_per_unit *
(CASE
WHEN fi.q_stock <= fi.max_sell_1y THEN fi.q_stock
ELSE fi.max_sell_1y
END)
) * 365.0
/
(
CASE
WHEN fi.q_stock / fi.sales_per_day >= 365.0
THEN fi.paid_stock_now * 365.0
ELSE fi.paid_stock_now * (fi.q_stock / fi.sales_per_day) / 2.0
END
) * 100.0
)
END,
tn_future =
CASE
WHEN fi.tn_per_unit IS NULL OR fi.max_sell_1y IS NULL OR fi.q_stock IS NULL
THEN NULL
ELSE
fi.tn_per_unit *
(CASE
WHEN fi.q_stock <= fi.max_sell_1y THEN fi.q_stock
ELSE fi.max_sell_1y
END)
END,
q_future =
CASE
WHEN fi.max_sell_1y IS NULL OR fi.q_stock IS NULL THEN NULL
WHEN fi.q_stock <= fi.max_sell_1y THEN fi.q_stock
ELSE fi.max_sell_1y
END
FROM FutureInputs fi
),
CapRentFuture AS (
SELECT
fi.[1c_id],
RentCapFuturePct =
CASE
WHEN fc.tn_future IS NULL
OR fi.stock_rub_now IS NULL OR fi.stock_rub_now <= 0
OR fi.q_stock IS NULL OR fi.q_stock <= 0
OR fc.q_future IS NULL OR fc.q_future <= 0
THEN NULL
ELSE
CASE
WHEN (fi.stock_rub_now * (1.0 - (fc.q_future / fi.q_stock) / 2.0)) <= 0
THEN NULL
ELSE
fc.tn_future
/ (fi.stock_rub_now * (1.0 - (fc.q_future / fi.q_stock) / 2.0))
* 100.0
END
END
FROM FutureInputs fi
LEFT JOIN FutureCalc fc
ON fc.[1c_id] = fi.[1c_id]
)
UPDATE a
SET
a.[Рентабельность / год] = rp.RoicValue,
a.[Рентабельность / квартал] = rq.RoicQ,
a.[Оплаченный остаток] = lr.[Оплаченный остаток],
a.[Рентабельность / будущий год] = fc.RoicFuture,
a.[Рентабельность по остатку / год] =
CASE
WHEN rp.avg_cap_year IS NOT NULL AND rp.avg_cap_year > 0
AND rp.tn_year IS NOT NULL
THEN (rp.tn_year / rp.avg_cap_year) * 100.0
ELSE NULL
END,
a.[Рентабельность по остатку / квартал] =
CASE
WHEN rq.avg_cap_q IS NOT NULL AND rq.avg_cap_q > 0
AND rq.tn_q IS NOT NULL
THEN (rq.tn_q / rq.avg_cap_q) * 100.0
ELSE NULL
END,
a.[Рентабельность по остатку / будущий год] = cf.RentCapFuturePct
FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a
LEFT JOIN RoicPast rp ON rp.[1c_id] = a.[1c_id]
LEFT JOIN RoicQuarterPast rq ON rq.[1c_id] = a.[1c_id]
LEFT JOIN LastRow lr ON lr.[1c_id] = a.[1c_id] AND lr.rn = 1
LEFT JOIN FutureCalc fc ON fc.[1c_id] = a.[1c_id]
LEFT JOIN CapRentFuture cf ON cf.[1c_id] = a.[1c_id];
-------------------------------------------------------------------------------------
-- 9) Индекс (как был)
-------------------------------------------------------------------------------------
CREATE NONCLUSTERED INDEX [analyticsаналитика за 365 дн.]
ON [analytics].[аналитика за 365 дн.] ([1c_id])
INCLUDE (
[Продажи шт / день],
[Остаток дней продаж],
[ТН / год, руб.],
[ТН / квартал, руб.],
[Рентабельность / год],
[Рентабельность / квартал],
[Дней в продаже / год],
[Дней в продаже / квартал]
);
END
GO
/****** Object: StoredProcedure [analytics].[sp_fill_deficit_money_request] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_fill_deficit_money_request]
@scenario_id INT = NULL -- NULL = MAX(scenario_id) из deficit_proposal
AS
SET NOCOUNT ON;
DECLARE @scenario INT;
IF @scenario_id IS NOT NULL AND @scenario_id > 0
SET @scenario = @scenario_id;
ELSE
SET @scenario = (SELECT MAX(scenario_id) FROM [analytics].[deficit_proposal]);
IF @scenario IS NULL
BEGIN
RAISERROR(N'Нет данных в deficit_proposal. Выполните sp_build_deficit_proposal.', 16, 1);
RETURN;
END
-- Очищаем таблицу для данного сценария
DELETE FROM [analytics].[deficit_money_request] WHERE scenario_id = @scenario;
-- Заполняем: дефицит -> номенклатура (производитель, цена) -> manufacturers -> контрагент
-- Номенклатура: pbi.v_nomenclature_full содержит все коды, Производитель, учётную цену
INSERT INTO [analytics].[deficit_money_request] (
scenario_id,
manufacturer_id,
contractor_1c_id,
manufacturer_name,
contractor_name,
arrival_month,
amount_rub,
amount_usd,
currency,
order_qty_total,
sku_count,
updated_at
)
SELECT
@scenario AS scenario_id,
m.id AS manufacturer_id,
mcm.contractor_1c_id,
m.manufacturer AS manufacturer_name,
c.contractor_name,
CAST(FORMAT(dp.arrival_month, 'yyyy-MM-01') AS date) AS arrival_month,
SUM(dp.order_qty * ISNULL(n.[Цена учетная, руб], 0)) AS amount_rub,
SUM(dp.order_qty * ISNULL(n.[Цена учетная, usd], 0)) AS amount_usd,
CASE
WHEN SUM(dp.order_qty * ISNULL(n.[Цена учетная, usd], 0)) >
SUM(dp.order_qty * ISNULL(n.[Цена учетная, руб], 0)) * 0.01
THEN N'USD' ELSE N'руб.'
END AS currency,
SUM(dp.order_qty) AS order_qty_total,
COUNT(DISTINCT dp.code) AS sku_count,
SYSDATETIME() AS updated_at
FROM [analytics].[deficit_proposal] dp
-- Номенклатура: все коды, производитель и учётная цена (без фильтра по группе)
INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n
ON n.[code] = dp.code
-- Производитель: сопоставление по имени (LTRIM/RTRIM как в contractorProducer)
INNER JOIN [analytics].[manufacturers] m
ON LTRIM(RTRIM(ISNULL(n.[Производитель], N''))) = LTRIM(RTRIM(m.manufacturer))
AND LTRIM(RTRIM(ISNULL(n.[Производитель], N''))) <> N''
LEFT JOIN [analytics].[manufacturer_counterparty_map] mcm
ON mcm.manufacturer_id = m.id
LEFT JOIN [analytics].[v_contractors] c
ON c.contractor_1c_id = mcm.contractor_1c_id
WHERE dp.scenario_id = @scenario
AND dp.order_qty > 0
AND (n.[Цена учетная, руб] IS NOT NULL OR n.[Цена учетная, usd] IS NOT NULL)
GROUP BY
m.id,
mcm.contractor_1c_id,
m.manufacturer,
c.contractor_name,
CAST(FORMAT(dp.arrival_month, 'yyyy-MM-01') AS date);
-- Логируем результат
DECLARE @rows INT = @@ROWCOUNT;
PRINT CONCAT(N'analytics.sp_fill_deficit_money_request: внесено ', @rows, N' записей для scenario_id=', @scenario);
GO
/****** Object: StoredProcedure [analytics].[sp_fill_seasonality_groups_summ_1] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_fill_seasonality_groups_summ_1]
AS
BEGIN
SET NOCOUNT ON;
-------------------------------------------------------------
-- Заполнение [analytics].[seasonality_groups_summ_1]
-- Период: 2023-01-01 — 2026-01-01 (3 года)
-- koef — мультипликативный (среднее = 1.0): прогноз = rate_per_day × дни × koef
-------------------------------------------------------------
IF OBJECT_ID('tempdb..#Months') IS NOT NULL DROP TABLE #Months;
CREATE TABLE #Months ([month] TINYINT NOT NULL PRIMARY KEY);
INSERT INTO #Months ([month]) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);
-------------------------------------------------------------
-- 1. Продажи по gg1 × месяц (20232025)
-------------------------------------------------------------
IF OBJECT_ID('tempdb..#SalesByGroupMonth') IS NOT NULL DROP TABLE #SalesByGroupMonth;
SELECT
g.[g],
g.[g1],
[month] = MONTH(s.[Период]),
qty = SUM(s.[Количество])
INTO #SalesByGroupMonth
FROM [mag_pbi].[pbiProd].[СводныйСебестоимость Для PBI] AS s
INNER JOIN [mag_pbi].[pbi].[nomenclature] n ON n.[1c_id] = s.[1c_id]
INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
WHERE s.[Статья] = N'Реализация'
AND s.[Период] >= '2023-01-01'
AND s.[Период] < '2026-01-01'
AND g.[g] NOT LIKE N'*%'
GROUP BY g.[g], g.[g1], MONTH(s.[Период]);
-------------------------------------------------------------
-- 2. Список gg1
-------------------------------------------------------------
IF OBJECT_ID('tempdb..#GroupList') IS NOT NULL DROP TABLE #GroupList;
SELECT DISTINCT [g], [g1]
INTO #GroupList
FROM #SalesByGroupMonth;
-------------------------------------------------------------
-- 3. gg1 × все 12 месяцев (qty = 0, если продаж не было)
-------------------------------------------------------------
IF OBJECT_ID('tempdb..#AllGroupMonths') IS NOT NULL DROP TABLE #AllGroupMonths;
SELECT
gl.[g],
gl.[g1],
m.[month],
qty = ISNULL(sbgm.qty, 0)
INTO #AllGroupMonths
FROM #GroupList gl
CROSS JOIN #Months m
LEFT JOIN #SalesByGroupMonth sbgm
ON sbgm.[g] = gl.[g] AND sbgm.[g1] = gl.[g1] AND sbgm.[month] = m.[month];
-------------------------------------------------------------
-- 4. Общий объём продаж по gg1
-------------------------------------------------------------
IF OBJECT_ID('tempdb..#GroupTotals') IS NOT NULL DROP TABLE #GroupTotals;
SELECT [g], [g1], total_qty = SUM(qty)
INTO #GroupTotals
FROM #AllGroupMonths
GROUP BY [g], [g1];
-------------------------------------------------------------
-- 5. Мультипликативный koef: (доля_месяца) × 12 → среднее = 1.0
-- Формула прогноза: rate_per_day × дни × koef (без домножения на 12)
-------------------------------------------------------------
TRUNCATE TABLE [analytics].[seasonality_groups_summ_1];
INSERT INTO [analytics].[seasonality_groups_summ_1] ([g], [g1], [month], [koef])
SELECT
agm.[g],
agm.[g1],
agm.[month],
koef = CASE
WHEN gt.total_qty = 0 OR gt.total_qty IS NULL THEN 1.0
ELSE CAST(agm.qty AS DECIMAL(18,6)) / NULLIF(gt.total_qty, 0) * 12.0
END
FROM #AllGroupMonths agm
INNER JOIN #GroupTotals gt
ON gt.[g] = agm.[g] AND gt.[g1] = agm.[g1]
ORDER BY agm.[g], agm.[g1], agm.[month];
PRINT N'Заполнено [analytics].[seasonality_groups_summ_1]: ' + CAST(@@ROWCOUNT AS NVARCHAR(20)) + N' строк';
END
GO
/****** Object: StoredProcedure [analytics].[sp_load_koef_groups] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_load_koef_groups] as BEGIN
Print('Запускайте код процедуры руками')
RETURN 0
DROP TABLE #koef
CREATE TABLE #koef (
[group_1c_id] nvarchar(256) NOT NULL,
[seasonal_koef] [decimal](18, 6) NOT NULL,
[month] int NOT NULL
);
BULK INSERT #koef
FROM '\\192.168.35.3\admin3\Обмен\powerbi\k1.csv'
WITH (
FIRSTROW = 2, -- пропустить заголовок
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
CODEPAGE = '1251' -- если кириллица
);
-- Проверить наличие данных во вр таблице
select top 100 * from #koef
--DELETE FROM [analytics].[seasonality_groups]
INSERT INTO [analytics].[seasonality_groups]
SELECT
g.[1c_id],
k.month,
k.seasonal_koef
FROM #koef k
INNER JOIN pbi.groups g
ON g.[1c_id]=k.group_1c_id
------------------------------
SET NOCOUNT ON;
------------------------------------------------------------
-- 1. Таблица месяцев 1..12
------------------------------------------------------------
IF OBJECT_ID('tempdb..#Months') IS NOT NULL DROP TABLE #Months;
CREATE TABLE #Months (
[month] tinyint NOT NULL PRIMARY KEY
);
INSERT INTO #Months ([month])
VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);
------------------------------------------------------------
-- 2. База продаж 20242025 по gg1 × месяц
------------------------------------------------------------
IF OBJECT_ID('tempdb..#SalesByGroupMonth') IS NOT NULL DROP TABLE #SalesByGroupMonth;
SELECT
g.[g],
g.[g1],
[month] = MONTH(s.[Период]),
qty = /* SUM(s.Сумма) */ SUM(s.[Количество])
INTO #SalesByGroupMonth
FROM [mag_pbi].[pbiProd].[СводныйСебестоимость Для PBI] AS s
INNER JOIN [pbi].[nomenclature] n
ON n.[1c_id] = s.[1c_id]
INNER JOIN [pbi].[groups] g
ON g.[1c_id] = n.[1c_group]
WHERE
s.[Статья] = N'Реализация'
AND s.[Период] >= '2023-12-01'
AND s.[Период] < '2025-12-01'
AND g.[g] NOT LIKE N'*%'
GROUP BY
g.[g],
g.[g1],
MONTH(s.[Период]);
------------------------------------------------------------
-- 3. Список всех gg1, которые продавались
------------------------------------------------------------
IF OBJECT_ID('tempdb..#GroupList') IS NOT NULL DROP TABLE #GroupList;
SELECT DISTINCT
sbgm.[g],
sbgm.[g1]
INTO #GroupList
FROM #SalesByGroupMonth sbgm;
------------------------------------------------------------
-- 4. gg1 × все 12 месяцев (qty = 0, если продаж не было)
------------------------------------------------------------
IF OBJECT_ID('tempdb..#AllGroupMonths') IS NOT NULL DROP TABLE #AllGroupMonths;
SELECT
gl.[g],
gl.[g1],
m.[month],
qty = ISNULL(sbgm.qty, 0)
INTO #AllGroupMonths
FROM #GroupList gl
CROSS JOIN #Months m
LEFT JOIN #SalesByGroupMonth sbgm
ON sbgm.[g] = gl.[g]
AND sbgm.[g1] = gl.[g1]
AND sbgm.[month] = m.[month];
------------------------------------------------------------
-- 5. Общий объём продаж по gg1 за все 12 месяцев
------------------------------------------------------------
IF OBJECT_ID('tempdb..#GroupTotals') IS NOT NULL DROP TABLE #GroupTotals;
SELECT
agm.[g],
agm.[g1],
total_qty = SUM(agm.qty)
INTO #GroupTotals
FROM #AllGroupMonths agm
GROUP BY
agm.[g],
agm.[g1];
------------------------------------------------------------
-- 6. Финальный результат: g, g1, koef, month
-- Сумма koef по 12 месяцам для каждого gg1 = 1
------------------------------------------------------------
SELECT
agm.[g],
agm.[g1],
agm.[month],
koef = CASE
WHEN gt.total_qty = 0 THEN 0
ELSE CAST(agm.qty AS decimal(18,6)) / NULLIF(gt.total_qty, 0)
END
--INTO analytics .seasonality_groups_summ_1
FROM #AllGroupMonths agm
INNER JOIN #GroupTotals gt
ON gt.[g] = agm.[g]
AND gt.[g1] = agm.[g1]
ORDER BY
agm.[g],
agm.[g1],
agm.[month];
END
GO
/****** Object: StoredProcedure [analytics].[sp_rebuild_stock_plan_by_arrival] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_rebuild_stock_plan_by_arrival]
@scenario_id INT,
@from_month DATE, -- например: DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)
@to_month DATE -- последний месяц горизонта + 1 день (интервал [from, to) по месяцам)
AS
BEGIN
SET NOCOUNT ON;
-- Безопасная рамка
IF @from_month IS NULL SET @from_month = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
IF @to_month IS NULL SET @to_month = DATEADD(MONTH, 12, @from_month); -- 12 мес по умолчанию
-- Чистим целевой диапазон
DELETE FROM [analytics].[stock_plan_by_arrival]
WHERE [scenario_id] = @scenario_id
AND [arrival_month] >= @from_month
AND [arrival_month] < @to_month;
;WITH months AS ( -- календарь месяцев [from, to)
SELECT CAST(@from_month AS DATE) AS m
UNION ALL
SELECT DATEADD(MONTH, 1, m) FROM months WHERE DATEADD(MONTH, 1, m) < @to_month
),
-- 1) Стартовый остаток на начало горизонта (берём последний известный quantity)
opening AS (
SELECT w._IDRREF AS [1c_id],
n.code AS [code],
CAST(@from_month AS DATE) AS [arrival_month],
CAST(
MAX(CASE WHEN w.dt = x.max_dt THEN w.quantity END)
AS DECIMAL(18,3)) AS opening_qty
FROM [pbi].[w_ostatok_da_net] w
JOIN (
SELECT _IDRREF, MAX(dt) AS max_dt
FROM [pbi].[w_ostatok_da_net]
WHERE dt < @from_month
GROUP BY _IDRREF
) x ON x._IDRREF = w._IDRREF AND x.max_dt = w.dt
JOIN [pbi].[nomenclature] n ON n.[1c_id] = w._IDRREF
GROUP BY w._IDRREF, n.code
),
-- 2) Подтвержденные приходы (ожидаемые заказы) по дате прихода → к первому дню месяца
inbound_confirmed AS (
SELECT
o.[1c_id],
n.code,
o.month AS arrival_month,
CAST(SUM(o.units) AS DECIMAL(18,3)) AS inbound_confirmed
FROM [mag_pbi].[analytics].[get_orders_by_group] o
JOIN [pbi].[nomenclature] n ON n.[1c_id] = o.[1c_id]
WHERE o.[status] IN (N'В пути', N'В производстве', N'Выгружен на складе', N'Согласован')
AND o.month >= @from_month
AND o.month < @to_month
GROUP BY o.[1c_id], n.code,
o.month
),
-- 3) Будущие заказы (дефицит → рекомендованные поставки) по месяцу прихода
inbound_deficit AS (
SELECT
d.[1c_id],
d.[code],
DATEFROMPARTS(YEAR(d.[arrival_month]), MONTH(d.[arrival_month]), 1) AS arrival_month,
CAST(SUM(d.[order_qty]) AS DECIMAL(18,3)) AS inbound_deficit
FROM [analytics].[deficit_proposal] d
WHERE d.[scenario_id] = @scenario_id
AND d.[arrival_month] >= @from_month
AND d.[arrival_month] < @to_month
GROUP BY d.[1c_id], d.[code],
DATEFROMPARTS(YEAR(d.[arrival_month]), MONTH(d.[arrival_month]), 1)
),
-- 4) Прогноз спроса по месяцам
forecast AS (
SELECT
f.[1c_id],
f.[code],
DATEFROMPARTS(YEAR(f.[month]), MONTH(f.[month]), 1) AS arrival_month,
CAST(SUM(f.[value]) AS DECIMAL(18,3)) AS forecast_demand
FROM [analytics].[forecast] f
WHERE f.[scenario_id] = @scenario_id
AND f.[month] >= @from_month
AND f.[month] < @to_month
GROUP BY f.[1c_id], f.[code],
DATEFROMPARTS(YEAR(f.[month]), MONTH(f.[month]), 1)
),
-- 5) Объединим каркас всех SKU × месяцы горизонта
sku_calendar AS (
SELECT DISTINCT n.[1c_id], n.[code], m.m AS arrival_month
FROM [pbi].[nomenclature] n
CROSS JOIN months m
),
base_union AS (
SELECT c.[1c_id], c.[code], c.[arrival_month],
COALESCE(op.opening_qty, 0) AS opening_qty,
COALESCE(ic.inbound_confirmed, 0) AS inbound_confirmed,
COALESCE(idf.inbound_deficit, 0) AS inbound_deficit,
COALESCE(fc.forecast_demand, 0) AS forecast_demand
FROM sku_calendar c
LEFT JOIN opening op ON op.[1c_id]=c.[1c_id] AND op.[code]=c.[code] AND op.[arrival_month]=@from_month
LEFT JOIN inbound_confirmed ic ON ic.[1c_id]=c.[1c_id] AND ic.[code]=c.[code] AND ic.[arrival_month]=c.[arrival_month]
LEFT JOIN inbound_deficit idf ON idf.[1c_id]=c.[1c_id] AND idf.[code]=c.[code] AND idf.[arrival_month]=c.[arrival_month]
LEFT JOIN forecast fc ON fc.[1c_id]=c.[1c_id] AND fc.[code]=c.[code] AND fc.[arrival_month]=c.[arrival_month]
WHERE c.[arrival_month] >= @from_month
AND c.[arrival_month] < @to_month
),
-- 6) Расчёт rolling opening/closing по месяцам
projected AS (
SELECT
@scenario_id AS scenario_id,
b.[1c_id],
b.[code],
b.[arrival_month],
-- opening: для первого месяца берем opening_qty из "opening", далее — прошлый closing
CAST(
CASE
WHEN b.[arrival_month] = @from_month
THEN b.[opening_qty]
ELSE 0
END
AS DECIMAL(18,3)) AS opening_qty,
b.[inbound_confirmed],
b.[inbound_deficit],
b.[forecast_demand]
FROM base_union b
)
-- Вставка построчно с расчетом closing через окно
INSERT INTO [analytics].[stock_plan_by_arrival]
([scenario_id],[arrival_month],[1c_id],[code],
[opening_qty],[inbound_confirmed],[inbound_deficit],[forecast_demand],[closing_qty],[updated_at])
SELECT
p.scenario_id,
p.arrival_month,
p.[1c_id],
p.[code],
-- opening по месяцу = LAG(closing) OVER (по SKU упорядочено по месяцу), для первого — opening_qty
CAST(
COALESCE(
LAG( closing_calc ) OVER (PARTITION BY p.[1c_id], p.[code] ORDER BY p.arrival_month),
p.opening_qty
)
AS DECIMAL(18,3)) AS opening_qty,
p.inbound_confirmed,
p.inbound_deficit,
p.forecast_demand,
-- closing = opening + inbound_confirmed + inbound_deficit - forecast
CAST(
(
COALESCE( LAG( closing_calc ) OVER (PARTITION BY p.[1c_id], p.[code] ORDER BY p.arrival_month), p.opening_qty)
+ p.inbound_confirmed
+ p.inbound_deficit
- p.forecast_demand
) AS DECIMAL(18,3)
) AS closing_qty,
SYSUTCDATETIME()
FROM (
-- промежуточное вычисление closing для использования в LAG
SELECT
scenario_id, [1c_id], [code], arrival_month, opening_qty, inbound_confirmed, inbound_deficit, forecast_demand,
CAST(opening_qty + inbound_confirmed + inbound_deficit - forecast_demand AS DECIMAL(18,3)) AS closing_calc
FROM projected
) p
OPTION (MAXRECURSION 0);
END
GO
/****** Object: StoredProcedure [analytics].[sp_recalc_roic] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_recalc_roic]
@manufacturer_id INT = NULL
AS
SET NOCOUNT ON;
;WITH stage_agg AS (
SELECT
manufacturer_id,
SUM([percent] / 100.0 * [days]) AS effective_deferral_days,
SUM([percent] / 100.0) AS total_percent
FROM [analytics].[manufacturer_payment_stage]
WHERE @manufacturer_id IS NULL OR manufacturer_id = @manufacturer_id
GROUP BY manufacturer_id
),
calc AS (
SELECT
man.id,
man.days_of_sales,
man.logistics_days,
COALESCE(s.effective_deferral_days, 0) AS effective_deferral_days,
COALESCE(s.total_percent, 0) AS total_percent,
(ISNULL(man.logistics_days, 120) + ISNULL(man.days_of_sales, 180) / 2.0) AS avg_return_day
FROM [analytics].[manufacturers] man
LEFT JOIN stage_agg s ON s.manufacturer_id = man.id
WHERE @manufacturer_id IS NULL OR man.id = @manufacturer_id
),
roic_calc AS (
SELECT
id,
CASE
WHEN total_percent <= 0 THEN NULL
WHEN (avg_return_day - effective_deferral_days) <= 0 THEN NULL
ELSE ROUND(12.0 / ((avg_return_day - effective_deferral_days) / 30.0) * 100.0, 2)
END AS new_roic
FROM calc
)
UPDATE man
SET man.roic_norm = r.new_roic
FROM [analytics].[manufacturers] man
JOIN roic_calc r ON r.id = man.id;
SELECT @@ROWCOUNT AS updated_count;
GO
/****** Object: StoredProcedure [analytics].[sp_report_ROI] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_report_ROI]
@scenario_id INT = 4,
@min_deficit_rub DECIMAL(18,2) = 2000,
@cutoff_month DATE = '2027-01-01',
@pathPattern NVARCHAR(400) = N'Кружево%'
AS
BEGIN
SET NOCOUNT ON;
;WITH stages_pivot AS (
SELECT manufacturer_id,
MAX(CASE WHEN rn = 1 THEN [percent] END) / 100.0 AS n_percent,
MAX(CASE WHEN rn = 1 THEN days END) AS n_days,
MAX(CASE WHEN rn = 2 THEN [percent] END) / 100.0 AS m_percent,
MAX(CASE WHEN rn = 2 THEN days END) AS m_days
FROM (
SELECT manufacturer_id, [percent], days,
ROW_NUMBER() OVER (PARTITION BY manufacturer_id ORDER BY sort_order) AS rn
FROM [analytics].[manufacturer_payment_stage]
) t WHERE rn <= 2
GROUP BY manufacturer_id
),
base AS (
SELECT
g.[path] AS grp
, n.[Производитель]
, d.place_month
, SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)) AS Deficit
, SUM(a.[%ТН год, руб.] * d.order_qty * ISNULL(n.[Цена учетная, руб], 0))
/ NULLIF(SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)), 0) AS [%ТН средн]
FROM [analytics].[deficit_proposal] d
INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = d.[1c_id]
INNER JOIN [analytics].[аналитика за 365 дн.] a ON a.[1c_id] = d.[1c_id]
INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
WHERE d.scenario_id = @scenario_id
AND ISNULL(n.[cenovaya_gruppa], N'') = N'Валютная'
AND g.[path] LIKE @pathPattern
GROUP BY g.[path], n.[Производитель], d.place_month
HAVING SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)) > @min_deficit_rub
)
SELECT
b.grp AS [g]
, b.[Производитель]
, b.place_month
, b.Deficit
, b.[%ТН средн]
, b.[%ТН средн] * ISNULL(m.roic_norm, 1.36) AS [%ROI заказа]
, ISNULL(m.roic_norm, 1.36) AS [ROI normalized]
, b.[%ТН средн] * ISNULL(m.roic_norm, 1.36) * b.Deficit AS [ROI руб]
, ISNULL(sp.n_percent, 0.30) AS n_percent
, ISNULL(sp.n_days, 1) AS n_days
, ISNULL(sp.m_percent, 0.70) AS m_percent
, ISNULL(sp.m_days, 60) AS m_days
FROM base b
LEFT JOIN [analytics].[manufacturers] m
ON LTRIM(RTRIM(ISNULL(b.[Производитель], N''))) = LTRIM(RTRIM(m.manufacturer))
AND LTRIM(RTRIM(ISNULL(b.[Производитель], N''))) <> N''
LEFT JOIN stages_pivot sp ON sp.manufacturer_id = m.id
ORDER BY [%ROI заказа] DESC, b.grp, b.Deficit DESC;
-- 2. Платежи по месяцам (из deficit_proposal по path — dmr не хранит path)
SELECT
FORMAT(d.arrival_month, 'yyyy-MM') AS [Дата платежа]
, SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)) AS [Сумма платежа]
FROM [analytics].[deficit_proposal] d
INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = d.[1c_id]
INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
WHERE d.scenario_id = @scenario_id
AND g.[path] LIKE @pathPattern
GROUP BY FORMAT(d.arrival_month, 'yyyy-MM')
ORDER BY FORMAT(d.arrival_month, 'yyyy-MM') ASC;
-- 3. Платежи до cutoff (из deficit_proposal по path)
SELECT
SUM(d.order_qty * ISNULL(n.[Цена учетная, руб], 0)) AS [Платежи в 2026]
FROM [analytics].[deficit_proposal] d
INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = d.[1c_id]
INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
WHERE d.scenario_id = @scenario_id
AND g.[path] LIKE @pathPattern
AND d.arrival_month < @cutoff_month;
-- 4. Прогноз выручки по месяцам
SELECT
t.[month]
, SUM(t.Выручка) AS revenue
, SUM(t.[Сумм. учет]) AS uchet
FROM (
SELECT
f.[month]
, f.[value] * ISNULL(n.[Цена учетная, руб], 0) AS [Сумм. учет]
, f.[value] * ISNULL(n.[Цена учетная, руб], 0) * (1 + a.[%ТН год, руб.]) AS Выручка
FROM [analytics].[forecast] f
INNER JOIN [analytics].[аналитика за 365 дн.] a ON a.[1c_id] = f.[1c_id]
INNER JOIN [mag_pbi].[pbi].[nomenclature] n ON n.[1c_id] = f.[1c_id]
INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
WHERE f.scenario_id = @scenario_id
AND a.[%ТН год, руб.] > 0
AND g.[path] LIKE @pathPattern
) t
GROUP BY t.[month]
ORDER BY t.[month];
-- 5. ROIC по группе (path pattern)
;WITH sku_in_group AS (
SELECT
a.[1c_id]
, a.[Code] AS code
, g.[path]
, a.[Оплаченный остаток] AS PaidCapital
, a.[Рентабельность по остатку / год] AS RoicPast
FROM [analytics].[аналитика за 365 дн.] a
INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = a.[1c_id]
INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
WHERE g.[path] LIKE @pathPattern
)
SELECT
@pathPattern AS [Фильтр path]
, SUM(PaidCapital) AS [Оплаченный остаток всего, руб]
, CASE
WHEN SUM(PaidCapital) > 0
THEN SUM(ISNULL(PaidCapital, 0) * ISNULL(RoicPast, 0)) / SUM(PaidCapital)
ELSE NULL
END AS [Рентабельность остатка / год назад, %]
FROM sku_in_group;
-- 6. Итоговые ROIC по всей аналитике
DECLARE @sumPaid DECIMAL(38,6);
DECLARE @sumWeightedPast DECIMAL(38,6);
DECLARE @sumWeightedFuture DECIMAL(38,6);
DECLARE @roicPastTotal DECIMAL(38,6);
DECLARE @roicFutureTotal DECIMAL(38,6);
SELECT
@sumPaid = SUM(CAST(ISNULL(a.[Оплаченный остаток], 0) AS DECIMAL(38,6)))
, @sumWeightedPast = SUM(
CAST(ISNULL(a.[Оплаченный остаток], 0) AS DECIMAL(38,6))
* CAST(ISNULL(a.[Рентабельность по остатку / год], 0) AS DECIMAL(38,6))
)
, @sumWeightedFuture = SUM(
CAST(ISNULL(a.[Оплаченный остаток], 0) AS DECIMAL(38,6))
* CAST(ISNULL(a.[Рентабельность / будущий год], 0) AS DECIMAL(38,6))
)
FROM [analytics].[аналитика за 365 дн.] a
INNER JOIN [mag_pbi].[pbi].[v_nomenclature_full] n ON n.[1c_id] = a.[1c_id]
INNER JOIN [mag_pbi].[pbi].[groups] g ON g.[1c_id] = n.[1c_group]
WHERE g.[path] LIKE @pathPattern;
SET @roicPastTotal = CASE WHEN @sumPaid > 0 THEN @sumWeightedPast / @sumPaid ELSE NULL END;
SET @roicFutureTotal = CASE WHEN @sumPaid > 0 THEN @sumWeightedFuture / @sumPaid ELSE NULL END;
SELECT
@sumPaid AS [Оплаченный остаток всего, руб]
, @roicPastTotal AS [Рентабельность остатка / год назад всего, %]
, @roicFutureTotal AS [Рентабельность остатка / будущий год всего, %];
END
GO
/****** Object: StoredProcedure [analytics].[sp_report_ROI_подробно] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [analytics].[sp_report_ROI_подробно] as BEGIN
---------------------------------------------------------
-- 0. Параметры дат: 12 полных месяцев НАЗАД
---------------------------------------------------------
DECLARE @today date = CAST(GETDATE() AS date);
DECLARE @lastFullMonth date;
DECLARE @firstMonthStart date;
DECLARE @curMonthStart date;
-- последний полный месяц (месяц до текущего дня)
SET @lastFullMonth = EOMONTH(DATEADD(month, -1, @today));
-- первый из 12 полных месяцев
SET @firstMonthStart = DATEADD(
month, -11,
DATEFROMPARTS(YEAR(@lastFullMonth), MONTH(@lastFullMonth), 1)
);
SET @curMonthStart = @firstMonthStart;
---------------------------------------------------------
-- 1. Список месяцев (#months)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#months') IS NOT NULL DROP TABLE #months;
CREATE TABLE #months (
MonthStart date NOT NULL PRIMARY KEY
);
WHILE @curMonthStart
<= DATEFROMPARTS(YEAR(@lastFullMonth), MONTH(@lastFullMonth), 1)
BEGIN
INSERT INTO #months (MonthStart)
VALUES (@curMonthStart);
SET @curMonthStart = DATEADD(month, 1, @curMonthStart);
END;
---------------------------------------------------------
-- 2. SKU (#s) здесь укажи нужный код товара
---------------------------------------------------------
IF OBJECT_ID('tempdb..#s') IS NOT NULL DROP TABLE #s;
CREATE TABLE #s (
[1c_id] binary(16) NOT NULL,
code nchar(11) NOT NULL
);
INSERT INTO #s ([1c_id], code)
SELECT n.[1c_id], n.code
FROM pbi.nomenclature n
WHERE n.code = N'УТ-00176242'; -- <=== поменяй при необходимости
---------------------------------------------------------
-- 3. Внешние остатки (#ext_stock) срезы на конец месяца
---------------------------------------------------------
IF OBJECT_ID('tempdb..#ext_stock') IS NOT NULL DROP TABLE #ext_stock;
CREATE TABLE #ext_stock (
Dt date NOT NULL,
code nchar(11) NOT NULL,
qty numeric(18,3) NOT NULL,
CONSTRAINT PK_ext_stock PRIMARY KEY (Dt, code)
);
INSERT INTO #ext_stock (Dt, code, qty)
SELECT
CAST(o.[Дата обновления] AS date) AS Dt,
o.code,
SUM(o.[Количество]) AS qty
FROM analytics.[Внешние остатки] o
JOIN #s s
ON s.code = o.code
GROUP BY CAST(o.[Дата обновления] AS date), o.code;
---------------------------------------------------------
-- 4. Приходы (#incoming) Закупка / Приход по месяцам
-- БЕРЁМ ТОЛЬКО ПРИХОДЫ ВНУТРИ НАШИХ 12 МЕСЯЦЕВ
---------------------------------------------------------
IF OBJECT_ID('tempdb..#incoming') IS NOT NULL DROP TABLE #incoming;
CREATE TABLE #incoming (
MonthStart date NOT NULL, -- месяц прихода (1-е число)
code nchar(11) NOT NULL,
qty numeric(18,3) NOT NULL,
CONSTRAINT PK_incoming PRIMARY KEY (MonthStart, code)
);
INSERT INTO #incoming (MonthStart, code, qty)
SELECT
DATEFROMPARTS(YEAR(s.[Период]), MONTH(s.[Период]), 1) AS MonthStart,
n.code,
SUM(s.[Количество]) AS qty
FROM pbiProd.[СводныйСебестоимость Для PBI] s
JOIN pbi.nomenclature n
ON n.[1c_id] = s.[1c_id]
JOIN #s sfilter
ON sfilter.code = n.code
WHERE s.[Статья] = N'Закупка'
AND s.[Вид операции] = N'Приход'
AND s.[Период] >= @firstMonthStart -- отключаем старые приходы
GROUP BY
DATEFROMPARTS(YEAR(s.[Период]), MONTH(s.[Период]), 1),
n.code;
---------------------------------------------------------
-- 5. Части платежей по каждому приходу (#pay_parts)
-- (1-й и 2-й платёж по производителю, проценты как ДОЛИ)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#pay_parts') IS NOT NULL DROP TABLE #pay_parts;
CREATE TABLE #pay_parts (
MonthStart date NOT NULL, -- месяц прихода (ключ к #incoming)
code nchar(11) NOT NULL,
pay_date date NOT NULL, -- дата платежа
amount numeric(18,2) NOT NULL
);
-- первый платёж (n)
INSERT INTO #pay_parts (MonthStart, code, pay_date, amount)
SELECT
inc.MonthStart,
inc.code,
DATEADD(day, man.n_days - 90, EOMONTH(inc.MonthStart)) AS pay_date,
inc.qty * n.[Цена учетная, руб] * man.n_percent AS amount
FROM #incoming inc
JOIN pbi.nomenclature n
ON n.code = inc.code
JOIN analytics.manufacturers man
ON man.[manufacturer] = n.Производитель
WHERE man.n_percent IS NOT NULL
AND man.n_percent <> 0;
-- второй платёж (m)
INSERT INTO #pay_parts (MonthStart, code, pay_date, amount)
SELECT
inc.MonthStart,
inc.code,
DATEADD(day, man.m_days - 90, EOMONTH(inc.MonthStart)) AS pay_date,
inc.qty * n.[Цена учетная, руб] * man.m_percent AS amount
FROM #incoming inc
JOIN pbi.nomenclature n
ON n.code = inc.code
JOIN analytics.manufacturers man
ON man.[manufacturer] = n.Производитель
WHERE man.m_percent IS NOT NULL
AND man.m_percent <> 0;
---------------------------------------------------------
-- 6. Платежи по месяцам (#payments) для колонки [платеж]
---------------------------------------------------------
IF OBJECT_ID('tempdb..#payments') IS NOT NULL DROP TABLE #payments;
CREATE TABLE #payments (
MonthStart date NOT NULL, -- месяц платежа (1-е число)
code nchar(11) NOT NULL,
amount numeric(18,2) NOT NULL,
CONSTRAINT PK_payments PRIMARY KEY (MonthStart, code)
);
INSERT INTO #payments (MonthStart, code, amount)
SELECT
DATEFROMPARTS(YEAR(p.pay_date), MONTH(p.pay_date), 1) AS MonthStart,
p.code,
SUM(p.amount) AS amount
FROM #pay_parts p
GROUP BY
DATEFROMPARTS(YEAR(p.pay_date), MONTH(p.pay_date), 1),
p.code;
---------------------------------------------------------
-- 7. Обязательства по месяцам (#obligations)
-- Считаем только по приходам (#incoming)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#obligations') IS NOT NULL DROP TABLE #obligations;
CREATE TABLE #obligations (
MonthStart date NOT NULL, -- месяц, на который считаем долг
code nchar(11) NOT NULL,
obligation numeric(18,2) NOT NULL,
CONSTRAINT PK_obligations PRIMARY KEY (MonthStart, code)
);
;WITH ObligRows AS (
SELECT
m.MonthStart,
inc.code,
CASE
-- если месяц ещё до прихода товара долга нет
WHEN EOMONTH(m.MonthStart) < EOMONTH(inc.MonthStart) THEN 0
ELSE
CASE
WHEN full_sum - paid_to_month > 0
THEN full_sum - paid_to_month
ELSE 0
END
END AS ObligationPerIncoming
FROM #months m
JOIN #incoming inc
ON 1 = 1 -- каждая пара (месяц, приход)
JOIN pbi.nomenclature n2
ON n2.code = inc.code
JOIN analytics.manufacturers man2
ON man2.[manufacturer] = n2.Производитель
CROSS APPLY (
SELECT
inc.qty * n2.[Цена учетная, руб] AS full_sum,
(
-- оплачено к концу месяца m.MonthStart (по обоим платежам)
(CASE
WHEN man2.n_percent IS NOT NULL
AND EOMONTH(m.MonthStart)
>= DATEADD(day, man2.n_days - 90,
EOMONTH(inc.MonthStart))
THEN inc.qty * n2.[Цена учетная, руб] * man2.n_percent
ELSE 0
END)
+
(CASE
WHEN man2.m_percent IS NOT NULL
AND EOMONTH(m.MonthStart)
>= DATEADD(day, man2.m_days - 90,
EOMONTH(inc.MonthStart))
THEN inc.qty * n2.[Цена учетная, руб] * man2.m_percent
ELSE 0
END)
) AS paid_to_month
) calc
)
INSERT INTO #obligations (MonthStart, code, obligation)
SELECT
MonthStart,
code,
SUM(ObligationPerIncoming) AS obligation
FROM ObligRows
GROUP BY
MonthStart,
code;
---------------------------------------------------------
-- 8. ТН по месяцам (#tn_monthly) из Продажи_Учёт_Маржа_по_дням
---------------------------------------------------------
IF OBJECT_ID('tempdb..#tn_monthly') IS NOT NULL DROP TABLE #tn_monthly;
CREATE TABLE #tn_monthly (
MonthStart date NOT NULL,
code nchar(11) NOT NULL,
tn_amount numeric(18,2) NOT NULL,
CONSTRAINT PK_tn_monthly PRIMARY KEY (MonthStart, code)
);
INSERT INTO #tn_monthly (MonthStart, code, tn_amount)
SELECT
DATEFROMPARTS(YEAR(p.[d]), MONTH(p.[d]), 1) AS MonthStart,
p.[Code],
SUM(p.[Торговая надбавка]) AS tn_amount
FROM [mag_pbi].[analytics].[Продажи_Учёт_Маржа_по_дням] p
JOIN #s s
ON s.code = p.[Code]
WHERE p.[d] >= @firstMonthStart
AND p.[d] <= @lastFullMonth
GROUP BY
DATEFROMPARTS(YEAR(p.[d]), MONTH(p.[d]), 1),
p.[Code];
---------------------------------------------------------
-- 9. Финальный SELECT ПО МЕСЯЦАМ (прошлый год)
---------------------------------------------------------
IF OBJECT_ID('tempdb..#month_plan') IS NOT NULL DROP TABLE #month_plan;
SELECT
s.[1c_id],
s.code,
n.Производитель,
n.[Цена учетная, руб],
n.[Цена учетная, руб]*(ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0)) AS [Остаток учетка руб],
man.n_percent,
man.n_days,
man.m_percent,
man.m_days,
RIGHT('0' + CAST(MONTH(m.MonthStart) AS varchar(2)), 2)
+ '-' + CAST(YEAR(m.MonthStart) AS varchar(4)) AS [месяц], -- MM-YYYY (текст)
m.MonthStart AS [MonthStart], -- реальная дата месяца
ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0) AS [остаток], -- шт
ISNULL(inc.qty, 0) AS [приход], -- шт
ISNULL(pay.amount, 0) AS [платеж], -- руб
ISNULL(ob.obligation, 0) AS [Обязательства],-- руб
CAST(
CASE
WHEN p.paid_raw < 0 THEN 0
ELSE p.paid_raw
END
AS numeric(18,2)
) AS [Оплаченный остаток], -- руб
ISNULL(tn.tn_amount, 0) AS [ТН], -- торговая надбавка за месяц, руб
CAST(
CASE
WHEN p.paid_raw < 0 THEN 0
ELSE p.paid_raw
END * DAY(EOMONTH(m.MonthStart))
AS numeric(18,2)
) AS [рубли-дни] -- оплаченный остаток × дней в месяце
INTO #month_plan
FROM #months m
CROSS JOIN #s s
OUTER APPLY (
SELECT TOP (1) w1.quantity
FROM pbi.[w_ostatok_da_net] w1
WHERE w1._IDRREF = s.[1c_id]
AND w1.dt <= EOMONTH(m.MonthStart)
ORDER BY w1.dt DESC
) AS intStock
LEFT JOIN #ext_stock ext
ON ext.code = s.code
AND ext.Dt = EOMONTH(m.MonthStart)
LEFT JOIN #incoming inc
ON inc.code = s.code
AND inc.MonthStart = m.MonthStart
LEFT JOIN pbi.nomenclature n
ON n.code = s.code
LEFT JOIN analytics.manufacturers man
ON man.[manufacturer] = n.Производитель
LEFT JOIN #payments pay
ON pay.code = s.code
AND pay.MonthStart = m.MonthStart
LEFT JOIN #obligations ob
ON ob.code = s.code
AND ob.MonthStart = m.MonthStart
LEFT JOIN #tn_monthly tn
ON tn.code = s.code
AND tn.MonthStart = m.MonthStart
CROSS APPLY ( -- сырые оплаченные рубли (до обрезки в 0)
SELECT
(ISNULL(intStock.quantity, 0) + ISNULL(ext.qty, 0))
* ISNULL(n.[Цена учетная, руб], 0)
- ISNULL(ob.obligation, 0) AS paid_raw
) p
ORDER BY m.MonthStart;
-- помесячная картина прошлого
SELECT * FROM #month_plan;
---------------------------------------------------------
-- 10. Рентабельность за прошлый год (ROIC как было)
---------------------------------------------------------
DECLARE @roic_past numeric(38,6);
DECLARE @tn_year numeric(38,6);
DECLARE @ruble_days_year numeric(38,6);
SELECT
@tn_year = SUM(t.[ТН]),
@ruble_days_year = SUM(t.[рубли-дни])
FROM #month_plan t;
SET @roic_past = CASE
WHEN @ruble_days_year > 0
THEN @tn_year * 365.0 / @ruble_days_year * 100.0
ELSE NULL
END;
---------------------------------------------------------
-- 10a. Рентабельность по остатку В РУБЛЯХ (год и квартал назад)
-- ТН / средний остаток учетка руб
---------------------------------------------------------
DECLARE @rent_cap_year numeric(38,6);
DECLARE @rent_cap_quarter numeric(38,6);
-- год: средний Остаток учетка руб по всем 12 месяцам
DECLARE @avg_cap_year numeric(38,6);
SELECT
@avg_cap_year = AVG(NULLIF(t.[Остаток учетка руб], 0.0))
FROM #month_plan t;
IF @avg_cap_year IS NOT NULL AND @avg_cap_year > 0 AND @tn_year IS NOT NULL
SET @rent_cap_year = @tn_year / @avg_cap_year;
ELSE
SET @rent_cap_year = NULL;
-- квартал: последние 3 месяца окна
DECLARE @q_start date = DATEADD(
month, -2,
DATEFROMPARTS(YEAR(@lastFullMonth), MONTH(@lastFullMonth), 1)
);
DECLARE @tn_q numeric(38,6);
DECLARE @avg_cap_q numeric(38,6);
SELECT
@tn_q = SUM(t.[ТН]),
@avg_cap_q = AVG(NULLIF(t.[Остаток учетка руб], 0.0))
FROM #month_plan t
WHERE t.MonthStart >= @q_start;
IF @avg_cap_q IS NOT NULL AND @avg_cap_q > 0 AND @tn_q IS NOT NULL
SET @rent_cap_quarter = @tn_q / @avg_cap_q;
ELSE
SET @rent_cap_quarter = NULL;
---------------------------------------------------------
-- 11. Рентабельность остатка на будущий год (ROIC вперёд)
---------------------------------------------------------
-- 11.1. Текущий SKU и его продажи / день
DECLARE @sku_1c_id binary(16);
SELECT TOP(1) @sku_1c_id = [1c_id] FROM #s;
DECLARE @sales_per_day numeric(38,6); -- Продажи шт / день
DECLARE @sold_year numeric(38,6); -- Продано шт за последние 12 мес
-- берём скорость продаж из аналитики за 365 дней (если есть)
SELECT
@sales_per_day = a.[Продажи шт / день]
FROM [mag_pbi].[analytics].[аналитика за 365 дн.] a
WHERE a.[1c_id] = @sku_1c_id;
-- продано шт за наши 12 месяцев (по себестоимости)
SELECT
@sold_year = SUM(s.[Количество])
FROM pbiProd.[СводныйСебестоимость Для PBI] s
WHERE s.[1c_id] = @sku_1c_id
AND s.[Статья] = N'Реализация'
AND s.[Период] >= @firstMonthStart
AND s.[Период] <= @lastFullMonth;
IF (@sales_per_day IS NULL OR @sales_per_day = 0) AND @sold_year IS NOT NULL
BEGIN
-- fallback, если ещё не прогоняли sp_create_analytics_365
SET @sales_per_day = @sold_year / 365.0;
END;
-- 11.2. Маржа на штуку по истории
DECLARE @tn_per_unit numeric(38,6);
SET @tn_per_unit = CASE
WHEN @sold_year IS NOT NULL AND @sold_year > 0
THEN @tn_year / @sold_year
ELSE NULL
END;
-- 11.3. Текущий оплаченный остаток, остаток шт и остаток учетка руб (последний месяц окна)
DECLARE @q_stock numeric(18,6); -- текущий остаток шт
DECLARE @paid_stock_today numeric(18,6); -- оплаченный остаток в руб
DECLARE @stock_rub_today numeric(18,6); -- остаток учетка руб на конец окна
SELECT TOP(1)
@q_stock = [остаток],
@paid_stock_today = [Оплаченный остаток],
@stock_rub_today = [Остаток учетка руб]
FROM #month_plan
ORDER BY MonthStart DESC; -- последний из 12 месяцев = @lastFullMonth
-- 11.4. Сколько успеем продать за будущий год и какая будет ТН
DECLARE @q_future numeric(18,6); -- сколько штук реально успеем продать за год
DECLARE @tn_future numeric(18,6); -- ожидаемая ТН за будущий год
IF @sales_per_day IS NOT NULL AND @sales_per_day > 0
BEGIN
DECLARE @max_sell_1y numeric(18,6);
SET @max_sell_1y = @sales_per_day * 365.0;
SET @q_future = CASE
WHEN @q_stock IS NULL THEN 0
WHEN @q_stock <= @max_sell_1y THEN @q_stock
ELSE @max_sell_1y
END;
END
ELSE
BEGIN
SET @q_future = 0;
END;
IF @tn_per_unit IS NOT NULL
SET @tn_future = @tn_per_unit * @q_future;
ELSE
SET @tn_future = NULL;
-- 11.5. Будущие рубли-дни и ROIC вперёд
DECLARE @days_to_sell numeric(18,6);
DECLARE @ruble_days_future numeric(18,6);
DECLARE @roic_future numeric(38,6);
IF @sales_per_day IS NOT NULL AND @sales_per_day > 0 AND @q_stock IS NOT NULL
SET @days_to_sell = @q_stock / @sales_per_day;
ELSE
SET @days_to_sell = NULL;
IF @days_to_sell IS NULL OR @paid_stock_today IS NULL OR @paid_stock_today <= 0 OR @tn_future IS NULL
BEGIN
SET @roic_future = NULL;
END
ELSE
BEGIN
IF @days_to_sell >= 365.0
-- остаток будет лежать весь год
SET @ruble_days_future = @paid_stock_today * 365.0;
ELSE
-- остаток линейно уходит до нуля за days_to_sell
SET @ruble_days_future = @paid_stock_today * @days_to_sell / 2.0;
IF @ruble_days_future > 0
SET @roic_future = @tn_future * 365.0 / @ruble_days_future * 100.0;
ELSE
SET @roic_future = NULL;
END;
---------------------------------------------------------
-- 11.6. Рентабельность по остатку В РУБЛЯХ на будущий год
-- (ТН_future / средний остаток учетка руб в горизонте)
---------------------------------------------------------
DECLARE @rent_cap_future numeric(38,6);
IF @stock_rub_today IS NULL OR @stock_rub_today <= 0
OR @q_stock IS NULL OR @q_stock <= 0
OR @q_future IS NULL OR @q_future <= 0
OR @tn_future IS NULL
BEGIN
SET @rent_cap_future = NULL;
END
ELSE
BEGIN
DECLARE @avg_cap_future numeric(38,6);
-- считаем, что капитал уходит линейно пропорционально количеству:
-- капитал "на продажу" = stock_rub_today * (q_future / q_stock)
-- средний капитал = stock_rub_today - 0.5 * капитал_на_продажу
SET @avg_cap_future =
@stock_rub_today * (1.0 - (@q_future / @q_stock) / 2.0);
IF @avg_cap_future > 0
SET @rent_cap_future = @tn_future / @avg_cap_future;
ELSE
SET @rent_cap_future = NULL;
END;
---------------------------------------------------------
-- 11.7. Таблица будущего по месяцам (#future_plan) — как было
---------------------------------------------------------
IF OBJECT_ID('tempdb..#future_plan') IS NOT NULL DROP TABLE #future_plan;
CREATE TABLE #future_plan (
PeriodStart date,
PeriodEnd date,
DaysInPeriod int,
QtyStart numeric(18,6),
Sold numeric(18,6),
QtyEnd numeric(18,6),
PaidCapitalAvg numeric(18,6),
RubleDays numeric(18,6),
TN_period numeric(18,6),
ROIC_period numeric(38,6)
);
DECLARE
@f_start date,
@f_end date,
@days int,
@rem_qty numeric(18,6),
@qty_start numeric(18,6),
@qty_end numeric(18,6),
@sold numeric(18,6),
@capital_start numeric(18,6),
@capital_end numeric(18,6),
@capital_avg numeric(18,6),
@tn_period numeric(18,6),
@ruble_days_m numeric(18,6),
@roic_m numeric(38,6),
@cum_days int;
SET @rem_qty = ISNULL(@q_stock, 0);
SET @f_start = @today;
SET @cum_days = 0;
WHILE @cum_days < 365 AND @rem_qty > 0 AND @sales_per_day IS NOT NULL AND @sales_per_day > 0
BEGIN
-- конец периода = конец месяца, в котором f_start
SET @f_end = EOMONTH(@f_start);
SET @days = DATEDIFF(day, @f_start, @f_end) + 1;
-- не выходим за 365 дней горизонта
IF @cum_days + @days > 365
BEGIN
SET @days = 365 - @cum_days;
SET @f_end = DATEADD(day, @days - 1, @f_start);
END;
SET @qty_start = @rem_qty;
DECLARE @can_sell numeric(18,6);
SET @can_sell = @sales_per_day * @days;
SET @sold = CASE
WHEN @rem_qty <= @can_sell THEN @rem_qty
ELSE @can_sell
END;
SET @qty_end = @qty_start - @sold;
IF @q_stock IS NOT NULL AND @q_stock > 0 AND @paid_stock_today IS NOT NULL
BEGIN
SET @capital_start = @paid_stock_today * (@qty_start / @q_stock);
SET @capital_end = @paid_stock_today * (@qty_end / @q_stock);
END
ELSE
BEGIN
SET @capital_start = 0;
SET @capital_end = 0;
END;
SET @capital_avg = (@capital_start + @capital_end) / 2.0;
IF @tn_per_unit IS NOT NULL
SET @tn_period = @tn_per_unit * @sold;
ELSE
SET @tn_period = NULL;
SET @ruble_days_m = @capital_avg * @days;
IF @ruble_days_m > 0 AND @tn_period IS NOT NULL
SET @roic_m = @tn_period * 365.0 / @ruble_days_m * 100.0;
ELSE
SET @roic_m = NULL;
INSERT INTO #future_plan (
PeriodStart, PeriodEnd, DaysInPeriod,
QtyStart, Sold, QtyEnd,
PaidCapitalAvg, RubleDays, TN_period, ROIC_period
)
VALUES (
@f_start, @f_end, @days,
@qty_start, @sold, @qty_end,
@capital_avg, @ruble_days_m, @tn_period, @roic_m
);
SET @rem_qty = @qty_end;
SET @cum_days = @cum_days + @days;
SET @f_start = DATEADD(day, 1, @f_end);
IF @cum_days >= 365 BREAK;
END;
---------------------------------------------------------
-- 12. Итог: прошлое и будущее + рентабельность по остатку (руб)
---------------------------------------------------------
SELECT
@roic_past AS [ROIC за год назад],
@roic_future AS [ROIC на будущий год],
@rent_cap_year AS [Рентабельность по остатку (руб) / год назад],
@rent_cap_quarter AS [Рентабельность по остатку (руб) / квартал назад],
@rent_cap_future AS [Рентабельность по остатку (руб) / будущий год];
-- Таблица будущего по месяцам / периодам (как было)
SELECT * FROM #future_plan ORDER BY PeriodStart;
END
GO
/****** Object: StoredProcedure [analytics].[sp_run_deficit_all_skus] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [analytics].[sp_run_deficit_all_skus]
@scenario_id INT
as BEGIN
DELETE FROM [analytics].[deficit_proposal] where scenario_id = @scenario_id
EXEC [analytics].[sp_build_deficit_proposal]
@scenario_id = @scenario_id,
@group_path = N'', -- пусто = все группы
@lead_time_m = 4,
@cover_months = 6,
@from_month = '2025-10-01',
@to_month_excl = '2028-01-01',
@debug = 0; -- чтобы не заспамить Messages
END
GO
/****** Object: StoredProcedure [analytics].[sp_загрузка_прогнозаакупки] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Script for SelectTopNRows command from SSMS ******/
CREATE PROCEDURE [analytics].[sp_загрузка_прогнозаакупки] AS BEGIN
SET NOCOUNT ON;
IF OBJECT_ID('tempdb..#plan2026') IS NOT NULL
DROP TABLE #plan2026;
CREATE TABLE #plan2026 (
code nvarchar(50) NOT NULL,
opt decimal(18,2) NULL,
mp decimal(18,2) NULL,
updated_by nvarchar(100) NULL
);
-- уникальный индекс по коду, дубли игнорируем
CREATE UNIQUE INDEX UX_plan2026_code
ON #plan2026(code)
WITH (IGNORE_DUP_KEY = ON);
BULK INSERT #plan2026
FROM '\\192.168.35.3\admin3\Обмен\powerbi\plan2026.csv'
WITH (
FIRSTROW = 2, -- пропускаем заголовок
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
CODEPAGE = '1251', -- или 1251, если файл не в UTF-8
TABLOCK
);
-- Проверка
SELECT COUNT(*) AS total_rows,
COUNT(DISTINCT code) AS distinct_codes
FROM #plan2026;
-- Проверка
SELECT TOP (20) *
FROM #plan2026
SELECT
month
, avg([koef])
FROM [mag_pbi].[analytics].[seasonality_groups_summ_1]
GROUP by month
order by month
------------------------------------------------------------
-- 1. Средняя сезонность по месяцам → #Seasonality
------------------------------------------------------------
IF OBJECT_ID('tempdb..#Seasonality') IS NOT NULL
DROP TABLE #Seasonality;
SELECT
[month]
, koef = AVG([koef])/12
INTO #Seasonality
FROM [mag_pbi].[analytics].[seasonality_groups_summ_1]
GROUP BY [month];
------------------------------------------------------------
-- 2. Почистить сценарий 8 (если нужно пересчитать)
------------------------------------------------------------
DELETE FROM [mag_pbi].[analytics].[forecast]
WHERE scenario_id = 8;
------------------------------------------------------------
-- 3. Записать прогноз в forecast для scenario_id = 8
-- value = opt_месяц + mp_месяц
------------------------------------------------------------
INSERT INTO [mag_pbi].[analytics].[forecast] (
scenario_id
, [1c_id]
, [code]
, [month]
, [value]
, [updated_at]
, [updated_by]
, [opt]
, [mp]
)
SELECT
8 AS scenario_id
, n.[1c_id]
, p.[code]
, DATEFROMPARTS(2026, s.[month], 1) AS [month]
, CAST( (p.opt * s.koef) + (p.mp * s.koef) AS decimal(18,3)) AS [value]
, GETDATE() AS updated_at
, p.[updated_by] AS updated_by
, CAST(p.opt * s.koef AS decimal(18,3)) AS [opt]
, CAST(p.mp * s.koef AS decimal(18,3)) AS [mp]
FROM #plan2026 AS p
INNER JOIN [mag_pbi].[pbi].[nomenclature] AS n
ON n.[code] = p.[code]
CROSS JOIN #Seasonality AS s;
-- всего строк и разных кодов
--EXEC [analytics].[sp_build_deficit_proposal] @scenario_id = 8
/*
/****** Script for SelectTopNRows command from SSMS ******/
INSERT INTO [mag_pbi].[analytics].[forecast] (
scenario_id
, [1c_id]
, [code]
, [month]
, [value]
, [updated_at]
, [updated_by]
, [opt]
, [mp]
)
SELECT
8 AS scenario_id
,[1c_id]
,[code]
,[month]
,[value]
,[updated_at]
,[updated_by]
,[opt]
,[mp]
FROM [mag_pbi].[analytics].[forecast]
WHERE scenario_id = 5 AND code not in (SELECT code FROM [mag_pbi].[analytics].[forecast] WHERE scenario_id = 8 )
*/
--EXEC [analytics].[sp_fill_deficit_money_request] @scenario_id = 8
END
GO
/****** Object: StoredProcedure [analytics].[usp_CreateForecastBasesKs] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE analytics.usp_CreateForecastBasesKs
AS
BEGIN
SET NOCOUNT ON;
-- Удаляем вьюху, если существует
IF OBJECT_ID('analytics.ForecastBasesKs', 'V') IS NOT NULL
DROP VIEW analytics.ForecastBasesKs;
-- Создаём заново
EXEC('
CREATE VIEW [analytics].[ForecastBasesKs] AS
WITH MaxDate AS (
SELECT MAX(Период) AS max_date
FROM [pbi].[Себестоимость]
WHERE Статья = ''реализация''
),
LastFullMonth AS (
SELECT
YEAR(DATEADD(MONTH, -1, max_date)) AS last_year,
MONTH(DATEADD(MONTH, -1, max_date)) AS last_month
FROM MaxDate
),
-- 1. Продажи по SKU × месяц
Sales AS (
SELECT
artic_id,
YEAR(Период) AS Год,
MONTH(Период) AS Месяц,
SUM(Количество) AS total_sales
FROM [pbi].[Себестоимость]
WHERE Статья = ''реализация''
GROUP BY artic_id, YEAR(Период), MONTH(Период)
),
-- 2. Дни в продаже
Stock AS (
SELECT
artic_id,
YEAR(dt) AS Год,
MONTH(dt) AS Месяц,
SUM(CASE WHEN ostatok = 1 THEN 1 ELSE 0 END) AS days_available
FROM [pbi].[w_ostatok_da_net]
GROUP BY artic_id, YEAR(dt), MONTH(dt)
),
-- 3. База
Base AS (
SELECT
s.artic_id,
n.code,
n.description,
s.Год,
s.Месяц,
s.total_sales,
st.days_available,
sg.seasonal_koef,
(s.total_sales / NULLIF(sg.seasonal_koef,0)) AS Normalized_sales,
CASE WHEN st.days_available > 19 THEN 1 ELSE 0 END AS valid_month,
CASE WHEN st.days_available > 19
THEN (s.total_sales / NULLIF(sg.seasonal_koef,0))
ELSE NULL END AS normalized_valid_sales
FROM Sales s
LEFT JOIN Stock st
ON s.artic_id = st.artic_id
AND s.Год = st.Год
AND s.Месяц = st.Месяц
JOIN [pbi].[nomenclature] n
ON s.artic_id = n.artic_id
JOIN [analytics].[seasonality_groups] sg
ON n.[1c_group] = sg.group_1c_id
AND s.Месяц = sg.month
),
Windowed AS (
SELECT
b.*,
ROW_NUMBER() OVER (PARTITION BY b.artic_id ORDER BY (b.Год*100 + b.Месяц) DESC) AS rn_desc
FROM Base b
),
Aggregates AS (
SELECT
w.artic_id,
AVG(CASE WHEN rn_desc <= 12 THEN normalized_valid_sales END) AS Base_12M,
CASE
WHEN MIN(CASE WHEN rn_desc <= 3 THEN valid_month END) = 1
THEN AVG(CASE WHEN rn_desc <= 3 THEN normalized_valid_sales END)
ELSE NULL
END AS Base_3M
FROM Windowed w
CROSS JOIN LastFullMonth lm
WHERE (w.Год*100 + w.Месяц) <= (lm.last_year*100 + lm.last_month)
GROUP BY w.artic_id
),
TrendData AS (
SELECT
w.artic_id,
ROW_NUMBER() OVER (PARTITION BY w.artic_id ORDER BY (w.Год*100 + w.Месяц)) - 1 AS t,
LOG(w.normalized_valid_sales) AS ln_sales
FROM Windowed w
CROSS JOIN LastFullMonth lm
WHERE (w.Год*100 + w.Месяц) > (lm.last_year*100 + lm.last_month - 200)
AND (w.Год*100 + w.Месяц) <= (lm.last_year*100 + lm.last_month)
AND w.normalized_valid_sales > 0
),
TrendAgg AS (
SELECT
artic_id,
COUNT(*) AS n_obs,
EXP( (AVG(t*ln_sales) - AVG(t)*AVG(ln_sales)) / NULLIF(AVG(t*t) - AVG(t)*AVG(t),0) ) AS g_raw
FROM TrendData
GROUP BY artic_id
HAVING COUNT(*) >= 6
),
TrendFinal AS (
SELECT
artic_id,
POWER(
CASE
WHEN POWER(g_raw, 12) < 0.7 THEN 0.7
WHEN POWER(g_raw, 12) > 1.5 THEN 1.5
ELSE POWER(g_raw, 12)
END,
1.0/12
) AS Ktrend
FROM TrendAgg
),
YoYpairs AS (
SELECT
w.artic_id,
(w.Год*100 + w.Месяц) AS ym,
w.normalized_valid_sales AS v2,
LAG(w.normalized_valid_sales, 12) OVER (
PARTITION BY w.artic_id ORDER BY (w.Год*100 + w.Месяц)
) AS v1
FROM Windowed w
CROSS JOIN LastFullMonth lm
WHERE (w.Год*100 + w.Месяц) <= (lm.last_year*100 + lm.last_month)
),
YoYratios AS (
SELECT artic_id, (v2 / v1) AS ratio
FROM YoYpairs
WHERE v1 > 0 AND v2 > 0
),
YoYFinal AS (
SELECT DISTINCT
artic_id,
CASE
WHEN PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ratio)
OVER (PARTITION BY artic_id) < 0.7 THEN 0.7
WHEN PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ratio)
OVER (PARTITION BY artic_id) > 1.5 THEN 1.5
ELSE PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ratio)
OVER (PARTITION BY artic_id)
END AS Kgrowth_YoY,
COUNT(ratio) OVER (PARTITION BY artic_id) AS cnt_pairs
FROM YoYratios
),
YoYFiltered AS (
SELECT artic_id, Kgrowth_YoY
FROM YoYFinal
WHERE cnt_pairs >= 3
)
SELECT
n.artic_id,
n.code,
n.description,
a.Base_12M,
a.Base_3M,
CASE
WHEN a.Base_3M IS NOT NULL THEN a.Base_3M
ELSE a.Base_12M
END AS Base_Selected,
tf.Ktrend,
yf.Kgrowth_YoY
FROM pbi.nomenclature n
LEFT JOIN Aggregates a ON n.artic_id = a.artic_id
LEFT JOIN TrendFinal tf ON n.artic_id = tf.artic_id
LEFT JOIN YoYFiltered yf ON n.artic_id = yf.artic_id;
');
END;
GO
/****** Object: StoredProcedure [analytics].[usp_InsertForecasts] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE analytics.usp_InsertForecasts
AS
BEGIN
SET NOCOUNT ON;
-- Удаляем старые прогнозы
DELETE FROM analytics.forecast
WHERE scenario_id IN (5, 6);
-- Чистим временные таблицы
IF OBJECT_ID('tempdb..#Params') IS NOT NULL DROP TABLE #Params;
IF OBJECT_ID('tempdb..#Calendar') IS NOT NULL DROP TABLE #Calendar;
-- #Params
SELECT DATEFROMPARTS(
YEAR(DATEADD(MONTH, -1, MAX(Период))),
MONTH(DATEADD(MONTH, -1, MAX(Период))),
1
) AS LastMonth
INTO #Params
FROM pbi.Себестоимость
WHERE Статья = 'реализация';
-- #Calendar
SELECT DATEFROMPARTS(YEAR(d), MONTH(d), 1) AS MonthStart
INTO #Calendar
FROM (
SELECT TOP (1000)
DATEADD(MONTH, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
(SELECT LastMonth FROM #Params)) AS d
FROM master..spt_values
) x
WHERE d <= '2026-12-01';
-- Вставка Trend (5)
INSERT INTO analytics.forecast (scenario_id, [1c_id], code, [month], value, updated_at, updated_by)
SELECT
5,
n.[1c_id],
f.code,
c.MonthStart,
CAST(
ROUND(
f.Base_Selected * sg.seasonal_koef *
POWER(f.Ktrend, DATEDIFF(MONTH, p.LastMonth, c.MonthStart)),
0
) AS numeric(18,0)
),
GETDATE(),
SUSER_SNAME()
FROM analytics.ForecastBasesKs f
JOIN pbi.nomenclature n ON f.artic_id = n.artic_id
CROSS JOIN #Params p
JOIN #Calendar c ON c.MonthStart > p.LastMonth
JOIN analytics.seasonality_groups sg
ON n.[1c_group] = sg.group_1c_id
AND sg.[month] = MONTH(c.MonthStart)
WHERE f.Base_Selected IS NOT NULL
AND f.Ktrend IS NOT NULL;
-- Вставка YoY (6)
INSERT INTO analytics.forecast (scenario_id, [1c_id], code, [month], value, updated_at, updated_by)
SELECT
6,
n.[1c_id],
f.code,
c.MonthStart,
CAST(
ROUND(
f.Base_Selected * sg.seasonal_koef * f.Kgrowth_YoY,
0
) AS numeric(18,0)
),
GETDATE(),
SUSER_SNAME()
FROM analytics.ForecastBasesKs f
JOIN pbi.nomenclature n ON f.artic_id = n.artic_id
CROSS JOIN #Params p
JOIN #Calendar c ON c.MonthStart > p.LastMonth
JOIN analytics.seasonality_groups sg
ON n.[1c_group] = sg.group_1c_id
AND sg.[month] = MONTH(c.MonthStart)
WHERE f.Base_Selected IS NOT NULL
AND f.Kgrowth_YoY IS NOT NULL;
END;
GO
/****** Object: StoredProcedure [analytics].[Подготовка таблицы продаж к прогнозу] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE analytics.[Подготовка таблицы продаж к прогнозу] as
BEGIN
/* ========= ПАРАМЕТРЫ ========= */
DECLARE @FromDate date = '2023-01-01';
DECLARE @ToDate date = CAST(GETDATE() AS date);
/* ========= ВСПОМОГАТЕЛЬНЫЕ: НЕДЕЛЯ С ПОНЕДЕЛЬНИКА ========= */
IF OBJECT_ID('tempdb..#dates') IS NOT NULL DROP TABLE #dates;
WITH d AS (
SELECT @FromDate AS d
UNION ALL SELECT DATEADD(day,1,d) FROM d WHERE d < @ToDate
)
SELECT d AS [date],
DATEADD(day, - (DATEPART(weekday,d) + @@DATEFIRST + 5) % 7, d) AS week_start
INTO #dates
FROM d
OPTION (MAXRECURSION 0);
CREATE INDEX IX_dates_week ON #dates(week_start);
/* ========= 1) ПРОДАЖИ (только положительные) ========= */
IF OBJECT_ID('tempdb..#sales_raw') IS NOT NULL DROP TABLE #sales_raw;
SELECT
CAST(s.[Период] AS date) AS [date],
s.[1c_id] AS sku_id,
CAST(s.[КоличествоУпаковок] AS decimal(18,4)) AS qty
INTO #sales_raw
FROM [pbiProd].[СводныйСебестоимость Для PBI] s
WHERE
s.[Статья] = N'Реализация'
AND s.[Вид операции] = N'Расход'
AND s.[КоличествоУпаковок] > 0
AND s.[Период] >= @FromDate
AND s.[Период] <= @ToDate;
CREATE INDEX IX_sales_raw ON #sales_raw(sku_id, [date]);
/* ========= 2) ФИЛЬТРУЕМ ПРОДАЖИ ПО НАЛИЧИЮ (ostatok=1 из pbi.w_ostatok_da_net) ========= */
IF OBJECT_ID('tempdb..#sales_clean_daily') IS NOT NULL DROP TABLE #sales_clean_daily;
SELECT
sr.sku_id,
sr.[date],
sr.qty
INTO #sales_clean_daily
FROM #sales_raw sr
JOIN [pbi].[w_ostatok_da_net] a
ON a.[_IDRREF] = sr.sku_id
AND a.dt = sr.[date]
AND a.ostatok = 1;
CREATE INDEX IX_sales_clean_daily ON #sales_clean_daily(sku_id, [date]);
/* ========= 3) АГРЕГАЦИЯ В НЕДЕЛИ ========= */
/* 3.1 Продажи по неделям */
IF OBJECT_ID('tempdb..#sales_weekly') IS NOT NULL DROP TABLE #sales_weekly;
SELECT
scd.sku_id,
d.week_start,
SUM(scd.qty) AS qty_week
INTO #sales_weekly
FROM #sales_clean_daily scd
JOIN #dates d
ON d.[date] = scd.[date]
GROUP BY scd.sku_id, d.week_start;
CREATE INDEX IX_sales_weekly ON #sales_weekly(sku_id, week_start);
/* 3.2 Доля доступности по неделям (из pbi.w_ostatok_da_net) */
IF OBJECT_ID('tempdb..#avail_weekly') IS NOT NULL DROP TABLE #avail_weekly;
SELECT
a.[_IDRREF] AS sku_id,
d.week_start,
SUM(a.ostatok) AS days_available,
COUNT(*) AS days_total,
CAST(SUM(a.ostatok) * 1.0 / NULLIF(COUNT(*),0) AS decimal(6,4)) AS availability_rate
INTO #avail_weekly
FROM [pbi].[w_ostatok_da_net] a
JOIN #dates d
ON d.[date] = a.dt
WHERE a.dt BETWEEN @FromDate AND @ToDate
GROUP BY a.[_IDRREF], d.week_start;
CREATE INDEX IX_avail_weekly ON #avail_weekly(sku_id, week_start);
/* ========= 4) СКЛЕЙКА: оставляем недели без продаж, если товар был доступен ========= */
IF OBJECT_ID('tempdb..#weekly_base') IS NOT NULL DROP TABLE #weekly_base;
SELECT
COALESCE(sw.sku_id, aw.sku_id) AS sku_id,
COALESCE(sw.week_start, aw.week_start) AS week_start,
COALESCE(sw.qty_week, 0) AS qty_week,
COALESCE(aw.availability_rate, 0) AS availability_rate
INTO #weekly_base
FROM #sales_weekly sw
FULL JOIN #avail_weekly aw
ON aw.sku_id = sw.sku_id
AND aw.week_start = sw.week_start;
CREATE INDEX IX_weekly_base ON #weekly_base(sku_id, week_start);
/* ========= 5) МЕТАДАННЫЕ SKU (cat L1, minAvailableQty) ========= */
IF OBJECT_ID('tempdb..#sku_meta') IS NOT NULL DROP TABLE #sku_meta;
SELECT
n.[1c_id] AS sku_id,
n.minAvailableQty,
CAST(CASE
WHEN CHARINDEX(N' | ', g.path) > 0
THEN LEFT(g.path, CHARINDEX(N' | ', g.path) - 1)
ELSE g.path
END AS nvarchar(200)) AS category_l1
INTO #sku_meta
FROM [mag_pbi].[pbi].[nomenclature] n
LEFT JOIN [mag_pbi].[pbi].[groups] g
ON g.group_id = n.group_id;
CREATE INDEX IX_sku_meta ON #sku_meta(sku_id);
/* ========= 6) ВИТРИНА С ЛАГАМИ И ФИЧАМИ (analytics) ========= */
IF OBJECT_ID('analytics.sales_weekly_features', 'U') IS NOT NULL
DROP TABLE analytics.sales_weekly_features;
CREATE TABLE analytics.sales_weekly_features (
sku_id varbinary(16) NOT NULL,
week_start date NOT NULL,
qty_week decimal(18,4) NOT NULL,
availability_rate decimal(6,4) NOT NULL,
-- календарные
year_num int NOT NULL,
month_num tinyint NOT NULL,
iso_week tinyint NOT NULL,
quarter_num tinyint NOT NULL,
dow_monday1 tinyint NOT NULL,
-- справочники
category_l1 nvarchar(200) NULL,
minAvailableQty decimal(18,4) NULL,
-- лаги
lag_w1 decimal(18,4) NULL,
lag_w2 decimal(18,4) NULL,
lag_w4 decimal(18,4) NULL,
lag_w12 decimal(18,4) NULL,
lag_w26 decimal(18,4) NULL,
lag_w52 decimal(18,4) NULL,
-- скользящие средние
ma4 decimal(18,4) NULL,
ma12 decimal(18,4) NULL,
created_at datetime2 NOT NULL DEFAULT sysutcdatetime(),
CONSTRAINT PK_sales_weekly_features PRIMARY KEY (sku_id, week_start)
);
WITH base AS (
SELECT wb.sku_id,
wb.week_start,
wb.qty_week,
wb.availability_rate,
YEAR(wb.week_start) AS year_num,
MONTH(wb.week_start) AS month_num,
DATEPART(ISO_WEEK, wb.week_start) AS iso_week,
DATEPART(QUARTER, wb.week_start) AS quarter_num,
1 AS dow_monday1
FROM #weekly_base wb
),
enriched AS (
SELECT b.*,
m.category_l1,
m.minAvailableQty
FROM base b
LEFT JOIN #sku_meta m
ON m.sku_id = b.sku_id
),
lags AS (
SELECT
e.*,
LAG(e.qty_week, 1) OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w1,
LAG(e.qty_week, 2) OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w2,
LAG(e.qty_week, 4) OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w4,
LAG(e.qty_week, 12) OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w12,
LAG(e.qty_week, 26) OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w26,
LAG(e.qty_week, 52) OVER (PARTITION BY e.sku_id ORDER BY e.week_start) AS lag_w52,
CAST(AVG(e.qty_week) OVER (
PARTITION BY e.sku_id
ORDER BY e.week_start
ROWS BETWEEN 4 PRECEDING AND 1 PRECEDING
) AS decimal(18,4)) AS ma4,
CAST(AVG(e.qty_week) OVER (
PARTITION BY e.sku_id
ORDER BY e.week_start
ROWS BETWEEN 12 PRECEDING AND 1 PRECEDING
) AS decimal(18,4)) AS ma12
FROM enriched e
)
INSERT INTO analytics.sales_weekly_features (
sku_id, week_start, qty_week, availability_rate,
year_num, month_num, iso_week, quarter_num, dow_monday1,
category_l1, minAvailableQty,
lag_w1, lag_w2, lag_w4, lag_w12, lag_w26, lag_w52,
ma4, ma12
)
SELECT
sku_id, week_start, qty_week, availability_rate,
year_num, month_num, iso_week, quarter_num, dow_monday1,
category_l1, minAvailableQty,
lag_w1, lag_w2, lag_w4, lag_w12, lag_w26, lag_w52,
ma4, ma12
FROM lags;
CREATE INDEX IX_sales_weekly_features_sku ON analytics.sales_weekly_features(sku_id, week_start);
CREATE INDEX IX_sales_weekly_features_cat ON analytics.sales_weekly_features(category_l1, week_start);
END
GO
/****** Object: StoredProcedure [dbo].[sp_create_forecast_deficit_money_request_scenario_4] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE sp_create_forecast_deficit_money_request_scenario_4 AS
BEGIN
--запускать только при изменении дат внутри процедуры
--EXEC [analytics].[sp_fill_seasonality_groups_summ_1];
DELETE FROM [mag_pbi].[analytics].[forecast] WHERE scenario_id = 4
SELECT count(*) FROM [mag_pbi].[analytics].[forecast] WHERE scenario_id = 4
EXEC [analytics].[sp_fill_seasonality_groups_summ_1];
EXEC [analytics].[create_forecast_loop]
SELECT count(*) FROM [mag_pbi].[analytics].[forecast] WHERE scenario_id = 4
EXEC [analytics].[sp_run_deficit_all_skus] @scenario_id = 4;
EXEC [analytics].[sp_fill_deficit_money_request] @scenario_id = 4;
END
GO
/****** Object: StoredProcedure [dbo].[Расчет себестоимости 1 этап] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[Расчет себестоимости 1 этап]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
exec sebest.[Заполнить себестоимость закупкой]
exec sebest.[Заполнить себестоимость начальным остатком]
DELETE FROM [pbi].[СебестоимостьПродажи]
WHERE 1=1
END
GO
/****** Object: StoredProcedure [pbi].[migrate_groups] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: миграция регистров ВыручкаИСебестоимость продаж из двух баз
-- =============================================
CREATE PROCEDURE [pbi].[migrate_groups]
AS
BEGIN
DROP TABLE [pbi].groups
SELECT
*
INTO [pbi].groups
FROM [mag_pbi].[pbi].[groups_view]
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190906-120551] ON [pbi].[groups]
(
[group_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
--GO
ALTER TABLE [mag_pbi].[pbi].groups ADD [план] float NULL;
ALTER TABLE [mag_pbi].[pbi].groups ADD [first group] NVARCHAR(36) NULL;
UPDATE [mag_pbi].[pbi].groups set [first group] =
(SELECT group_id FROM [mag_pbi].[pbi].groups gg WHERE gg.g = g.g and gg._ParentIDRRef = '00000000-0000-0000-0000-000000000000' )
FROM [mag_pbi].[pbi].groups g
CREATE NONCLUSTERED INDEX IX_groups__g
ON [pbi].[groups] ([g])
INCLUDE ([group_id]);
--CREATE NONCLUSTERED INDEX [1c_group_index]
--ON [pbi].[nomenclature] ([1c_group])
END
GO
/****** Object: StoredProcedure [pbi].[migrate_max_year_quantity] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_max_year_quantity] as
BEGIN
-- ДЕЛАЕМ ДВА ПОЛЯ
-- max_year_quantity
-- max_quarter_quantity
IF NOT EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'nomenclature' AND TABLE_SCHEMA='pbi'
AND COLUMN_NAME = 'max_year_quantity'
)
BEGIN
ALTER TABLE mag_pbi.pbi.nomenclature
ADD max_year_quantity NUMERIC(38,3) NULL;
END
UPDATE n
SET n.max_year_quantity = (
SELECT MAX(quantity) FROM pbi.[w_ostatok_da_net] o WHERE o._IDRREF = n.[1c_id] AND o.dt >= DATEADD(year, -1, CAST(GETDATE() AS date))
)
FROM mag_pbi.pbi.nomenclature n
--Нужно обязательно добавить регистр закупки, т.к. прием на склад идет не всегда всей партией товара
;WITH YearlyQuantity AS (
SELECT
analitikaUchetaNomenklaturi.[_Fld20498RRef] AS [1c_id],
SUM(
CASE
WHEN r._RecorderTRef IN (0x000001E3, 0x00000189, 0x000001D5, 0x000001B0)
THEN CASE [_Fld16345RRef]
WHEN 0x970191967A54A8814BA45C6234640F68 THEN -[_Fld16361]
ELSE [_Fld16361]
END
WHEN r._RecorderTRef = 0x0000020D THEN 0
WHEN r._RecorderTRef = 0x000001A1 THEN 0
ELSE 0
END
) AS total_quantity
FROM mag_2019.dbo._AccumRg16344 r -- Регистр накопления Закупки
LEFT JOIN [MAG_2019].[dbo].[_Reference160] AS analitikaUchetaNomenklaturi
ON analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef]
WHERE DATEADD(year, -2000, _Period) >= DATEADD(YEAR, -1, GETDATE())
GROUP BY analitikaUchetaNomenklaturi.[_Fld20498RRef]
)
UPDATE n
SET n.[max_year_quantity] =
CASE
WHEN y.total_quantity > n.[max_year_quantity] THEN y.total_quantity
ELSE n.[max_year_quantity]
END
FROM [mag_pbi].[pbi].[nomenclature] n
JOIN YearlyQuantity y ON n.[1c_id] = y.[1c_id];
------------------------------------------------------------------
-- max_quarter_quantity
IF NOT EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'nomenclature' AND TABLE_SCHEMA='pbi'
AND COLUMN_NAME = 'max_quarter_quantity'
)
BEGIN
ALTER TABLE mag_pbi.pbi.nomenclature
ADD max_quarter_quantity NUMERIC(38,3) NULL;
END
UPDATE n
SET n.max_quarter_quantity = (
SELECT MAX(quantity) FROM pbi.[w_ostatok_da_net] o WHERE o._IDRREF = n.[1c_id] AND o.dt >= DATEADD(month, -3, CAST(GETDATE() AS date))
)
FROM mag_pbi.pbi.nomenclature n
--Нужно обязательно добавить регистр закупки, т.к. прием на склад идет не всегда всей партией товара
;WITH QuarterlyQuantity AS (
SELECT
analitikaUchetaNomenklaturi.[_Fld20498RRef] AS [1c_id],
SUM(
CASE
WHEN r._RecorderTRef IN (0x000001E3, 0x00000189, 0x000001D5, 0x000001B0)
THEN CASE [_Fld16345RRef]
WHEN 0x970191967A54A8814BA45C6234640F68 THEN -[_Fld16361]
ELSE [_Fld16361]
END
WHEN r._RecorderTRef = 0x0000020D THEN 0
WHEN r._RecorderTRef = 0x000001A1 THEN 0
ELSE 0
END
) AS total_quantity
FROM mag_2019.dbo._AccumRg16344 r -- Регистр накопления Закупки
LEFT JOIN [MAG_2019].[dbo].[_Reference160] AS analitikaUchetaNomenklaturi
ON analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef]
WHERE DATEADD(year, -2000, _Period) >= DATEADD(MONTH, -3, GETDATE())
--AND analitikaUchetaNomenklaturi.[_Fld20498RRef] = 0x9989B49691D57EFD11EF3F6ADA21AED9
GROUP BY analitikaUchetaNomenklaturi.[_Fld20498RRef]
)
UPDATE n
SET n.max_quarter_quantity =
CASE
WHEN y.total_quantity > n.max_quarter_quantity THEN y.total_quantity
ELSE n.max_quarter_quantity
END
FROM [mag_pbi].[pbi].[nomenclature] n
JOIN QuarterlyQuantity y ON n.[1c_id] = y.[1c_id];
END
GO
/****** Object: StoredProcedure [pbi].[migrate_nomenclature] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: миграция регистров ВыручкаИСебестоимость продаж из двух баз
-- =============================================
CREATE PROCEDURE [pbi].[migrate_nomenclature]
AS
BEGIN
DROP TABLE IF EXISTS #dop
SELECT * INTO #dop
FROM(
SELECT * FROM mag_pbi.pbi.[значения доп реквизитов номенклатуры]
)as t
CREATE NONCLUSTERED INDEX [NonClusteredIndex-1] ON #dop
(_Reference188_IDRRef, _Fld21137RRef)
DROP table IF EXISTS pbi.nomenclature
SELECT *
INTO pbi.nomenclature
FROM(
SELECT
LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),5,12) ))as artic_id
, n._IDRRef as '1c_id'
, n._Code as code
, CASE
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Рублевая'
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Валютная'
ELSE 'Неопределено'
END as cenovaya_gruppa
, n._Description as description /*Наименование*/
, n._Fld21043 as artic /*Артикул*/
, n._Fld21053RRef as vid_nomen
, cast( (SELECT _Description FROM [MAG_2019].[dbo].[_Reference260] pr WHERE pr._IDRRef = n._Fld21079RRef) as nvarchar(max)) as 'Производитель'
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), n._ParentIDRRef, 2),5,12) ))as group_id
, n._ParentIDRRef as '1c_group'
--, isnull(us._Description, 'Менеджер') as [manager]
, qr._Fld27045 as 'card'
, concat('https://media.magok.ru/', f._Fld21201) as 'photo'
, 2019 as base
, n._Fld21046 as [Знаменатель веса]
, n._Fld21049 as [Числитель веса]
, n._Fld21089 as [Знаменатель объема]
, n._Fld21092 as [Числитель объема]
, n._Fld33769 as [Количество упак в коробе]
, n._Fld33771 as [Количество упак в кванте]
, n._Fld33413 as [id magok]
, (SELECT value FROM #dop where _Fld21137RRef = 0x810D0CC47A052DFD11E8C0B216664650 and _Reference188_IDRRef =n._IDRRef) as [Товарныйменеджера]
, (SELECT value FROM #dop where _Fld21137RRef = 0xAEA2B496910DCFD611E9DAEF699391C4 and _Reference188_IDRRef =n._IDRRef) as [МенеджерПоЗакупкам2]
, (SELECT value FROM #dop where _Fld21137RRef = 0xAEA2B496910DCFD611E9DAF2AF0FBF08 and _Reference188_IDRRef =n._IDRRef) as [РуководительНаправления]
, (SELECT value FROM #dop where _Fld21137RRef = 0x9980B49691D57EFD11EDA7A875968BE2 and _Reference188_IDRRef =n._IDRRef) as [Менеджер OZON]
, (SELECT value FROM #dop where _Fld21137RRef = 0xAEC4B496910DCFD611EC4E8357703C3A and _Reference188_IDRRef =n._IDRRef) as [Менеджер WB]
, (SELECT value FROM #dop where _Fld21137RRef = 0xAEACB496910DCFD611EA4980351CDD01 and _Reference188_IDRRef =n._IDRRef) as [АБС статус]
, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F011642C1217A0 and _Reference188_IDRRef =n._IDRRef) as [АБС план]
, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F0C4629BFA88FF and _Reference188_IDRRef =n._IDRRef) as [ABC Парето]
--, (SELECT value FROM #dop where _Fld21137RRef = 0x9987B49691D57EFD11EEFD8C032DF868 and _Reference188_IDRRef =n._IDRRef) as [АБС МП]
--, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F08C910065CAE0 and _Reference188_IDRRef =n._IDRRef) as [ABC статус 12м 08.25]
--, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F08C9141DE8102 and _Reference188_IDRRef =n._IDRRef) as [ABC статус 3м 08.25]
, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F078456358DE9B and _Reference188_IDRRef =n._IDRRef) as [XYZ статус 12м]
, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F0D41588B52E51 and _Reference188_IDRRef =n._IDRRef) as [Комментарий для матрицы]
--, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F078466D61B354 and _Reference188_IDRRef =n._IDRRef) as [XYZ статус 3м]
, (SELECT value FROM #dop where _Fld21137RRef = 0x80C7305A3A00E12B11E5A300C980DC00 and _Reference188_IDRRef =n._IDRRef) as [Коллекция]
, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F037A75A7E983E and _Reference188_IDRRef =n._IDRRef) as [Ценовой сегмент Магок]
, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F037A7EA5402D7 and _Reference188_IDRRef =n._IDRRef) as [Ценовой сегмент МП]
, (SELECT value FROM #dop where _Fld21137RRef = 0x998DB49691D57EFD11F037A7C791FA85 and _Reference188_IDRRef =n._IDRRef) as [Кол-во упак в заказе Магок]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x80F1305A3A00E12B11E63C4A303F49FB and _Reference188_IDRRef=n._IDRRef) as [Бренд]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A30013708A94 and _Reference188_IDRRef=n._IDRRef) as [Тип товара]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80D00CC47A052DFD11E691F14188BF4D and _Reference188_IDRRef=n._IDRRef) as [Метка]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80E00CC47A052DFD11E7029264A93CF6 and _Reference188_IDRRef=n._IDRRef) as [Ширина, мм]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A3008141292E and _Reference188_IDRRef=n._IDRRef) as [Цвет]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80E90CC47A052DFD11E72379276D8356 and _Reference188_IDRRef=n._IDRRef) as [Номер цвета]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0xAE9EB496910DCFD611E95F5710EB0448 and _Reference188_IDRRef=n._IDRRef) as [Тип шнура]
--, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0xAE9EB496910DCFD611E95F5783A48B03 and _Reference188_IDRRef=n._IDRRef) as [Наполнитель]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0xAE9EB496910DCFD611E95F572768CAA7 and _Reference188_IDRRef=n._IDRRef) as [Тип плетения]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A2717FE9DE3A and _Reference188_IDRRef=n._IDRRef) as [Размер]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A3001EDD22AF and _Reference188_IDRRef=n._IDRRef) as [Особенность]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A300C980DC01 and _Reference188_IDRRef=n._IDRRef) as [Форма]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5A300E8BE58AC and _Reference188_IDRRef=n._IDRRef) as [Ширина]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x997DB49691D57EFD11EC7F7E661783C3 and _Reference188_IDRRef=n._IDRRef) as [Формат упаковки]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5BAD05261251C and _Reference188_IDRRef=n._IDRRef) as [Макс. запас]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x80C7305A3A00E12B11E5BAD0706896DA and _Reference188_IDRRef=n._IDRRef) as [Мин. запас]
, (SELECT value FROM #dop r1 where r1._Fld21137RRef = 0x998CB49691D57EFD11EF9202AB464430 and _Reference188_IDRRef=n._IDRRef) as [QTY PACKS]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEA1B496910DCFD411E9B50C873C5A12 and _Reference188_IDRRef=n._IDRRef) as [Да/Нет Собственное пр-во]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x997DB49691D57EFD11EC9644B479DD39 and _Reference188_IDRRef=n._IDRRef) as [ID OZON]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x997DB49691D57EFD11EC8D98061ED9EB and _Reference188_IDRRef=n._IDRRef) as [ID WB]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBE86B75A98522 and _Reference188_IDRRef=n._IDRRef) as [WB]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC3B496910DCFD611EC1BAAEA86F8FE and _Reference188_IDRRef=n._IDRRef) as [Ozon]
--, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBE86B6E01B921 and _Reference188_IDRRef=n._IDRRef) as [FBS]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBE60A4FB56689 and _Reference188_IDRRef=n._IDRRef) as [СТМ]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBDE53817D5CA3 and _Reference188_IDRRef=n._IDRRef) as [Выгружать на я.маркет]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0xAEC2B496910DCFD611EBF5E566B4B9C7 and _Reference188_IDRRef=n._IDRRef) as [Выгружать в Google Merchant]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x998BB49691D57EFD11EF646A898FFD9C and _Reference188_IDRRef=n._IDRRef) as [Товар МП]
, (SELECT value FROM #dop r2 where r2._Fld21137RRef = 0x997DB49691D57EFD11EC96300ACEF865 and _Reference188_IDRRef=n._IDRRef) as [Неликвид]
/* найти реквизит
select * from (
SELECT _IDRref, _Fld17721 as _Description FROM [MAG_2019].[dbo].[_Chrc1109]
--UNION ALL
--SELECT _reference69_IDRRef, _Fld18673 as _Description FROM [MAG_2019].[dbo].[_Reference69_VT18669]
) as t
where t._Description like '%ширина%'
*/
, (SELECT value FROM #dop r where r._Fld21137RRef = 0x80DB0CC47A052DFD11E6E88DD05808D1 and r._Reference188_IDRRef=n._IDRRef) as [Статус]
, (SELECT value FROM #dop r where r._Fld21137RRef = 0xAEBFB496910DCFD611EB9209C2655457 and r._Reference188_IDRRef=n._IDRRef) as [Сквозной цвет]
, (SELECT TOP 1 upakovka FROM pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) as 'Базовая упаковка'
, rating.ozon as 'Качество контента Ozon'
, rating.wb as 'Качество контента WB'
, rating.wb_by_ozon as 'Качество контента WB by Ozon'
, rating.magok as 'Качество контента Magok'
, (select r._Description from [MAG_2019].[dbo].[_Reference69] /*виды ном*/ r WHERE r._IDRRef = n._Fld21053RRef) as [Вид номенклатуры]
from
[mag_2019].[dbo]._Reference188X1 n /*номенклатура*/
LEFT JOIN [mag_pbi].[pbi].[content_rating] rating /* Качество контента */ ON rating.code = n._Code
LEFT JOIN [mag_2019].[dbo].[_InfoRg27043X1] /* Регистр сведений QR коды */ qr ON qr._Fld27044RRef = n._IDRRef
LEFT JOIN [mag_2019].[dbo]._Reference191X1 f /*номенклатураПрисоедФайлы*/
ON f._IDRRef = n._Fld21086RRef
WHERE n._Folder = 1
) as nom_2019
ALTER TABLE mag_pbi.pbi.nomenclature
ADD max_year_quantity NUMERIC(38,3) NULL;
ALTER TABLE mag_pbi.pbi.nomenclature
ADD max_quarter_quantity NUMERIC(38,3) NULL;
ALTER TABLE [mag_pbi].[pbi].[nomenclature] ADD [Цена учетная, руб] DECIMAL(18,7) NULL;
ALTER TABLE [mag_pbi].[pbi].[nomenclature] ADD [Цена учетная, usd] DECIMAL(18,7) NULL;
-- Шаг 1: CTE для отбора строк из 'Себестоимость'
WITH Закупки AS (
SELECT
CAST(s.[Период] AS DATE) AS [Период],
s.[artic_id],
s.[Количество] AS [Кол-во закупка],
s.[Закупка] AS [Закуп.Закупка, руб],
s.[Закупка, usd2] AS [Закуп.Закупка, usd2],
s.[Доставка] AS [Закуп.Доставка, руб],
s.[Таможня] AS [Закуп.Таможня, руб],
s.[НДС] AS [Закуп.НДС, руб],
s.[Производство] AS [Закуп.Производство, руб],
s.[Доп расходы] AS [Закуп.Доп расходы, руб],
s.[Курс usd2]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[Вид операции] = 'Приход'
AND s.[Статья] IN (
'Закупка',
'Ввод начальных остатков',
'Производство товара',
'Доставка контейнера ВЭД',
'НДС',
'Доп расходы'
)
),
-- Шаг 2: Получить максимальную дату по каждому товару
МаксДата AS (
SELECT
z.artic_id,
MAX(z.[Период]) AS LastKnowDate
FROM Закупки z
GROUP BY z.artic_id
),
-- Шаг 3: Вычисление последней закупочной цены
ПоследняяЦена AS (
SELECT TOP (1) WITH TIES
z.artic_id,
z.[Период],
SUM(ISNULL(z.[Закуп.Закупка, руб],0) + ISNULL(z.[Закуп.Таможня, руб],0) + ISNULL(z.[Закуп.Доставка, руб],0) +
ISNULL(z.[Закуп.НДС, руб],0) + ISNULL(z.[Закуп.Производство, руб],0) - ISNULL(z.[Закуп.Доп расходы, руб],0)
) AS [Сумма закупки, руб],
SUM(ISNULL(z.[Закуп.Закупка, usd2],0) + (
ISNULL(z.[Закуп.Таможня, руб],0) + ISNULL(z.[Закуп.Доставка, руб],0) +
ISNULL(z.[Закуп.НДС, руб],0) + ISNULL(z.[Закуп.Производство, руб],0) -
ISNULL(z.[Закуп.Доп расходы, руб],0)) / z.[Курс usd2]
) AS [Сумма закупки, usd],
SUM(z.[Кол-во закупка]) AS [Кол-во закупка]
FROM Закупки z
INNER JOIN МаксДата m ON z.artic_id = m.artic_id AND z.[Период] <= m.LastKnowDate
GROUP BY z.artic_id, z.[Период]
ORDER BY ROW_NUMBER() OVER (PARTITION BY z.artic_id ORDER BY z.[Период] DESC)
)
-- Шаг 4: Обновление таблицы Номенклатура
UPDATE n
SET
n.[Цена учетная, руб] =
CASE
WHEN p.[Кол-во закупка] = 0 THEN 0
ELSE p.[Сумма закупки, руб] * 1.0 / p.[Кол-во закупка]
END,
n.[Цена учетная, usd] =
CASE
WHEN p.[Кол-во закупка] = 0 THEN 0
ELSE p.[Сумма закупки, usd] * 1.0 / p.[Кол-во закупка]
END
FROM [mag_pbi].[pbi].[nomenclature] n
INNER JOIN ПоследняяЦена p ON n.[artic_id] = p.artic_id
------------ Ср. кв. отклонение ----------------------
ALTER TABLE [mag_pbi].[pbi].[nomenclature]
ADD СредниеМесячныеПродажи FLOAT,
СКО_МесячныхПродаж FLOAT,
--minAvailableQty10 decimal(18,4) NULL, /* минимальный остаток = 10% от СредниеМесячныеПродажи*/
minAvailableQty decimal(18,4) NULL;
WITH MonthlySales AS (
SELECT
[1c_id],
DATEFROMPARTS(YEAR([Период]), MONTH([Период]), 1) AS Месяц,
--FORMAT(Период, 'yyyy-MM') AS Месяц, /*этот код дает ошибку,делает дубли строк и дат внутри месяца, заменила*/
SUM(КоличествоУпаковок) AS СуммаПродаж
FROM [pbiProd].[СводныйСебестоимость Для PBI]
WHERE
[Статья] = 'Реализация'
AND [Вид операции] = 'Расход'
AND [Период] >= DATEFROMPARTS(YEAR(DATEADD(MONTH, -12, GETDATE())), MONTH(DATEADD(MONTH, -12, GETDATE())), 1)
AND [Период] < DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) /*добавила, нам нужно 12 полных месяцев*/
GROUP BY [1c_id], DATEFROMPARTS(YEAR([Период]), MONTH([Период]), 1) --FORMAT(Период, 'yyyy-MM')
),
Stats AS (
SELECT
[1c_id],
AVG(ISNULL(СуммаПродаж, 0)) AS СредниеМесячныеПродажи,
STDEVP(ISNULL(СуммаПродаж, 0)) AS СКО_МесячныхПродаж
FROM MonthlySales
GROUP BY [1c_id]
)
UPDATE n
SET
n.СредниеМесячныеПродажи = s.СредниеМесячныеПродажи,
n.СКО_МесячныхПродаж = s.СКО_МесячныхПродаж,
n.minAvailableQty =
CASE
WHEN s.СредниеМесячныеПродажи IS NULL
OR s.СредниеМесячныеПродажи = 0
THEN 0.1
WHEN s.СредниеМесячныеПродажи >= 100
THEN 10
ELSE s.СредниеМесячныеПродажи * 0.1
END
FROM [mag_pbi].[pbi].[nomenclature] n
LEFT JOIN Stats s ON n.[1c_id] = s.[1c_id];
------------------------------------------------------
/* старый расчет минимального остатка
----- Минимальный доступный остаток, используется для определения есть товар на складе или нет ------------
DECLARE @from_date date = '2024-01-01';
DECLARE @N_min int = 20; -- минимальное число строк продаж, чтобы доверять перцентилю SKU
/* === 0) Добавим колонку minAvailableQty, если её нет === */
IF COL_LENGTH('[mag_pbi].[pbi].[nomenclature]', 'minAvailableQty') IS NULL
BEGIN
ALTER TABLE [mag_pbi].[pbi].[nomenclature]
ADD minAvailableQty decimal(18,4) NULL;
END
/* === 1) Продажи: берём только фактический расход > 0 === */
IF OBJECT_ID('tempdb..#sales') IS NOT NULL DROP TABLE #sales;
SELECT
CAST(s.[Период] AS date) AS order_date,
CAST(s.[КоличествоУпаковок] AS decimal(18,4)) AS qty,
s.[1c_id] AS sku_id
INTO #sales
FROM [pbiProd].[СводныйСебестоимость Для PBI] s
WHERE
s.[Статья] = N'Реализация'
AND s.[Вид операции] = N'Расход'
AND s.[КоличествоУпаковок] > 0
AND s.[Период] >= @from_date;
/* === 2) Перцентиль P20 по SKU === */
IF OBJECT_ID('tempdb..#sku_q') IS NOT NULL DROP TABLE #sku_q;
WITH q AS (
SELECT
sku_id,
PERCENTILE_CONT(0.20) WITHIN GROUP (ORDER BY qty)
OVER (PARTITION BY sku_id) AS q20_sku,
COUNT(*) OVER (PARTITION BY sku_id) AS n_lines
FROM #sales
)
SELECT DISTINCT
sku_id,
q20_sku,
n_lines,
-- базовая нормализация: минимум 1 и округление вверх до целого
CAST(CASE
WHEN q20_sku IS NULL OR q20_sku < 1 THEN 1
ELSE CEILING(q20_sku)
END AS decimal(18,4)) AS min_avail_sku
INTO #sku_q
FROM q;
/* === 3) Категория 1-го уровня: берём 1-й сегмент из groups.path (без вьюх) === */
IF OBJECT_ID('tempdb..#sku_catL1') IS NOT NULL DROP TABLE #sku_catL1;
SELECT
n.[1c_id] AS sku_id,
-- первый сегмент до ' | ' или весь path, если разделителя нет
CAST(CASE
WHEN CHARINDEX(N' | ', g.path) > 0
THEN LEFT(g.path, CHARINDEX(N' | ', g.path) - 1)
ELSE g.path
END AS nvarchar(200)) AS category_l1
INTO #sku_catL1
FROM [mag_pbi].[pbi].[nomenclature] n
JOIN [mag_pbi].[pbi].[groups] g
ON g.group_id = n.group_id;
/* === 4) Перцентиль P20 по категории 1-го уровня (фолбэк) === */
IF OBJECT_ID('tempdb..#cat_q') IS NOT NULL DROP TABLE #cat_q;
WITH sales_cat AS (
SELECT
c.category_l1,
s.qty
FROM #sales s
JOIN #sku_catL1 c
ON c.sku_id = s.sku_id
),
qcat AS (
SELECT
category_l1,
PERCENTILE_CONT(0.20) WITHIN GROUP (ORDER BY qty)
OVER (PARTITION BY category_l1) AS q20_cat,
COUNT(*) OVER (PARTITION BY category_l1) AS n_lines_cat
FROM sales_cat
)
SELECT DISTINCT
category_l1,
q20_cat,
n_lines_cat,
CAST(CASE
WHEN q20_cat IS NULL OR q20_cat < 1 THEN 1
ELSE CEILING(q20_cat)
END AS decimal(18,4)) AS min_avail_cat
INTO #cat_q
FROM qcat;
/* === 5) Выбор порога: если по SKU достаточно строк — берём SKU, иначе — по категории === */
IF OBJECT_ID('tempdb..#final_min') IS NOT NULL DROP TABLE #final_min;
SELECT
n.[1c_id] AS sku_id,
COALESCE(
CASE WHEN q.n_lines >= @N_min AND q.min_avail_sku IS NOT NULL
THEN q.min_avail_sku END,
cq.min_avail_cat, -- фолбэк по категории
CAST(1 AS decimal(18,4)) -- на крайний случай
) AS min_avail_final
INTO #final_min
FROM [mag_pbi].[pbi].[nomenclature] n
LEFT JOIN #sku_q q
ON q.sku_id = n.[1c_id]
LEFT JOIN #sku_catL1 c
ON c.sku_id = n.[1c_id]
LEFT JOIN #cat_q cq
ON cq.category_l1 = c.category_l1;
/* === 6) Обновляем поле в номенклатуре === */
UPDATE n
SET n.minAvailableQty = f.min_avail_final
FROM [mag_pbi].[pbi].[nomenclature] n
JOIN #final_min f
ON f.sku_id = n.[1c_id]; */
-------------------------------------------
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190908-132726] ON [pbi].nomenclature
(
[group_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
--GO
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190908-132728] ON [pbi].nomenclature
(
[code] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
--GO
CREATE CLUSTERED INDEX [ClusteredIndex-20210315-180007] ON [pbi].[nomenclature]
(
[1c_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
DROP TABLE IF EXISTS #dop
END
GO
/****** Object: StoredProcedure [pbi].[migrate_ostatki] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_ostatki] as
BEGIN
--DROP TABLE IF EXISTS mag_pbi.pbi.ostatki
DELETE FROM mag_pbi.pbi.ostatki WHERE [date] >= '2025-01-01'
INSERT INTO mag_pbi.pbi.ostatki
([artic_id],[1c_id],[Code],[sklad],[Категория склада],[upakovok],[quantity],[upakovka],[date],[upakovok_ship],[quantity_ship])
SELECT
LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), n._IDRRef, 2),5,12) )) as 'artic_id'
, n._IDRRef as '1c_id'
, n._Code as Code
, s._Description as sklad
, s.[Категория] as [Категория склада]
, [_Fld17491]/(case (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) when 0 then 1 else (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) end)*(case _RecordKind when 0 then 1 when 1 then -1 end)
as upakovok
, [_Fld17491]*(case _RecordKind when 0 then 1 when 1 then -1 end) as quantity
, (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) as upakovka
/*, (SELECT top 1 [_Fld27138] / 1000 FROM [mag_2019].[dbo].[_InfoRg27129X1] ir WHERE ir._Fld27130RRef = n._IDRRef AND [_Fld27138] > 0 order by ir._period desc)
as [Учетная цена, старое]*/
, DATEADD(year, -2000, t._Period) as [date]
, [_Fld17492]/(case (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) when 0 then 1 else (SELECT TOP 1 upakovka FROM mag_pbi.pbi.[БазоваяУпаковка] up WHERE n._IDRRef = up._OwnerID_RRRef) end)*(case _RecordKind when 0 then 1 when 1 then -1 end)
as [upakovok_ship]
, [_Fld17492]*(case _RecordKind when 0 then 1 when 1 then -1 end) as [quantity_ship]
FROM [mag_2019].[dbo].[_AccumRg17484] t /*регистр товары на складах*/
INNER JOIN [mag_2019].[dbo]._Reference188X1 n /*номенклатура*/ ON n._IDRRef = t._Fld17485RRef
INNER JOIN [mag_pbi].[pbi].[sklad_2019] s /*склад*/ ON s._IDRRef = t._Fld17488RRef
WHERE t._Period >='4025-01-01' --AND n._IDRRef=0x80F60CC47A052DFD11E7D04C512712B6
--DROP TABLE IF EXISTS mag_pbi.pbi.ostatki_short
DELETE FROM mag_pbi.pbi.ostatki_short WHERE [date] >= '2025-01-01'
-- добавляем остатки за период c 1 января 2025 года до последнего числа месяца, который был 3 месяца назад, свернутые по месяцам
INSERT INTO mag_pbi.pbi.ostatki_short
([artic_id],[1c_id],[Code],[sklad],[Категория склада],[upakovok],[quantity],
[upakovka],[date],[upakovok_ship],[quantity_ship])
SELECT
[artic_id]
,[1c_id]
,[Code]
,[sklad]
,[Категория склада]
,sum([upakovok]) as [upakovok]
,sum([quantity]) as [quantity]
,avg([upakovka]) as [upakovka]
--,CASE WHEN sum(quantity) <> 0 THEN sum([quantity]*[Учетная цена по себест])/sum(quantity) ELSE 0 END as [Учетная цена по себест]
--,CASE WHEN sum(quantity) <> 0 THEN sum([quantity]*[Учетная цена по себест, usd2+2])/sum(quantity) ELSE 0 END as [Учетная цена по себест, usd2+2]
--,avg(UchetnajaCena) as UchetnajaCena
, DATEADD(mm, DATEDIFF(mm,0,[date]), 0) as [date]
,sum([upakovok_ship]) as [upakovok_ship]
,sum([quantity_ship]) as [quantity_ship]
FROM mag_pbi.pbi.ostatki
WHERE date BETWEEN '2025-01-01'
AND DATEADD(SECOND, -1, CAST(DATEADD(DAY, 1, EOMONTH(DATEADD(MONTH, -3, GETDATE()))) AS DATETIME))
-- where [Категория склада]<>'Виртуальный'
GROUP BY [artic_id], [1c_id], [Code], [sklad], [Категория склада], DATEADD(mm, DATEDIFF(mm,0,[date]), 0)
-- добавляем остатки за 2 последних полных месяца и текущий месяц, развернутые по дням
INSERT INTO mag_pbi.pbi.ostatki_short
([artic_id],[1c_id],[Code],[sklad],[Категория склада],[upakovok],[quantity],
[upakovka],[date],[upakovok_ship],[quantity_ship])
SELECT
[artic_id]
,[1c_id]
,[Code]
,[sklad]
,[Категория склада]
,[upakovok]
,[quantity]
,[upakovka]
--,[Учетная цена по себест]
--,[Учетная цена по себест, usd2+2]
,[date]
,[upakovok_ship]
,[quantity_ship]
FROM mag_pbi.pbi.ostatki
WHERE date BETWEEN
CASE
WHEN DATEADD(MONTH, -3, CAST(GETDATE() AS DATE)) < '2025-01-01'
THEN '2025-01-01'
ELSE DATEADD(DAY, -DAY(DATEADD(MONTH, -2, GETDATE())) + 1, CAST(DATEADD(MONTH, -2, GETDATE()) AS DATE ))
END
AND GETDATE()
-- добавляем остатки нового дня на маркетах в накопительную таблицу [pbi].[ostatki_mp]
INSERT INTO [mag_pbi].[pbi].[ostatki_mp]
([Дата],[Узел],[artic_id],[id_внешний],[Остаток МП, упак],[Доступно МП, упак], [Остаток МП, шт])
SELECT
CAST(src.[Дата обновления] AS DATE) AS [Дата],
src.[Узел],
src.[artic_id],
src.[id_внешний],
SUM(src.[Количество]),
SUM(src.[Доступное кол-во]),
SUM(src.[Остаток МП, шт])
FROM [mag_pbi].[pbi].[Внешние остатки] AS src
WHERE
src.[Тип] = 'Остатки'
AND CAST(src.[Дата обновления] AS DATE) >
ISNULL(
(SELECT MAX([Дата]) FROM [mag_pbi].[pbi].[ostatki_mp]),
'2000-01-01'
)
GROUP BY CAST(src.[Дата обновления] AS DATE), src.[Узел], src.[artic_id], src.[id_внешний];
/*
ALTER TABLE mag_pbi.pbi.ostatki add [Учетная цена по себест] numeric(38,15) NULL default 0
ALTER TABLE mag_pbi.pbi.ostatki add [Учетная цена по себест, usd2+2] numeric(38,15) NULL default 0
ALTER TABLE mag_pbi.pbi.ostatki add [Учетная цена, старое] numeric(38,15) NULL default 0
*/
-- добавляем учетную цену из таблицы [pbiProd].[СебестоимостьСводныйОт2022]
/*UPDATE mag_pbi.pbi.ostatki SET
[Учетная цена по себест] =
(
SELECT TOP 1 s.[Учетная цена]
FROM [pbiProd].[СебестоимостьСводныйОт2022] s
--WHERE s. [Вид операции]='Продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date AND s.[Учетная цена] <> 0
-- Такое сравнение даты использовано для скорости. Что делает? Приводит обе даты к началу месяца и берет в себестоимости более ранние или такие же даты, как в остатках
WHERE [Статья]='Реализация' AND s.[1c_id]=o.[1c_id] AND s.[Период]<=o.date -- AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(o.date) * 100 + MONTH(o.date))
ORDER BY s.[Период] DESC)
, [Учетная цена по себест, usd2+2] =
( SELECT TOP 1 s.[Учетная цена USD2+2]
FROM [pbiProd].[СебестоимостьСводныйОт2022] s
--WHERE s. [Вид операции]='Продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date AND s.[Учетная цена USD2+2] <> 0
WHERE [Статья]='Реализация' AND s.[1c_id]=o.[1c_id] AND s.[Период]<=o.date -- AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(o.date) * 100 + MONTH(o.date))
ORDER BY s.[Период] DESC
)
FROM mag_pbi.pbi.ostatki o
WHERE o.date >= '2025-01-01'*/
-- обновляем учетку по закупкам, тк в продажах не было
/*UPDATE p SET
[Учетная цена по себест] =
( SELECT top 1 s.[Учетная цена]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
ORDER by s.Период DESC
),
[Учетная цена по себест, usd2+2] =
( SELECT top 1 s.[Учетная цена USD2+2]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
ORDER by s.Период DESC)
FROM mag_pbi.pbi.ostatki p
WHERE p.[Учетная цена по себест] is null AND p.date >= '2025-01-01'*/
-- обновляем учетку по вводу начальных остатков
/*UPDATE p SET
[Учетная цена по себест] =
( SELECT top 1 s.[Учетная цена]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
ORDER by s.Период DESC
),
[Учетная цена по себест, usd2+2] =
( SELECT top 1 s.[Учетная цена USD2+2]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
ORDER by s.Период DESC)
FROM mag_pbi.pbi.ostatki p
WHERE p.[Учетная цена по себест] is null AND p.date >= '2025-01-01'
UPDATE mag_pbi.pbi.ostatki SET [Учетная цена по себест] = 0 WHERE [Учетная цена по себест] is null
UPDATE mag_pbi.pbi.ostatki SET [Учетная цена по себест, usd2+2] = 0 WHERE [Учетная цена по себест, usd2+2] is null*/
-- добавляем остатки за 2025 год, свернутые по месяцам
/*SELECT
[artic_id]
,[1c_id]
,[Code]
,[sklad]
,[Категория склада]
,sum([upakovok]) as [upakovok]
,sum([quantity]) as [quantity]
,avg([upakovka]) as [upakovka]
,CASE WHEN sum(quantity) <> 0 THEN sum([quantity]*[Учетная цена по себест])/sum(quantity) ELSE 0 END as [Учетная цена по себест]
,CASE WHEN sum(quantity) <> 0 THEN sum([quantity]*[Учетная цена по себест, usd2+2])/sum(quantity) ELSE 0 END as [Учетная цена по себест, usd2+2]
--,avg(UchetnajaCena) as UchetnajaCena
, DATEADD(mm, DATEDIFF(mm,0,[date]), 0) as [date]
FROM mag_pbi.pbi.ostatki
WHERE date>='2025-01-01'
-- where [Категория склада]<>'Виртуальный'
GROUP BY [artic_id], [1c_id], [Code], [sklad], [Категория склада], DATEADD(mm, DATEDIFF(mm,0,[date]), 0)*/
--ALTER TABLE mag_pbi.pbi.ostatki_short add [Учетная цена по себест] numeric(38,15) NULL default 0
--ALTER TABLE mag_pbi.pbi.ostatki_short add [Учетная цена по себест, usd2+2] numeric(38,15) NULL default 0
--ALTER TABLE mag_pbi.pbi.ostatki_short add [Учетная цена, старое] numeric(38,15) NULL default 0
/*
CREATE NONCLUSTERED INDEX [NonClusteredIndex-2-1] ON [pbi].ostatki_short
(
[artic_id] ASC,
[date] ASC
)
*/
-------------------------------------------------------------- OLD
/*
UPDATE mag_pbi.pbi.ostatki_short SET
[Учетная цена по себест] =
(
SELECT TOP 1 s.[Учетная цена]
FROM [pbiProd].[СебестоимостьСводныйОт2022] s
--WHERE s. [Вид операции]='Продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date AND s.[Учетная цена] <> 0
-- Такое сравнение даты использовано для скорости. Что делает? Приводит обе даты к началу месяца и берет в себестоимости более ранние или такие же даты, как в остатках
WHERE [Статья]='Реализация' AND s.[1c_id]=o.[1c_id] AND s.[Период]<=o.date -- AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(o.date) * 100 + MONTH(o.date))
ORDER BY s.[Период] DESC)
, [Учетная цена по себест, usd2+2] =
( SELECT TOP 1 s.[Учетная цена USD2+2]
FROM [pbiProd].[СебестоимостьСводныйОт2022] s
--WHERE s. [Вид операции]='Продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date AND s.[Учетная цена USD2+2] <> 0
WHERE [Статья]='Реализация' AND s.[1c_id]=o.[1c_id] AND s.[Период]<=o.date -- AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(o.date) * 100 + MONTH(o.date))
ORDER BY s.[Период] DESC
)
FROM mag_pbi.pbi.ostatki_short o
-- обновляем учетку по закупкам, тк в продажах не было
UPDATE p SET
[Учетная цена по себест] =
( SELECT top 1 s.[Учетная цена]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
ORDER by s.Период DESC
),
[Учетная цена по себест, usd2+2] =
( SELECT top 1 s.[Учетная цена USD2+2]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
ORDER by s.Период DESC)
FROM mag_pbi.pbi.ostatki_short p
WHERE p.[Учетная цена по себест] is null
-- обновляем учетку по вводу начальных остатков
UPDATE p SET
[Учетная цена по себест] =
( SELECT top 1 s.[Учетная цена]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
ORDER by s.Период DESC
),
[Учетная цена по себест, usd2+2] =
( SELECT top 1 s.[Учетная цена USD2+2]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0 AND (YEAR(s.[Период]) * 100 + MONTH(s.[Период])) <= (YEAR(p.date) * 100 + MONTH(p.date)) -- AND s.[Период]<=p.date
ORDER by s.Период DESC)
FROM mag_pbi.pbi.ostatki_short p
WHERE p.[Учетная цена по себест] is null
UPDATE mag_pbi.pbi.ostatki_short SET [Учетная цена по себест] = 0 WHERE [Учетная цена по себест] is null
UPDATE mag_pbi.pbi.ostatki_short SET [Учетная цена по себест, usd2+2] = 0 WHERE [Учетная цена по себест, usd2+2] is null
*/
-- Тут старый код со старым регистром сведений
/*
UPDATE mag_pbi.pbi.ostatki_short SET
[Учетная цена по себест] = isnull(
(SELECT top 1 its.[_Fld27138] / 1000 FROM [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
WHERE its._Fld27130RRef = [1C_id] AND its.[_Fld27138] > 0
ORDER BY its._period desc)
,0
)
FROM mag_pbi.pbi.ostatki_short o
WHERE [Учетная цена по себест] = 0 OR [Учетная цена по себест] is null
UPDATE mag_pbi.pbi.ostatki_short SET
[Учетная цена по себест, usd2+2] = isnull(
(SELECT top 1 its.[_Fld27138] / 1000 / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, _Period) <= o.date
ORDER BY _Period desc)
FROM [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
WHERE its._Fld27130RRef = [1C_id] AND its.[_Fld27138] > 0
ORDER BY its._period desc)
,0
)
FROM mag_pbi.pbi.ostatki_short o
WHERE [Учетная цена по себест, usd2+2] = 0 OR [Учетная цена по себест, usd2+2] is null
*/
/*
UPDATE mag_pbi.pbi.ostatki_short SET
[Учетная цена по себест] = isnull(
(SELECT TOP 1 s.[Учетная цена, новое] FROM [pbi].[Себестоимость] s
WHERE s. [Вид операции]='продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date --AND s.[Учетная цена, новое] <> 0
ORDER BY s.[Период] desc)
, 0 )
FROM mag_pbi.pbi.ostatki_short o */
/*
UPDATE mag_pbi.pbi.ostatki_short SET
[Учетная цена по себест] =
isnull(
(
SELECT top 1 its.[_Fld27138] / 1000 FROM [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
WHERE its._Fld27130RRef = [1C_id] AND its.[_Fld27138] > 0
--and datediff(month, DATEADD(year, -2000, its._Period), date) >= 0
ORDER BY its._period desc)
,0
)
FROM mag_pbi.pbi.ostatki_short o
WHERE [Учетная цена по себест] = 0 OR [Учетная цена по себест] is null */
/*
UPDATE mag_pbi.pbi.ostatki SET
[Учетная цена, старое] =
isnull(
(
SELECT top 1 its.[_Fld27138] / 1000 FROM [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
WHERE its._Fld27130RRef = [1C_id] AND its.[_Fld27138] > 0
and datediff(month, DATEADD(year, -2000, its._Period), date) >= 0
ORDER BY its._period desc)
,0
)
FROM mag_pbi.pbi.ostatki o
*/
/*
UPDATE mag_pbi.pbi.ostatki_short SET
[Учетная цена по себест] = isnull(
(SELECT TOP 1 s.[Учетная цена, старое]
FROM [pbi].[Себестоимость] s
WHERE s. [Вид операции]='продажа' AND s.artic_id=o.[artic_id] AND s.[Период]<=o.date AND s.[Учетная цена, старое] > 0
ORDER BY s.[Период] desc)
,0)
FROM mag_pbi.pbi.ostatki_short o
WHERE [Учетная цена по себест] = 0 OR [Учетная цена по себест] is null
*/
END
GO
/****** Object: StoredProcedure [pbi].[migrate_ostatok_da_net] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_ostatok_da_net]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Date1 DATE, @Date2 DATE
SET @Date1 = '2024-01-01'
SET @Date2 = CAST( GETDATE() AS Date )
drop table pbi.[w_ostatok_da_net]
SELECT * INTO pbi.[w_ostatok_da_net] FROM
(
SELECT DATEADD(DAY,number+1,@Date1) [dt]
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number+1,@Date1) < @Date2
)as t1
cross join
(
select
[1c_id] as [_IDRREF]
, [artic_id]
, n.minAvailableQty
--, n.minAvailableQty10
from pbi.nomenclature n
--where [статус] in (/*'Выведен из ассортимента',*/ 'Основной', 'Базовый', 'Маркетплейс', 'Обособленное обеспечение', 'New')
)as t2
ALTER TABLE pbi.[w_ostatok_da_net] ADD [ostatok] numeric (15,6) NULL;
--ALTER TABLE pbi.[w_ostatok_da_net] ADD [ostatok10] numeric (15,6) NULL;
ALTER TABLE pbi.[w_ostatok_da_net] ADD [quantity] numeric (15,6) NULL;
ALTER TABLE pbi.[w_ostatok_da_net] ADD [upakovok] numeric (15,6) NULL;
ALTER TABLE pbi.[w_ostatok_da_net] ADD sellable_stock decimal(18,6) NULL
UPDATE pbi.[w_ostatok_da_net] set [quantity] = (
select sum(o.[quantity])-- >= n.minAvailableQty then sum(o.[quantity]) else 0 end
FROM [mag_pbi].[pbi].[ostatki_short] o
WHERE o.[1c_id]=n.[_IDRREF] AND ([Категория склада] IN ('Хранение', 'Розничная точка', 'Фасовка')) AND o.date <= n.[dt]
)
FROM pbi.[w_ostatok_da_net] n
UPDATE pbi.[w_ostatok_da_net] set [upakovok] = (
select sum(o.[upakovok])-- >= n.minAvailableQty then sum(o.[quantity]) else 0 end
FROM [mag_pbi].[pbi].[ostatki_short] o
WHERE o.[1c_id]=n.[_IDRREF] AND ([Категория склада] IN ('Хранение', 'Розничная точка', 'Фасовка')) AND o.date <= n.[dt]
)
FROM pbi.[w_ostatok_da_net] n
UPDATE pbi.[w_ostatok_da_net] set [ostatok] = case when [upakovok] >= minAvailableQty then 1 else 0 end
--UPDATE pbi.[w_ostatok_da_net] set [ostatok10] = case when [upakovok] >= minAvailableQty10 then 1 else 0 end
--Добавляем остатки МП, если они еще не заполнены. Проверяем последние 3 дня
ALTER TABLE pbi.[w_ostatok_da_net] ADD [quantity_mp] numeric (15,6) NULL;
ALTER TABLE pbi.[w_ostatok_da_net] ADD [upakovok_mp] numeric (15,6) NULL;
ALTER TABLE pbi.[w_ostatok_da_net] ADD [dostupno_upakovok_mp] numeric (15,6) NULL;
ALTER TABLE pbi.[w_ostatok_da_net] ADD [ostatok_mp] numeric (15,6) NULL;
ALTER TABLE pbi.[w_ostatok_da_net] ADD [ostatok_all] numeric (15,6) NULL;
DECLARE
@DaysBack INT = 3,
@StartTime DATETIME = SYSDATETIME(),
@RowCount INT;
WITH agg AS (
SELECT
CAST(src.[Дата] AS DATE) AS [Дата],
src.[artic_id],
SUM(src.[Остаток МП, шт]) AS sum_quantity_mp,
SUM(src.[Остаток МП, упак]) AS sum_upakovok_mp,
SUM(src.[Доступно МП, упак]) AS sum_dostupno_upakovok_mp
FROM [mag_pbi].[pbi].[ostatki_mp] AS src
WHERE CAST(src.[Дата] AS DATE) >= DATEADD(DAY, -@DaysBack, CAST(GETDATE() AS DATE))
GROUP BY CAST(src.[Дата] AS DATE),src.[artic_id]
)
UPDATE tgt
SET
tgt.[quantity_mp] = ISNULL(tgt.[quantity_mp], agg.sum_quantity_mp),
tgt.[upakovok_mp] = ISNULL(tgt.[upakovok_mp], agg.sum_upakovok_mp),
tgt.[dostupno_upakovok_mp] = ISNULL(tgt.[dostupno_upakovok_mp], agg.sum_dostupno_upakovok_mp)
FROM [mag_pbi].[pbi].[w_ostatok_da_net] AS tgt
INNER JOIN agg
ON tgt.[artic_id] = agg.[artic_id]
AND CAST(tgt.[dt] AS DATE) = agg.[Дата]
WHERE
CAST(tgt.[dt] AS DATE) >= DATEADD(DAY, -@DaysBack, CAST(GETDATE() AS DATE))
AND (
tgt.[quantity_mp] IS NULL
OR tgt.[upakovok_mp] IS NULL
OR tgt.[dostupno_upakovok_mp] IS NULL
);
-- логирование результата
BEGIN TRY
INSERT INTO [analytics].[load_log_w_ostatok_da_net]
([load_time], [days_back], [rows_updated], [duration_sec])
VALUES
(
@StartTime,
@DaysBack,
@RowCount,
DATEDIFF(SECOND, @StartTime, SYSDATETIME())
);
END TRY
BEGIN CATCH
PRINT '⚠ Ошибка при записи в таблицу лога.';
END CATCH;
UPDATE pbi.[w_ostatok_da_net] set [ostatok_mp] = case when [upakovok_mp] >= minAvailableQty then 1 else 0 end
UPDATE pbi.[w_ostatok_da_net] set [ostatok_all] = case when [upakovok] >= minAvailableQty OR [upakovok_mp] >= minAvailableQty then 1 else 0 end
--Удаляем нулевые значения
DELETE FROM [mag_pbi].[pbi].[w_ostatok_da_net] WHERE [ostatok_all] < 1
CREATE NONCLUSTERED INDEX IX_w_ostatok__id_dt_desc__incl_qty
ON [pbi].[w_ostatok_da_net] ([_IDRREF], [dt] DESC)
INCLUDE ([quantity]);
CREATE NONCLUSTERED INDEX IX_w_ostatok__dt_id__incl_qty
ON [pbi].[w_ostatok_da_net] ([dt], [_IDRREF])
INCLUDE ([quantity]);
SET NOCOUNT OFF;
END
GO
/****** Object: StoredProcedure [pbi].[migrate_pricelist] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_pricelist]
AS
BEGIN
DROP TABLE [pbi].[pricelist]
SELECT *
INTO [pbi].[pricelist]
FROM(
SELECT
[_Fld15493] as Цена
, (SELECT _Description FROM MAG_2019.[dbo].[_Reference78] r WHERE r._IDRRef = i.[_Fld15492RRef]) as [Вид цены]
, i._Fld15490RRef as [1c_id]
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), i._Fld15490RRef, 2),5,12) ))as artic_id
, DATEADD(year, -2000, i._Period) as [Дата]
, _Period
FROM [MAG_2019].[dbo].[_InfoRg15489] i /*РегистрСведений.ЦеныНоменклатуры*/
) as pricelist
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20220325-100926] ON [pbi].[pricelist]
(
[1c_id] ASC,
[Вид цены] ASC,
[_Period] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
END
GO
/****** Object: StoredProcedure [pbi].[migrate_stock_balance] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_stock_balance]
AS
BEGIN
SET NOCOUNT ON;
DROP TABLE IF EXISTS mag_pbi.analytics.stock_balance;
IF NOT EXISTS (
SELECT 1
FROM sys.indexes i
INNER JOIN sys.objects o ON i.object_id = o.object_id
WHERE i.name = N'N2'
AND o.name = N'nomenclature'
AND SCHEMA_NAME(o.schema_id) = N'pbi'
)
BEGIN
CREATE NONCLUSTERED INDEX [N2]
ON [pbi].[nomenclature] ([artic_id])
INCLUDE ([Знаменатель объема],[Числитель объема],[Цена учетная, руб]);
END
;WITH Calendar AS (
SELECT CAST(GETDATE() AS DATE) AS DateValue
UNION ALL
SELECT DATEADD(DAY, 1, DateValue)
FROM Calendar
WHERE DateValue < CAST(GETDATE() AS DATE)
),
-- 2. Фильтруем таблицу остатков
Ostatki AS (
SELECT
DATEADD(year, -2000, t._Period) as [date],
LOWER(CONCAT(
SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2), 25,8),'-',
SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2),21,4),'-',
SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2),17,4),'-',
SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2), 1,4),'-',
SUBSTRING ( CONVERT(nvarchar(36), n._IDRRef, 2), 5,12)
)) as artic_id,
n._IDRRef as [1c_id],
n._Code as code,
(SELECT TOP 1 upakovka
FROM mag_pbi.pbi.[БазоваяУпаковка] up
WHERE t._Fld17485RRef = up._OwnerID_RRRef) as upakovka,
[_Fld17491] / NULLIF(
(SELECT TOP 1 upakovka
FROM mag_pbi.pbi.[БазоваяУпаковка] up
WHERE t._Fld17485RRef = up._OwnerID_RRRef), 0
) * (CASE _RecordKind WHEN 0 THEN 1 WHEN 1 THEN -1 END) as upakovok,
[_Fld17491] * (CASE _RecordKind WHEN 0 THEN 1 WHEN 1 THEN -1 END) as quantity
FROM [MAG_2019].[dbo].[_AccumRg17484] t /*Регистр ТоварыНаСкладах*/
INNER JOIN [mag_pbi].[pbi].[sklad_2019] s ON s._IDRRef = t._Fld17488RRef
FULL OUTER JOIN [mag_2019].[dbo]._Reference188X1 n ON t._Fld17485RRef = n._IDRRef
WHERE s.[Категория] <> 'Виртуальный'
),
-- 3. Накопительный итог по каждому артикулу и дате
CumulativeStock AS (
SELECT
c.DateValue AS [Дата],
o.artic_id,
o.[1c_id],
o.code,
SUM(ISNULL(o.quantity, 0)) AS [Остаток склад шт],
SUM(ISNULL(o.upakovok, 0)) AS [Остаток склад упак],
/* рассчитывается далее */
CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад руб],
CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад м3],
/* новые колонки по МП */
CAST(NULL AS NUMERIC(26,7)) AS [Остаток МП, шт],
CAST(NULL AS NUMERIC(26,7)) AS [Остаток МП, руб],
CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + МП, шт],
CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + МП, руб],
/* уже существующие комбинированные показатели */
CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + в пути + произв., упак],
CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + в пути + произв., руб],
CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + МП + в пути + произв., упак],
CAST(NULL AS NUMERIC(26,7)) AS [Остаток склад + МП + в пути + произв., руб]
FROM Calendar c
JOIN Ostatki o ON o.[date] <= c.DateValue
GROUP BY c.DateValue, o.artic_id, o.[1c_id], o.code
)
-- 4. Результат в таблицу
SELECT * INTO mag_pbi.analytics.stock_balance
FROM CumulativeStock
ORDER BY [Дата];
-- Остаток на складе: руб и м3
UPDATE sb
SET
[Остаток склад м3] = sb.[Остаток склад шт] * ISNULL(n.[Числитель объема], 0)
/ NULLIF(ISNULL(n.[Знаменатель объема], 1), 0),
[Остаток склад руб] = sb.[Остаток склад шт] * ISNULL(n.[Цена учетная, руб], 0)
FROM mag_pbi.analytics.stock_balance sb
LEFT JOIN mag_pbi.pbi.nomenclature n ON sb.artic_id = n.artic_id;
-- Добавляем остаток "в пути" и "в производстве"
;WITH Aggregated AS (
SELECT
sb.artic_id,
sb.[Дата],
sb.[Остаток склад руб],
sb.[Остаток склад упак],
SUM(ISNULL(z.[Сумма в руб.], 0)) AS [В пути и произв., руб],
SUM(ISNULL(z.[Кол. упаковок], 0)) AS [В пути и произв., упак]
FROM mag_pbi.analytics.stock_balance sb
LEFT JOIN mag_pbi.analytics.Заказы z
ON z.artic_id = sb.artic_id
AND z.[Дата заказа поставщику] <= sb.[Дата]
AND z.[Статус] IN ('В пути', 'В производстве')
GROUP BY sb.artic_id, sb.Дата, sb.[Остаток склад руб], sb.[Остаток склад упак]
)
UPDATE sb
SET
[Остаток склад + в пути + произв., упак] = a.[Остаток склад упак] + ISNULL(a.[В пути и произв., упак], 0),
[Остаток склад + в пути + произв., руб] = a.[Остаток склад руб] + ISNULL(a.[В пути и произв., руб], 0)
FROM mag_pbi.analytics.stock_balance sb
LEFT JOIN Aggregated a
ON sb.artic_id = a.artic_id
AND sb.Дата = a.Дата;
-- Добавляем остаток МП за последнюю дату обновления из регистра сведений
;WITH AggregMarketplace AS (
SELECT
DATEADD(YEAR, -2000, ost._Fld33596) AS [Дата обновления],
LOWER(CONCAT(
SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2), 25,8),'-',
SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2), 21,4),'-',
SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2), 17,4),'-',
SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2), 1,4),'-',
SUBSTRING ( CONVERT(nvarchar(36), ost.[_Fld28683RRef], 2), 5,12)
)) AS artic_id,
SUM(ISNULL(ost._Fld33602, 0)) AS [Остаток МП упак]
FROM [MAG_2019].[dbo].[_InfoRg28682X1] AS ost /* РегистрСведений.ОстаткиТоваровВоВнешнихСистемах */
WHERE ost._Fld33596 = (
SELECT TOP (1) _Fld33596
FROM [MAG_2019].[dbo].[_InfoRg28682X1]
ORDER BY _Fld33596 DESC
)
GROUP BY ost._Fld28683RRef, ost._Fld33596
)
-- Обновляем МП и комбинированные колонки
UPDATE sb
SET
/* МП → шт и руб */
[Остаток МП, шт] = ISNULL(mp.[Остаток МП упак], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0),
[Остаток МП, руб] = (
ISNULL(mp.[Остаток МП упак], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0)
) * ISNULL(n.[Цена учетная, руб], 0),
/* Склад + МП */
[Остаток склад + МП, шт] = sb.[Остаток склад шт] + (
ISNULL(mp.[Остаток МП упак], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0)
),
[Остаток склад + МП, руб] = sb.[Остаток склад руб] + (
ISNULL(mp.[Остаток МП упак], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0) * ISNULL(n.[Цена учетная, руб], 0)
),
/* Склад + МП + в пути + произв. (как было) */
[Остаток склад + МП + в пути + произв., упак] = sb.[Остаток склад + в пути + произв., упак] + ISNULL(mp.[Остаток МП упак], 0),
[Остаток склад + МП + в пути + произв., руб] = sb.[Остаток склад + в пути + произв., руб] + (
ISNULL(mp.[Остаток МП упак], 0) * ISNULL(n.[Цена учетная, руб], 0) * NULLIF(ISNULL(n.[Базовая упаковка], 1), 0)
)
FROM mag_pbi.analytics.stock_balance sb
LEFT JOIN mag_pbi.pbi.nomenclature n
ON sb.artic_id = n.artic_id
LEFT JOIN AggregMarketplace mp
ON sb.artic_id = mp.artic_id
AND sb.Дата = mp.[Дата обновления];
--OPTION (MAXRECURSION 0); -- при необходимости для Calendar
END
GO
/****** Object: StoredProcedure [pbi].[migrate_uchet_summa] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[migrate_uchet_summa]
AS
BEGIN
DROP TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi]
SELECT s.*
INTO [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
INNER JOIN [mag_2019].[dbo]._Reference188X1 n /*номенклатура*/ ON n._IDRRef = s.[1c_id]
INNER JOIN [mag_pbi].[pbi].[groups] g ON n._ParentIDRRef = g.[1c_id]
WHERE g.g <> '*Внутренняя'
/*ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] DROP COLUMN [Учетная сумма, руб]*/
/*ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] DROP COLUMN [Учетная сумма, usd]*/
ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] ADD [Учетная сумма, руб] DECIMAL(21, 9) NULL
ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] ADD [Учетная сумма, usd] DECIMAL(21, 9) NULL
ALTER TABLE [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] ADD [Источник заказа] NVARCHAR(50) NULL
UPDATE s
SET s.[Учетная сумма, руб] = v.[Учетная сумма, руб]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] s
LEFT JOIN [mag_pbi].[pbi].[УчетнаяСуммаДляPBI] v
ON s.[Период] = v.[Период]
AND s.[artic_id] = v.[artic_id]
AND s.[1c_document_id] = v.[1c_document_id]
AND s.[Количество] = v.[Количество]
AND [Статья] = 'Реализация'
UPDATE s
SET s.[Учетная сумма, usd] = v.[Учетная сумма, usd]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] s
LEFT JOIN [mag_pbi].[pbi].[УчетнаяСуммаДляPBI] v
ON s.[Период] = v.[Период]
AND s.[artic_id] = v.[artic_id]
AND s.[1c_document_id] = v.[1c_document_id]
AND s.[Количество] = v.[Количество]
AND [Статья] = 'Реализация'
UPDATE s
SET s.[Источник заказа] = ord.[source]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022_copy_for_pbi] s
LEFT JOIN [mag_pbi].[dbo].[order_source] ord
ON s.[Номер заказа] = ord.order_id
END
GO
/****** Object: StoredProcedure [pbi].[sp_calc_ostatki_mp_2025] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[sp_calc_ostatki_mp_2025]
AS
BEGIN
SET NOCOUNT ON;
-------------------------------------------------------------------------
-- 1. Очистка таблицы
TRUNCATE TABLE pbi.ostatki_mp_2025_interpolated;
-------------------------------------------------------------------------
-- 2. Удаляем старые индексы
IF EXISTS (SELECT 1 FROM sys.indexes
WHERE name = 'IX_ostatki_mp_daily_artic_date'
AND object_id = OBJECT_ID('pbi.ostatki_mp_2025_interpolated'))
DROP INDEX IX_ostatki_mp_daily_artic_date ON pbi.ostatki_mp_2025_interpolated;
IF EXISTS (SELECT 1 FROM sys.indexes
WHERE name = 'IX_ostatki_mp_daily_uzel_date'
AND object_id = OBJECT_ID('pbi.ostatki_mp_2025_interpolated'))
DROP INDEX IX_ostatki_mp_daily_uzel_date ON pbi.ostatki_mp_2025_interpolated;
-------------------------------------------------------------------------
-- 3. Интерполяция Январь–Октябрь
;WITH BaseData AS (
SELECT
CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) AS Дата,
nod._Description AS Узел,
ost._Fld33595 AS Склад,
LOWER(CONCAT(
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),25,8),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),21,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),17,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),1,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),5,12)
)) AS artic_id,
ost._Fld33599 AS id_внешний,
ost._Fld33602 AS Qty,
ost._Fld33603 AS AvailQty,
ISNULL(NULLIF(up.upakovka,0),1) AS upakovka
FROM [MAG_2019].[dbo].[_InfoRg28682X1] ost
LEFT JOIN [MAG_2019].[dbo].[_Node28072X1] nod
ON nod._IDRRef = ost._Fld28684RRef
LEFT JOIN (
SELECT _OwnerID_RRRef, MAX(upakovka) AS upakovka
FROM mag_pbi.pbi.[БазоваяУпаковка]
GROUP BY _OwnerID_RRRef
) up
ON up._OwnerID_RRRef = ost._Fld28683RRef
WHERE CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE)
BETWEEN '2025-01-01' AND '2025-10-31'
),
-- Остатки на конец месяца
MonthBalancesRaw AS (
SELECT
Узел, Склад, artic_id, id_внешний,
EOMONTH(Дата) AS MonthEnd,
MAX(Qty) AS Qty,
MAX(AvailQty) AS AvailQty,
MAX(Qty*upakovka) AS PackQty
FROM BaseData
GROUP BY Узел, Склад, artic_id, id_внешний, EOMONTH(Дата)
),
-- Календарь месяцев 2025 (110)
Months AS (
SELECT
DATEFROMPARTS(2025, m.MonthNum, 1) AS MonthStart,
EOMONTH(DATEFROMPARTS(2025, m.MonthNum, 1)) AS MonthEnd
FROM (VALUES
(1),(2),(3),(4),(5),
(6),(7),(8),(9),(10)
) m(MonthNum)
),
-- Список всех товаров
Products AS (
SELECT DISTINCT Узел, Склад, artic_id, id_внешний
FROM BaseData
),
-- Полная сетка товар × месяц
MonthGrid AS (
SELECT p.*, m.MonthStart, m.MonthEnd
FROM Products p
CROSS JOIN Months m
),
-- Подтягиваем реальные остатки (если нет — 0)
MonthBalances AS (
SELECT
g.Узел,
g.Склад,
g.artic_id,
g.id_внешний,
g.MonthStart,
g.MonthEnd,
ISNULL(r.Qty,0) AS Qty,
ISNULL(r.AvailQty,0) AS AvailQty,
ISNULL(r.PackQty,0) AS PackQty
FROM MonthGrid g
LEFT JOIN MonthBalancesRaw r
ON r.Узел = g.Узел
AND r.Склад = g.Склад
AND r.artic_id = g.artic_id
AND r.id_внешний = g.id_внешний
AND r.MonthEnd = g.MonthEnd
),
-- Теперь LAG берёт строго предыдущий календарный месяц
WithPrev AS (
SELECT *,
ISNULL(LAG(Qty) OVER (
PARTITION BY Узел, Склад, artic_id, id_внешний
ORDER BY MonthEnd
),0) AS PrevQty,
ISNULL(LAG(AvailQty) OVER (
PARTITION BY Узел, Склад, artic_id, id_внешний
ORDER BY MonthEnd
),0) AS PrevAvail,
ISNULL(LAG(PackQty) OVER (
PARTITION BY Узел, Склад, artic_id, id_внешний
ORDER BY MonthEnd
),0) AS PrevPack
FROM MonthBalances
),
-- Подготовка к интерполяции
Prepared AS (
SELECT *,
DATEDIFF(DAY, MonthStart, MonthEnd) + 1 AS DaysInMonth
FROM WithPrev
)
-- Интерполяция по дням
INSERT INTO pbi.ostatki_mp_2025_interpolated
(
Дата, Узел, Склад, artic_id, id_внешний,
[Остаток МП, шт],
[Доступно МП, упак],
[Остаток МП, упак]
)
SELECT
DATEADD(DAY, v.number, MonthStart) AS Дата,
Узел, Склад, artic_id, id_внешний,
PrevPack + ((PackQty - PrevPack) * (v.number + 1)) / DaysInMonth,
PrevAvail + ((AvailQty - PrevAvail) * (v.number + 1)) / DaysInMonth,
PrevQty + ((Qty - PrevQty) * (v.number + 1)) / DaysInMonth
FROM Prepared
CROSS APPLY (
SELECT n AS number
FROM (
SELECT ones.n + tens.n*10 AS n
FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n)
CROSS JOIN (VALUES (0),(1),(2),(3)) tens(n)
) numbers
WHERE n < DaysInMonth
) v
-------------------------------------------------------------------------
-- 4. Интерполяция ноября 118
;WITH OctoberEnd AS (
SELECT
nod._Description AS Узел,
ost._Fld33595 AS Склад,
LOWER(CONCAT(
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),25,8),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),21,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),17,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),1,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),5,12)
)) AS artic_id,
ost._Fld33599 AS id_внешний,
MAX(ost._Fld33602) AS PrevQty,
MAX(ost._Fld33603) AS PrevAvail,
MAX(ost._Fld33602 * ISNULL(NULLIF(up.upakovka,0),1)) AS PrevPack
FROM [MAG_2019].[dbo].[_InfoRg28682X1] ost
LEFT JOIN [MAG_2019].[dbo].[_Node28072X1] nod
ON nod._IDRRef = ost._Fld28684RRef
LEFT JOIN (
SELECT _OwnerID_RRRef, MAX(upakovka) AS upakovka
FROM mag_pbi.pbi.[БазоваяУпаковка]
GROUP BY _OwnerID_RRRef
) up
ON up._OwnerID_RRRef = ost._Fld28683RRef
WHERE CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) = '2025-10-31'
GROUP BY
nod._Description,
ost._Fld33595,
ost._Fld28683RRef,
ost._Fld33599
),
November19 AS (
SELECT
nod._Description AS Узел,
ost._Fld33595 AS Склад,
LOWER(CONCAT(
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),25,8),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),21,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),17,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),1,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),5,12)
)) AS artic_id,
ost._Fld33599 AS id_внешний,
ost._Fld33602 AS Qty19,
ost._Fld33603 AS Avail19,
ost._Fld33602 * ISNULL(NULLIF(up.upakovka,0),1) AS Pack19
FROM [MAG_2019].[dbo].[_InfoRg28682X1] ost
LEFT JOIN [MAG_2019].[dbo].[_Node28072X1] nod
ON nod._IDRRef = ost._Fld28684RRef
LEFT JOIN (
SELECT _OwnerID_RRRef, MAX(upakovka) AS upakovka
FROM mag_pbi.pbi.[БазоваяУпаковка]
GROUP BY _OwnerID_RRRef
) up
ON up._OwnerID_RRRef = ost._Fld28683RRef
WHERE CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) = '2025-11-19'
)
INSERT INTO pbi.ostatki_mp_2025_interpolated
(
Дата, Узел, Склад, artic_id, id_внешний,
[Остаток МП, шт],
[Доступно МП, упак],
[Остаток МП, упак]
)
SELECT
DATEADD(DAY, d.number, CAST('2025-11-01' AS DATE)) AS Дата,
n.Узел,
n.Склад,
n.artic_id,
n.id_внешний,
ISNULL(o.PrevPack,0)
+ ((n.Pack19 - ISNULL(o.PrevPack,0)) * (d.number + 1)) / 19.0,
ISNULL(o.PrevAvail,0)
+ ((n.Avail19 - ISNULL(o.PrevAvail,0)) * (d.number + 1)) / 19.0,
ISNULL(o.PrevQty,0)
+ ((n.Qty19 - ISNULL(o.PrevQty,0)) * (d.number + 1)) / 19.0
FROM November19 n
LEFT JOIN OctoberEnd o
ON o.Узел = n.Узел
AND o.Склад = n.Склад
AND o.artic_id = n.artic_id
AND o.id_внешний = n.id_внешний
CROSS JOIN (
VALUES
(0),(1),(2),(3),(4),(5),(6),(7),(8),
(9),(10),(11),(12),(13),(14),(15),(16),(17)
) AS d(number);
-------------------------------------------------------------------------
-- 5. Остатки с 19.11.2025 по 31.12.2025 напрямую
INSERT INTO pbi.ostatki_mp_2025_interpolated
(Дата, Узел, Склад, artic_id, id_внешний, [Остаток МП, шт], [Доступно МП, упак], [Остаток МП, упак])
SELECT
CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) AS Дата,
nod._Description AS Узел,
ost._Fld33595 AS Склад,
LOWER(CONCAT(
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),25,8),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),21,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),17,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),1,4),'-',
SUBSTRING(CONVERT(NVARCHAR(36),[_Fld28683RRef],2),5,12)
)) AS artic_id,
ost._Fld33599 AS id_внешний,
ost._Fld33602 * ISNULL(NULLIF(up.upakovka,0),1) AS [Остаток МП, шт],
ost._Fld33603 AS [Доступно МП, упак],
ost._Fld33602 AS [Остаток МП, упак]
FROM [MAG_2019].[dbo].[_InfoRg28682X1] ost
LEFT JOIN [MAG_2019].[dbo].[_Node28072X1] nod
ON nod._IDRRef = ost._Fld28684RRef
LEFT JOIN (
SELECT _OwnerID_RRRef, MAX(upakovka) AS upakovka
FROM mag_pbi.pbi.[БазоваяУпаковка]
GROUP BY _OwnerID_RRRef
) up
ON up._OwnerID_RRRef = ost._Fld28683RRef
WHERE CAST(DATEADD(YEAR,-2000, ost._Fld33596) AS DATE) BETWEEN '2025-11-19' AND '2025-12-31';
-------------------------------------------------------------------------
-- 6. Удаляем пустые строки
DELETE FROM pbi.ostatki_mp_2025_interpolated
WHERE [Остаток МП, шт] = 0;
-------------------------------------------------------------------------
-- 7. Создаем индексы заново
CREATE CLUSTERED INDEX IX_ostatki_mp_daily_artic_date
ON pbi.ostatki_mp_2025_interpolated (artic_id, Дата);
CREATE NONCLUSTERED INDEX IX_ostatki_mp_daily_uzel_date
ON pbi.ostatki_mp_2025_interpolated (Узел, Дата);
END
GO
/****** Object: StoredProcedure [pbi].[sp_nomenclature_full_page] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[sp_nomenclature_full_page]
@OffsetRows int = 0,
@FetchRows int = 1000
AS
BEGIN
SET NOCOUNT ON;
;WITH page AS (
SELECT
nom.code,
nom.[1c_group],
-- === nom: оставил все поля как в твоей вьюхе ===
nom.artic_id,
nom.[1c_id],
nom.cenovaya_gruppa,
nom.description,
nom.artic,
nom.vid_nomen,
nom.Производитель,
nom.group_id,
nom.card,
nom.photo,
nom.base,
nom.[Знаменатель веса],
nom.[Числитель веса],
nom.[Знаменатель объема],
nom.[Числитель объема],
nom.[Количество упак в коробе],
nom.[Количество упак в кванте],
nom.[id magok],
nom.Товарныйменеджера,
nom.МенеджерПоЗакупкам2,
nom.РуководительНаправления,
nom.[Менеджер OZON],
nom.[Менеджер WB],
nom.[АБС статус],
nom.[АБС план],
nom.[ABC Парето],
nom.[XYZ статус 12м],
nom.[Комментарий для матрицы],
nom.Коллекция,
nom.[Ценовой сегмент Магок],
nom.[Ценовой сегмент МП],
nom.[Кол-во упак в заказе Магок],
nom.Бренд,
nom.[Тип товара],
nom.Метка,
nom.[Ширина, мм],
nom.Цвет,
nom.[Номер цвета],
nom.[Тип шнура],
nom.[Тип плетения],
nom.Размер,
nom.Особенность,
nom.Форма,
nom.Ширина,
nom.[Формат упаковки],
nom.[Макс. запас],
nom.[Мин. запас],
nom.[QTY PACKS],
nom.[Да/Нет Собственное пр-во],
nom.[ID OZON],
nom.[ID WB],
nom.WB,
nom.Ozon,
nom.СТМ,
nom.[Выгружать на я.маркет],
nom.[Выгружать в Google Merchant],
nom.[Товар МП],
nom.Неликвид,
nom.Статус,
nom.[Сквозной цвет],
nom.[Базовая упаковка],
nom.[Качество контента Ozon],
nom.[Качество контента WB],
nom.[Качество контента WB by Ozon],
nom.[Качество контента Magok],
nom.[Вид номенклатуры],
nom.max_year_quantity,
nom.max_quarter_quantity,
nom.[Цена учетная, руб],
nom.[Цена учетная, usd],
nom.СредниеМесячныеПродажи,
nom.СКО_МесячныхПродаж,
nom.minAvailableQty
FROM pbi.nomenclature AS nom
ORDER BY nom.code
OFFSET @OffsetRows ROWS
FETCH NEXT @FetchRows ROWS ONLY
),
-- ограничиваем ref188 только кодами из page
ref188 AS (
SELECT
n._Code,
n._IDRRef,
n._Fld28142
FROM MAG_2019.dbo._Reference188X1 AS n
INNER JOIN (SELECT DISTINCT code FROM page) p
ON p.code = n._Code
WHERE n._Fld21101RRef IN (
0x80C5305A3A00E12B11E5845202CA01FB,
0x80C5305A3A00E12B11E584520AEC30EC
)
),
up_min AS (
SELECT
a._OwnerID_RRRef,
a._Fld24768 AS upakovka,
a._Fld24761 AS [Вес],
a._Fld24763 AS [Высота],
a._Fld24765 AS [Глубина],
a._Fld24775 AS [Ширина],
a._Fld24771 AS [Объем]
FROM MAG_2019.dbo._Reference347X1 AS a
LEFT JOIN MAG_2019.dbo._Reference347X1 AS b
ON b._OwnerID_RRRef = a._OwnerID_RRRef
AND a._Fld24768 > b._Fld24768
AND a._Marked = 0x00
AND b._Marked = 0x00
INNER JOIN ref188 AS r
ON r._IDRRef = a._OwnerID_RRRef
AND r._Fld28142 = 0
WHERE b._Fld24768 IS NULL
AND a._Marked = 0x00
),
up_max AS (
SELECT
a._OwnerID_RRRef,
a._Fld24768 AS upakovka,
a._Fld24761 AS [Вес],
a._Fld24763 AS [Высота],
a._Fld24765 AS [Глубина],
a._Fld24775 AS [Ширина],
a._Fld24771 AS [Объем]
FROM MAG_2019.dbo._Reference347X1 AS a
LEFT JOIN MAG_2019.dbo._Reference347X1 AS b
ON b._OwnerID_RRRef = a._OwnerID_RRRef
AND a._Fld24768 < b._Fld24768
AND a._Marked = 0x00
AND b._Marked = 0x00
INNER JOIN ref188 AS r
ON r._IDRRef = a._OwnerID_RRRef
AND r._Fld28142 <> 0
WHERE b._Fld24768 IS NULL
AND a._Marked = 0x00
),
up AS (
SELECT * FROM up_min
UNION ALL
SELECT * FROM up_max
),
ref1c AS (
SELECT
r._Code AS code,
r._IDRRef,
up._OwnerID_RRRef,
LOWER(
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 25, 8) + N'-' +
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 21, 4) + N'-' +
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 17, 4) + N'-' +
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 1, 4) + N'-' +
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 5, 12)
) AS artic_id,
up.upakovka,
up.[Вес],
up.[Высота],
up.[Глубина],
up.[Ширина],
up.[Объем]
FROM ref188 AS r
LEFT JOIN up
ON up._OwnerID_RRRef = r._IDRRef
),
bc AS (
SELECT
x._Fld15521RRef AS _IDRRef,
STRING_AGG(x.barcode, N'; ') AS barcodes
FROM (
SELECT DISTINCT
i._Fld15521RRef,
CONVERT(nvarchar(64), i._Fld15520) AS barcode
FROM MAG_2019.dbo._InfoRg15519 AS i
INNER JOIN ref188 AS r
ON r._IDRRef = i._Fld15521RRef
) AS x
GROUP BY x._Fld15521RRef
)
SELECT
p.*,
g._Description AS group__Description,
g.g, g.g1, g.g2, g.g3,
g.group_id AS group__group_id,
g._ParentIDRRef AS group__ParentIDRRef,
g.lvl AS group__lvl,
g.path AS group__path,
g.code AS group__code,
g.[1c_id] AS group__1c_id,
g.план AS group__план,
g.[first group] AS group__first_group,
ref1c._IDRRef AS ref_1c__IDRRef,
ref1c._OwnerID_RRRef AS ref_1c__OwnerID_RRRef,
ref1c.artic_id AS ref_1c__artic_id,
ref1c.upakovka AS ref_1c__upakovka,
ref1c.[Вес] AS ref_1c__Вес,
ref1c.[Высота] AS ref_1c__Высота,
ref1c.[Глубина] AS ref_1c__Глубина,
ref1c.[Ширина] AS ref_1c__Ширина,
ref1c.[Объем] AS ref_1c__Объем,
bc.barcodes AS ref_1c__barcodes
FROM page AS p
LEFT JOIN pbi.groups AS g
ON g.[1c_id] = p.[1c_group]
LEFT JOIN ref1c
ON ref1c.code = p.code
LEFT JOIN bc
ON bc._IDRRef = ref1c._IDRRef
ORDER BY p.code
OPTION (RECOMPILE); -- чтобы план подстраивался под offset/fetch
END
GO
/****** Object: StoredProcedure [pbi].[sp_nomenclature_full_page_v] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[sp_nomenclature_full_page_v]
@OffsetRows int = 0,
@FetchRows int = 1000
AS
BEGIN
SET NOCOUNT ON;
;WITH page AS (
SELECT
nom.artic_id,
nom.[1c_id],
nom.code,
nom.cenovaya_gruppa,
nom.description,
nom.artic,
nom.vid_nomen,
nom.Производитель,
nom.group_id,
nom.[1c_group],
nom.card,
nom.photo,
nom.base,
nom.[Знаменатель веса],
nom.[Числитель веса],
nom.[Знаменатель объема],
nom.[Числитель объема],
nom.[Количество упак в коробе],
nom.[Количество упак в кванте],
nom.[id magok],
nom.Товарныйменеджера,
nom.МенеджерПоЗакупкам2,
nom.РуководительНаправления,
nom.[Менеджер OZON],
nom.[Менеджер WB],
nom.[АБС статус],
nom.[АБС план],
nom.[ABC Парето],
nom.[XYZ статус 12м],
nom.[Комментарий для матрицы],
nom.Коллекция,
nom.[Ценовой сегмент Магок],
nom.[Ценовой сегмент МП],
nom.[Кол-во упак в заказе Магок],
nom.Бренд,
nom.[Тип товара],
nom.Метка,
nom.[Ширина, мм],
nom.Цвет,
nom.[Номер цвета],
nom.[Тип шнура],
nom.[Тип плетения],
nom.Размер,
nom.Особенность,
nom.Форма,
nom.Ширина,
nom.[Формат упаковки],
nom.[Макс. запас],
nom.[Мин. запас],
nom.[QTY PACKS],
nom.[Да/Нет Собственное пр-во],
nom.[ID OZON],
nom.[ID WB],
nom.WB,
nom.Ozon,
nom.СТМ,
nom.[Выгружать на я.маркет],
nom.[Выгружать в Google Merchant],
nom.[Товар МП],
nom.Неликвид,
nom.Статус,
nom.[Сквозной цвет],
nom.[Базовая упаковка],
nom.[Качество контента Ozon],
nom.[Качество контента WB],
nom.[Качество контента WB by Ozon],
nom.[Качество контента Magok],
nom.[Вид номенклатуры],
nom.max_year_quantity,
nom.max_quarter_quantity,
nom.[Цена учетная, руб],
nom.[Цена учетная, usd],
nom.СредниеМесячныеПродажи,
nom.СКО_МесячныхПродаж,
nom.minAvailableQty
FROM pbi.nomenclature AS nom
ORDER BY nom.code
OFFSET @OffsetRows ROWS
FETCH NEXT @FetchRows ROWS ONLY
),
ref188 AS (
SELECT
n._Code,
n._IDRRef,
n._Fld28142
FROM MAG_2019.dbo._Reference188X1 AS n
INNER JOIN (SELECT DISTINCT code FROM page) p
ON p.code = n._Code
WHERE n._Fld21101RRef IN (
0x80C5305A3A00E12B11E5845202CA01FB,
0x80C5305A3A00E12B11E584520AEC30EC
)
),
up_min AS (
SELECT
a._OwnerID_RRRef,
a._Fld24768 AS upakovka,
a._Fld24761 AS [Вес],
a._Fld24763 AS [Высота],
a._Fld24765 AS [Глубина],
a._Fld24775 AS [Ширина],
a._Fld24771 AS [Объем]
FROM MAG_2019.dbo._Reference347X1 AS a
LEFT JOIN MAG_2019.dbo._Reference347X1 AS b
ON b._OwnerID_RRRef = a._OwnerID_RRRef
AND a._Fld24768 > b._Fld24768
AND a._Marked = 0x00 AND b._Marked = 0x00
INNER JOIN ref188 AS r
ON r._IDRRef = a._OwnerID_RRRef
AND r._Fld28142 = 0
WHERE b._Fld24768 IS NULL
AND a._Marked = 0x00
),
up_max AS (
SELECT
a._OwnerID_RRRef,
a._Fld24768 AS upakovka,
a._Fld24761 AS [Вес],
a._Fld24763 AS [Высота],
a._Fld24765 AS [Глубина],
a._Fld24775 AS [Ширина],
a._Fld24771 AS [Объем]
FROM MAG_2019.dbo._Reference347X1 AS a
LEFT JOIN MAG_2019.dbo._Reference347X1 AS b
ON b._OwnerID_RRRef = a._OwnerID_RRRef
AND a._Fld24768 < b._Fld24768
AND a._Marked = 0x00 AND b._Marked = 0x00
INNER JOIN ref188 AS r
ON r._IDRRef = a._OwnerID_RRRef
AND r._Fld28142 <> 0
WHERE b._Fld24768 IS NULL
AND a._Marked = 0x00
),
up AS (
SELECT * FROM up_min
UNION ALL
SELECT * FROM up_max
),
ref1c AS (
SELECT
r._Code AS code,
r._IDRRef,
r._IDRRef AS _OwnerID_RRRef, -- чтобы сохранить имя ref_1c__OwnerID_RRRef как раньше (если нужно)
LOWER(
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 25, 8) + N'-' +
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 21, 4) + N'-' +
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 17, 4) + N'-' +
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 1, 4) + N'-' +
SUBSTRING(CONVERT(nvarchar(36), r._IDRRef, 2), 5, 12)
) AS artic_id,
up.upakovka,
up.[Вес],
up.[Высота],
up.[Глубина],
up.[Ширина],
up.[Объем]
FROM ref188 AS r
LEFT JOIN up
ON up._OwnerID_RRRef = r._IDRRef
),
bc AS (
SELECT
x._Fld15521RRef AS _IDRRef,
STRING_AGG(x.barcode, N'; ') AS barcodes
FROM (
SELECT DISTINCT
i._Fld15521RRef,
CONVERT(nvarchar(64), i._Fld15520) AS barcode
FROM MAG_2019.dbo._InfoRg15519 AS i
INNER JOIN ref188 r
ON r._IDRRef = i._Fld15521RRef
) AS x
GROUP BY x._Fld15521RRef
)
SELECT
-- === все поля как ты ожидаешь от v.[...] ===
p.[artic_id],
p.[1c_id],
p.[code],
p.[cenovaya_gruppa],
p.[description],
p.[artic],
p.[vid_nomen],
p.[Производитель],
p.[group_id],
p.[1c_group],
p.[card],
p.[photo],
p.[base],
p.[Знаменатель веса],
p.[Числитель веса],
p.[Знаменатель объема],
p.[Числитель объема],
p.[Количество упак в коробе],
p.[Количество упак в кванте],
p.[id magok],
p.[Товарныйменеджера],
p.[МенеджерПоЗакупкам2],
p.[РуководительНаправления],
p.[Менеджер OZON],
p.[Менеджер WB],
p.[АБС статус],
p.[АБС план],
p.[ABC Парето],
p.[XYZ статус 12м],
p.[Комментарий для матрицы],
p.[Коллекция],
p.[Ценовой сегмент Магок],
p.[Ценовой сегмент МП],
p.[Кол-во упак в заказе Магок],
p.[Бренд],
p.[Тип товара],
p.[Метка],
p.[Ширина, мм],
p.[Цвет],
p.[Номер цвета],
p.[Тип шнура],
p.[Тип плетения],
p.[Размер],
p.[Особенность],
p.[Форма],
p.[Ширина],
p.[Формат упаковки],
p.[Макс. запас],
p.[Мин. запас],
p.[QTY PACKS],
p.[Да/Нет Собственное пр-во],
p.[ID OZON],
p.[ID WB],
p.[WB],
p.[Ozon],
p.[СТМ],
p.[Выгружать на я.маркет],
p.[Выгружать в Google Merchant],
p.[Товар МП],
p.[Неликвид],
p.[Статус],
p.[Сквозной цвет],
p.[Базовая упаковка],
p.[Качество контента Ozon],
p.[Качество контента WB],
p.[Качество контента WB by Ozon],
p.[Качество контента Magok],
p.[Вид номенклатуры],
p.[max_year_quantity],
p.[max_quarter_quantity],
p.[Цена учетная, руб],
p.[Цена учетная, usd],
p.[СредниеМесячныеПродажи],
p.[СКО_МесячныхПродаж],
p.[minAvailableQty],
-- === упаковки/габариты/штрихкоды как ты хочешь в конце ===
ref1c.upakovka AS [upakovka],
ref1c.[Вес] AS [вес],
ref1c.[Высота] AS [Высота],
ref1c.[Глубина] AS [Глубина],
ref1c.[Ширина] AS [Ширина],
ref1c.[Объем] AS [Объем],
bc.barcodes AS [barcodes]
FROM page AS p
LEFT JOIN pbi.groups AS g
ON g.[1c_id] = p.[1c_group]
LEFT JOIN ref1c
ON ref1c.code = p.code
LEFT JOIN bc
ON bc._IDRRef = ref1c._IDRRef
ORDER BY p.code
OPTION (RECOMPILE);
END
GO
/****** Object: StoredProcedure [pbi].[Заполнить себестоимостьОт2022(закупки+продажи)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Заполнить себестоимостьОт2022(закупки+продажи)]
@dt datetime2 = '4022-01-01'
AS
BEGIN
/*r._RecorderTRef:
0x000001A1 Заявление о ввозе товаров из ЕАЭС
0x000001E3 ПТУ
0x00000189 Возврат товаров поставщику
0x000001D5 Передача товаров
0x000001B0 Корректировка приобретения
0x0000020D Таможенная декларация на импорт
закупка: (0x000001E3, 0x00000189,0x000001D5, 0x000001B0)
ЕАЭС: 0x000001A1
Таможня: 0x0000020D
*/
/*
0x80CD002590EC174111E581505088A8D5 USD
0x80D40CC47A052DFD11E6B6DD1820D178 Eur
0x80E90CC47A052DFD11E7145927CEFC24 Cny
0xAE9DB496910DCFD611E94F10743DE3FF USD2
0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
*/
DELETE FROM mag_pbi.pbiProd.[СебестоимостьОт2022] WHERE 1=1
DBCC CHECKIDENT ('[pbiProd].[СебестоимостьОт2022]', RESEED, 0);
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2025-01-01'
-- выберем валюту рубль сразу ...
DECLARE @CurrencyRubRRef UNIQUEIDENTIFIER;
SELECT TOP (1) @CurrencyRubRRef = [_IDRRef]
FROM [MAG_2019].[dbo].[_Reference50]
WHERE _Code = '643';
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
--INSERT INTO mag_pbi.[pbi].[Себестоимость2023]
--INSERT INTO mag_pbi.[pbi].[Себестоимость2024]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Сборка], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Сборка USD2+2]
)
SELECT --TOP (5000)
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Сборка]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Сборка USD2+2]
FROM (
SELECT
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, PartnerId
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
--, CASE WHEN [Валюта документа] = 'руб.' THEN
-- [Закупка] / [Курс usd2]
-- ELSE
-- [Закупка, usd2]
-- END as [Закупка, usd2]
, [Закупка] / [Курс usd2] as [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Сборка]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка] / [Курс usd2] as [Доставка USD2+2]
, [НДС] / [Курс usd2] as [НДС USD2+2]
, [Таможня] / [Курс usd2] as [Таможня USD2+2]
, [Сборка] / [Курс usd2] as [Сборка USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ЗАКУПКИ \\\\\\\\\\\\\\\\
select --top (1)
DATEADD(year, -2000, _Period) as [Период]
, case
WHEN r._RecorderTRef=0x000001A1 or r._RecorderTRef=0x0000020D THEN 'НДС'
--WHEN r._RecorderTRef=0x000001A1 THEN 'ЕАЭС'
--WHEN r._RecorderTRef=0x0000020D THEN 'Таможня'
ELSE 'Закупка'
END
as [Статья]
, 'Приход' as [Вид операции]
, h.value as [Хоз операция]
, case r._RecorderTRef
WHEN 0x000001A1 then 'Заявление о ввозе товаров из ЕАЭС'
WHEN 0x00000189 then 'Возврат товаров поставщику'
WHEN 0x000001E3 then 'ПТУ'
WHEN 0x000001D5 then 'Передача товаров'
WHEN 0x000001B0 then 'Корректировка '
WHEN 0x0000020D then 'Таможенная декларация на импорт'
ELSE 'Неизвестный тип'
END as [тип документа]
, '-' as [Номер документа]
, '-' as [Номер заказа]
, val._Description as [Валюта документа]
,CASE
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб'
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал'
WHEN r._RecorderTRef = 0x0000020D THEN 'Руб'
ELSE 'Неопределено'
END as [Ценовая группа]
, r._RecorderRRef as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = r._Fld16346RRef ) as [Организация]
, (SELECT TOP(1) _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = r.[_Fld16353RRef]) as [Партнер]
--, r.[_Fld16353RRef] as PartnerId
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),5,12) ))as PartnerId
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = r._Fld16354_RRRef) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = [_Fld16348RRef]) as [Менеджер]
, analitikaUchetaNomenklaturi.[_Fld20498RRef] as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),5,12))) as [artic_id]
,CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
THEN
case [_Fld16345RRef]
when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN -[_Fld16361]
ELSE [_Fld16361] END
--WHEN r._RecorderTRef = 0x0000020D THEN customDeclaration._Fld8943
WHEN r._RecorderTRef = 0x0000020D THEN 0
--WHEN r._RecorderTRef=0x000001A1 THEN docEAS.[_Fld4052]
WHEN r._RecorderTRef=0x000001A1 THEN 0
ELSE 0 END
as [Количество]
, [_Fld16362] / 1000 as [Сумма]
, [_Fld16363] / 1000 as [СуммаБезНДС]
,0 as [СуммаРучнойСкидки]
,0 as [СуммаАвтоСкидки]
, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
THEN
case [_Fld16345RRef]
when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN -[_Fld16362] / 1000
ELSE [_Fld16362] / 1000 END
ELSE 0 END
AS [Закупка]
, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка поле "сумма в валюте документа"
THEN
case [_Fld16345RRef]
when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN -[_Fld16373] / 1000
ELSE [_Fld16373] / 1000 END
ELSE 0 END as [Закупка, usd2]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
--WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, r._Period)
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
--WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, r._Period)
ORDER BY _Period desc ) as [Курс usd2]
/*, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000
ELSE 0 END
as [Таможня]
, CASE WHEN r._RecorderTRef=0x000001A1 THEN [_Fld16369] / 1000
ELSE 0 END
as [ЕАЭС] */
, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000 END as [Таможня]
, 0 as [ЕАЭС]
, 0 as [Маркетинг] -- маркетинг
, 0 as [Доставка] -- доставка
, 0 as [Сборка]-- Сборка
, 0 as [ЗатратыМП] -- Затраты МП
,CASE WHEN LEFT(n._Code, 2) = '00' -- только для вида операция закупка
THEN '9' + CONVERT(nvarchar(15), TRIM('-' FROM TRIM ( '00' FROM n._Code)))
ELSE '8' + TRIM ( 'УТ-' FROM n._Code)
END
as [CodeUT]
, CASE WHEN r._RecorderTRef=0x000001A1 THEN ([_Fld16362] - [_Fld16363]) / 1000
WHEN r._RecorderTRef=0x0000020D THEN ([_Fld16362] - [_Fld16363]) / 1000
ELSE 0 END
as [НДС]
, 0 as [ЗатратыСкладХранение] -- Затраты cклад хранение
, 0 as [ЗатратыСкладЗарплата]-- Затраты cклад зарплаты
, 0 as [Приемка]
, 0 as [АтсМаркировка]
, 0 as [ВремяВыполненияМинут]
, 0 as [СборкаЗаказа]
--,RIGHT(n._Code, LEN(n._Code) - DATALENGTH(CONVERT(VARCHAR(100),'УТ-'))) as [CodeUT]
from
mag_2019.dbo._AccumRg16344 r-- Регистр накопления Закупки
LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef]
left join MAG_2019.dbo._Reference188X1 as N
on analitikaUchetaNomenklaturi.[_Fld20498RRef] = N._IDRRef
LEFT JOIN [mag_reports].[dbo].[enums] h
ON h._IDRref = r._Fld16345RRef
LEFT JOIN MAG_2019.dbo._reference50 val
ON val._IDRRef = r._Fld16372RRef
LEFT JOIN [MAG_2019].[dbo].[_Document525_VT8936] as customDeclaration
ON customDeclaration.[_Document525_IDRRef] = [r]._RecorderRRef
and analitikaUchetaNomenklaturi.[_Fld20498RRef] = customDeclaration._Fld8939RRef
LEFT JOIN [MAG_2019].[dbo].[_Document417_VT4034] as docEAS
ON docEAS.[_Document417_IDRRef] = [r]._RecorderRRef
and [_Fld16349RRef] = docEAS.[_Fld4037RRef]
) tabZakupki
UNION ALL
SELECT -- top (1000)
DATEADD(year, -2000, date) -- период
,SR -- Статья расходов
, ВидОперации -- Вид операции
, '' -- хоз операция
, typeReg -- Тип документа
, НомерДокумента -- Номер документа
, [Номер заказа] -- Номер заказа клиента для РТУ
, val._Description -- Валюта документа
, CASE
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб'
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал'
ELSE 'Неопределено'
END -- Ценовая группа
, Регистратор -- Ссылка на документ
, refOrganizaciya.[_Description] -- Организация
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = Партнер) -- Партнер
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), [Партнер], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),5,12) ))as PartnerId
, (SELECT _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = Контрагент) -- Контрагент
, (SELECT _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = Менеджер) -- Менеджер
, onec_id -- 1с id
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), onec_id, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),5,12))) -- arctic id
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date)
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date)
ORDER BY _Period desc ) as [Курс usd2]
, kolvo -- количество
, [Сумма] / 1000
, [СуммаБезНДС] / 1000
, [СуммаРучнойСкидки] / 1000
, [СуммаАвтоСкидки] / 1000
, [Закупка] -- закупка
, [Закупка, usd2] -- закупка usd2
, 0 -- Таможня
, 0 --ЕАЭС
-- , marketing / 1000 -- маркетинг
, delivery / 1000 -- доставка
, [Сборка] / 1000 as [Сборка]-- Сборка
, [ЗатратыМП] / 1000 -- Затраты МП
--,CASE WHEN LEFT(refNomenclatura._Code, 2) = '00' -- только для вида операция закупка
-- THEN '9' + CONVERT(nvarchar(15), TRIM('-' FROM TRIM ( '00' FROM refNomenclatura._Code)))
-- ELSE '8' + TRIM ( 'УТ-' FROM refNomenclatura._Code)
-- END
--as [CodeUT]
, 0 -- НДС
, [ЗатратыСкладХранение] -- Затраты cклад хранение
, [ЗатратыСкладЗарплата]-- Затраты cклад зарплаты
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, delivery / 1000 / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date)
ORDER BY _Period desc ) as [Доставка USD2+2]
, 0 as [НДС USD2+2]
, 0 as [Таможня USD2+2]
, [Сборка] / 1000 / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date)
ORDER BY _Period desc ) as [Сборка USD2+2]
-- ,RIGHT(refNomenclatura._Code, LEN(refNomenclatura._Code) - DATALENGTH(CONVERT(VARCHAR(100),'УТ-'))) as [CodeUT]
FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ДОСТАВКА \\\\\\\\\\\\\\\\
SELECT --TOP (1)
refPTU.[_Date_Time] as date -- дата
, 'Доставка контейнера ВЭД' as SR
, 'Приход' as ВидОперации
, [_Fld33630RRef] as Регистратор -- регистратор
, '-' as НомерДокумента -- Номер документа
, '-' [Номер заказа]
, 'ПТУ' as typeReg -- типРегистратора
, refPTU.[_Fld7121RRef] as Организация -- Организация
, refPTU.[_Fld7060RRef] as Партнер -- партнер
, refPTU.[_Fld7064RRef] as Контрагент -- контрагент
, refPTU.[_Fld7067RRef] as Менеджер -- Менеджер
, [_Fld33631RRef] as onec_id -- Номенклатура
--,refPtuNomen.[_Fld7134] as kolvo -- Количество
, 0 as kolvo -- Количество
--, [_Fld33633] as [Сумма]
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
, refPTU.[_Fld7059RRef] as ВалютаДокумента -- Валюта документа
, [_Fld33632RRef] -- ППУ
, 0 as marketing -- маркетинг
, [_Fld33633] as delivery -- доставка
, 0 as [Сборка]-- Сборка
, 0 as [ЗатратыМП]-- Затраты мп
, 0 as [ЗатратыСкладХранение]-- Затраты cклад хранение
, 0 as [ЗатратыСкладЗарплата]-- Затраты cклад зарплаты
, 0 as [Приемка] -- Приемка
, 0 as [АтсМаркировка]
, 0 as [ВремяВыполненияМинут]
, 0 as [СборкаЗаказа]
FROM [MAG_2019].[dbo].[_InfoRg33629]
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = [_Fld33630RRef]
LEFT JOIN [MAG_2019].[dbo].[_Document483_VT7128X1] as refPtuNomen
ON refPtuNomen.[_Document483_IDRRef] = refPTU.[_IDRRef]
AND refPtuNomen.[_Fld7130RRef] = [_Fld33631RRef]
where [_Fld33634_RRRef] = 0x997EB49691D57EFD11ECE1AC556F9FF0
UNION ALL
-- \\\\\\\\\\\\ МАРКЕТИНГ \\\\\\\\\\\\\\\
SELECT --TOP (1)
refPTU.[_Date_Time]
, 'Маркетинг'
, 'Приход'
, [_Fld33630RRef] -- регистратор
, '-' -- Номер документа
, '-' -- Номер заказа
, 'ПТУ'
, refPTU.[_Fld7121RRef] -- Организация
, refPTU.[_Fld7060RRef] as Партнер -- партнер
, refPTU.[_Fld7064RRef] as Контрагент -- контрагент
, refPTU.[_Fld7067RRef] as Менеджер -- Менеджер
, [_Fld33631RRef] -- Номенклатура
, 0 -- Количество
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
, refPTU.[_Fld7059RRef] -- Валюта документа
, [_Fld33632RRef] -- ППУ
, [_Fld33633] -- маркетинг
, 0 -- доставка
, 0 -- Сборка
, 0 -- Затраты мп
, 0 -- Затраты cклад хранение
, 0 -- Затраты cклад зарплата
, 0 -- Приемка
, 0 -- [АтсМаркировка]
, 0 -- [ВремяВыполненияМинут]
, 0 -- [СборкаЗаказа]
FROM [MAG_2019].[dbo].[_InfoRg33629]
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = [_Fld33630RRef]
where [_Fld33634_RRRef] = 0x9981B49691D57EFD11EDCE203CED30C4
UNION ALL
-- ///////////////// ПРОДАЖИ ////////////////
SELECT --TOP (1)
[_Period]
,'Реализация'
,'Расход'
,[_RecorderRRef] -- регистратор
,docRTU.[_Number] -- Номер документа
, orders.[_Number] -- Номер заказа
,case [_RecorderTRef]
WHEN 0x000001F4 then 'РТУ'
ELSE 'Неизвестный тип'
END
, AnalitikaUchetaPartner.[_Fld20514RRef] -- Организация
, AnalitikaUchetaPartner.[_Fld20513RRef] -- партнер
, AnalitikaUchetaPartner.[_Fld20515_RRRef] -- контрагент
, [_Fld15559RRef] as Менеджер -- Менеджер
, analitikaUchetaNomenklaturi.[_Fld20498RRef] -- Номенклатура
, [_Fld15567] -- количество
, [_Fld15568] as [Сумма]
, 0 as [СуммаБезНДС]
, [_Fld15595] as [СуммаРучнойСкидки]
, [_Fld15596] as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
, CASE
WHEN [_Fld15601RRef] IS NULL THEN 'руб.' -- Валюта документа
ELSE [_Fld15601RRef]
END AS [Валюта документа]
, '' -- ППУ
, 0 -- маректинг
, 0 -- Доставка
, 0 -- Сборка
, 0 -- Затраты мп
, 0 -- Затраты cклад хранение
, 0 -- Затраты cклад зарплаты
, 0 -- Приемка
, 0 -- [АтсМаркировка]
, 0 -- [ВремяВыполненияМинут]
, 0 -- [СборкаЗаказа]
FROM [MAG_2019].[dbo].[_AccumRg15547]
LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld15548RRef]
LEFT JOIN [MAG_2019].[dbo].[_Reference162] as AnalitikaUchetaPartner
on AnalitikaUchetaPartner.[_IDRRef] = [_Fld15550RRef]
LEFT JOIN [MAG_2019].[dbo].[_Document500X1] as docRTU
on docRTU.[_IDRRef] = [_RecorderRRef]
LEFT JOIN (SELECT
[_Document500_IDRRef] as _IDRRef
,MIN([_Fld7990_RRRef]) as orderRTU
FROM [MAG_2019].[dbo].[_Document500_VT7967X1]
GROUP BY
[_Document500_IDRRef]) as ordersRTU
ON ordersRTU._IDRRef = [_RecorderRRef]
LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as orders
ON orders.[_IDRRef] = ordersRTU.orderRTU
UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА РАСХОД БЕЗ ЗАТРАТ НА СБОРКУ\\\\\\\\\\\\\\\\
SELECT --TOP (1000)
znS.[_Date_Time] as per
, 'Сборка'
, 'Расход'
, TabGoods.[_Document407_IDRRef] -- регистратор
, '-' -- Номер документа
, '-' -- Номер заказа
,'Заказ на сборку'
, ZnS.[_Fld3348RRef] -- Организация
, Kontr.[_Fld20612RRef] -- партнер
, ZnS.[_Fld27876RRef] -- контрагент
, ZnS.[_Fld28230RRef] -- Менеджер
, [_Fld3381RRef] as nom -- Номенклатура
, [_Fld3385] as kolvo -- Количество
--, tabset.[_Fld28063]
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist]
WHERE [Вид цены] = 'Учетная цена (руб)'
AND [Дата] <= znS.[_Date_Time]
and [_Fld3381RRef] = [1c_id]
ORDER BY Дата desc ) / 1000 * [_Fld3385] * -1 as [Закупка]
, (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist]
WHERE [Вид цены] = 'Учетная цена (руб)'
AND [Дата] <= znS.[_Date_Time]
and [_Fld3381RRef] = [1c_id]
ORDER BY Дата desc ) / 1000 * [_Fld3385] * -1 / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, znS.[_Date_Time])
ORDER BY _Period desc ) as [Закупка, usd2]
, currency._IDRRef -- Валюта документа
, '' -- ППУ
, 0 -- маректинг
, 0 -- Доставка
, 0 -- сборка
, 0 -- Затраты мп
, 0 -- Затраты cклад хранение
, 0 -- Затраты cклад зарплата
, 0 -- Приемка
, 0 -- [АтсМаркировка]
, 0 -- [ВремяВыполненияМинут]
, 0 -- [СборкаЗаказа]
FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
on ZnS._IDRRef = [_Document407_IDRRef]
and _Posted = 0x01 -- проведен
-- and [_Number] = 'АНУТ-010680' -- номер дока для проверки
and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
ON Kontr.[_IDRRef] = ZnS.[_Fld27876RRef]
LEFT JOIN (SELECT TOP (1) [_IDRRef]
FROM [MAG_2019].[dbo].[_Reference50]
where _code = '643') as currency
on 1 = 1
UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА ПРИХОД + ЗАТРАТЫ НА СБОРКУ \\\\\\\\\\\\\\\\
SELECT --TOP (333)
znS.[_Date_Time]
, 'Сборка'
, 'Приход'
, TabGoods.[_Document407_IDRRef] -- регистратор
, '-' -- Номер документа
, '-' -- Номер заказа
,'Заказ на сборку'
, ZnS.[_Fld3348RRef] -- Организация
, Kontr.[_Fld20612RRef] -- партнер
, ZnS.[_Fld27876RRef] -- контрагент
, ZnS.[_Fld28230RRef] -- Менеджер
, tabSet.[_Fld28059RRef] -- Номенклатура
--, [_Fld3385] -- Количество
, tabset.[_Fld28063]
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
--, CASE WHEN tabSetPrices.[SumSebes] IS NULL THEN 0
-- ELSE tabSetPrices.[SumSebes] / 1000 * tabset.[_Fld28063]
-- end as [Закупка]
, (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist]
WHERE [Вид цены] = 'Учетная цена (руб)'
AND [дата] <= znS.[_Date_Time]
and [_Fld3381RRef] = [1c_id]
ORDER BY Дата desc ) / 1000 * [_Fld3385] as [SumSebes]
, (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist]
WHERE [Вид цены] = 'Учетная цена (руб)'
AND [дата] <= znS.[_Date_Time]
and [_Fld3381RRef] = [1c_id]
ORDER BY Дата desc ) / 1000 * [_Fld3385] / (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, znS.[_Date_Time])
ORDER BY _Period desc ) as [Закупка, usd2]
, currency._IDRRef -- Валюта документа
, '' -- ППУ
, 0 -- маректинг
, 0 -- Доставка
, TabZatratiSborka.sborka as sborka -- сборка
, 0 -- Затраты мп
, 0 -- Затраты cклад хранение
, 0 -- Затраты cклад зарплата
, 0 -- Приемка
, 0 -- [АтсМаркировка]
, 0 -- [ВремяВыполненияМинут]
, 0 -- [СборкаЗаказа]
FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
on ZnS._IDRRef = [_Document407_IDRRef]
and _Posted = 0x01 -- проведен
--and [_Number] = 'АНУТ-010680' -- номер дока для проверки
and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
LEFT JOIN [MAG_2019].[dbo]._Document407_VT28057 as tabSet -- тч комплекты, тут связь было-стало
on tabSet.[_Fld28070] = [_Fld28055]
and tabSet._Document407_IDRRef = TabGoods._Document407_IDRRef
LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
ON Kontr.[_IDRRef] = ZnS.[_Fld27876RRef]
LEFT JOIN (SELECT TOP (1) [_IDRRef]
FROM [MAG_2019].[dbo].[_Reference50]
where _code = '643') as currency
on 1 = 1
LEFT JOIN (SELECT --TOP (1000)
[_RecorderRRef] -- регистратор
, [_Fld33653RRef] -- Номенклатура
, SUM([_Fld33658]) / 1000 as sborka -- сборка
FROM [MAG_2019].[dbo].[_AccumRg33652] -- рн работы
where [_RecorderTRef] = 0x00000197
group by
[_RecorderRRef]
, [_Fld33653RRef] -- Номенклатура
) as TabZatratiSborka
ON TabZatratiSborka.[_RecorderRRef] = TabGoods.[_Document407_IDRRef]
and TabZatratiSborka.[_Fld33653RRef] = tabSet.[_Fld28059RRef]
where [_Fld3392] = 0x00 -- отменено ложь
UNION ALL
-- \\\\\\\\\\\\\\\\\\\\ ЗАТРАТЫ МП \\\\\\\\\\\\\\\
SELECT -- TOP (1000)
[_Period]
,'Затраты МП'
,'Приход'
, [_RecorderRRef] -- Регистратор отчет комиссионера
, '-' -- Номер документа
, '-' -- Номер заказа
, 'Отчет комиссионера'
, otchetKommissionera.[_Fld5484RRef] -- Организация
, otchetKommissionera.[_Fld5485RRef] -- партнер
, otchetKommissionera.[_Fld5486RRef] -- контрагент
, otchetKommissionera.[_Fld5492RRef] -- Менеджер
, [_Fld33391RRef] -- номенклатура
--,otchetKommissioneraTabTovari.[_Fld5531] -- Количество
, 0 -- Количество
, 0 as [Сумма]
--,[_Fld33394] as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
, currency._IDRRef -- Валюта документа
, '' -- ППУ
, 0 -- маректинг
, 0 -- Доставка
, 0 -- сборка
, [_Fld33394] -- Затраты МП
, 0 -- Затраты cклад хранение
, 0 -- Затраты cклад зарплата
, 0 -- Приемка
, 0 -- [АтсМаркировка]
, 0 -- [ВремяВыполненияМинут]
, 0 -- [СборкаЗаказа]
FROM [MAG_2019].[dbo].[_AccumRg33390]
LEFT JOIN [MAG_2019].[dbo].[_Document458_VT5524] as otchetKommissioneraTabTovari
on otchetKommissioneraTabTovari.[_Fld5526RRef] = [_Fld33391RRef]
AND otchetKommissioneraTabTovari.[_Document458_IDRRef] = [_RecorderRRef]
LEFT JOIN [MAG_2019].[dbo].[_Document458] as otchetKommissionera
ON otchetKommissionera.[_IDRRef] = otchetKommissioneraTabTovari.[_Document458_IDRRef]
LEFT JOIN (SELECT TOP (1) [_IDRRef]
FROM [MAG_2019].[dbo].[_Reference50]
where _code = '643') as currency
on 1 = 1
) as tabMain
LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura
ON refNomenclatura.[_IDRRef] = tabMain.onec_id
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = tabMain.Регистратор
LEFT JOIN [MAG_2019].[dbo].[_Document484] as refPPU
ON refPPU.[_IDRRef] = tabMain.Регистратор
LEFT JOIN [MAG_2019].[dbo].[_Reference198X1] as refOrganizaciya
on refOrganizaciya._IDRRef = tabMain.Организация
LEFT JOIN MAG_2019.dbo._reference50 val
ON val._IDRRef = tabMain.ВалютаДокумента
UNION ALL
-- \\\\\\\\\\\\\\\\\\\\ ПРИЕМКА, АТС МАРКИРОВКА \\\\\\\\\\\\\\\
SELECT -- TOP (5000)
DATEADD(year, -2000, [Период]) as [Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, val.[_Description] as [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = [Организация] ) as [Организация]
, (SELECT TOP(1)_description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = [Партнер]) as [Партнер]
, [PartnerId]
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = Контрагент) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = Менеджер) as [Менеджер]
, [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [1c_id], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [1c_id], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [1c_id], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [1c_id], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [1c_id], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, [Период])
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, [Период])
ORDER BY _Period desc ) as [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Сборка]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, 0 as [Доставка USD2+2]
, 0 as [НДС USD2+2]
, 0 as [Таможня USD2+2]
, 0 as [Сборка USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\ ПРИЕМКА \\\\\\\\\\\\\\\
SELECT --top 1000
docOtbor._Date_Time as [Период]
, 'Приемка товара' as [Статья]
, 'Приход' as [Вид операции]
, 'Закупка' as [Хоз операция]
, 'Отбор (размещение) товара' as [тип документа]
, docOtbor._Number as [Номер документа]
, zakasPostavshiku._Number as [Номер заказа]
, @CurrencyRubRRef as [Валюта документа] -- Валюта документа
, 'Руб' as [Ценовая группа]
, docOtbor._IDRRef as [1c_document_id]
, zakasPostavshiku._Fld3411RRef as [Организация] -- Организация
, zakasPostavshiku._Fld3409RRef as [Партнер] -- партнер
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),5,12) )) as [PartnerId]
, zakasPostavshiku._Fld3410RRef as [Контрагент] -- контрагент
, zakasPostavshiku._Fld3415RRef as [Менеджер] -- Менеджер
, otborTabRazmeshenie._Fld5347RRef as [1c_id] -- Номенклатура
, '' as [artic_id]
, '' as [Курс usd]
, '' as [Курс usd2]
, CAST(otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) as decimal(10,3)) as [Количество] -- Количество
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
, 0 as [Таможня]
, 0 as [ЕАЭС]
, 0 as [Доставка] -- доставка
, 0 as [Сборка] -- Сборка
, 0 as [ЗатратыМП] -- Затраты мп
, 0 as [НДС]
, 0 as [ЗатратыСкладХранение] -- Затраты склад хранение
, 0 as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
, ((CASE
WHEN DAY(docOtbor._Fld5324) <> DAY(docOtbor._Fld5325) THEN
((20 - DATEPART(HOUR, docOtbor._Fld5324)) * 60 - DATEPART(MINUTE, docOtbor._Fld5324) - DATEPART(SECOND, docOtbor._Fld5324) / 60.0) +
((DATEDIFF(DAY, docOtbor._Fld5324, docOtbor._Fld5325) - 1) * 12 * 60) +
((DATEPART(HOUR, docOtbor._Fld5325) - 8) * 60 + DATEPART(MINUTE, docOtbor._Fld5325) + DATEPART(SECOND, docOtbor._Fld5325) / 60.0)
ELSE
DATEDIFF(SECOND, docOtbor._Fld5324, docOtbor._Fld5325) / 60.0
END * 3 / SUM(otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1)) over (partition by docOtbor._IDRRef)
* otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1)) +
((COUNT(*) over (partition by docOtbor._IDRRef) / 3000 + otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) / 50000 +
(upackovka.ves * otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) / 15000)) / 3 * 20000)) / 1000 AS [Приемка]
, 0 as [АтсМаркировка]
, 0 as [ВремяВыполненияМинут]
, 0 as [СборкаЗаказа]
FROM
[MAG_2019].[dbo].[_Document453_VT5341X1] AS otborTabRazmeshenie
INNER JOIN [MAG_2019].[dbo].[_Document453X1] AS docOtbor
ON docOtbor._IDRRef = otborTabRazmeshenie._Document453_IDRRef
and docOtbor._Fld5316_RTRef = 0x000001E6 -- Фильтрация по псо
and docOtbor._Fld5325 >= @dtStart
and docOtbor._Fld5324 >= @dtStart
and docOtbor._Posted = 0x01
INNER JOIN [MAG_2019].[dbo].[_Document486] as docPSO
on docPSO._Fld7346_RTRef = 0x00000198 -- фильтрация по заказу поставщика
and docOtbor._Fld5316_RRRef = docPSO._IDRRef
LEFT JOIN [MAG_2019].[dbo].[_Document408X1] as zakasPostavshiku
on docPSO._Fld7346_RRRef = zakasPostavshiku._IDRRef
LEFT JOIN (
SELECT
upackovka._OwnerID_RRRef AS vladelec, -- Владелец
CASE WHEN upackovka._Fld24768 = 0 THEN
1
ELSE
ISNULL(upackovka._Fld24768, 1)
END AS chislitel, -- Числитель
upackovka._Fld24769 AS znamenatel, -- Знаменатель
CAST(CASE
WHEN 1 = 1 -- ВесИспользовать
AND upackovka._Fld24769 <> 0 -- Знаменатель
THEN upackovka._Fld24768 / upackovka._Fld24769
ELSE 0
END AS DECIMAL(15, 3)) AS ves
FROM
[MAG_2019].[dbo].[_Reference347X1] AS upackovka
WHERE
upackovka._Marked = 0 -- ПометкаУдаления
) AS upackovka
ON upackovka.vladelec = otborTabRazmeshenie._Fld5347RRef -- Сопоставление Номенклатуры и Владелец
WHERE
1=1
and ISNULL(otborTabRazmeshenie._Fld5346, 0) > 0
UNION ALL
-- \\\\\\\\\\\\\\\\\\\\ АТС МАРКИРОВКА \\\\\\\\\\\\\\\
SELECT -- TOP (1000)
tabAts.[Период] as [Период]
, 'Атс маркировка' as [Статья]
, 'Приход' as [Вид операции]
, 'Закупка' as [Хоз операция]
, 'Атс Маркировка товара' as [тип документа]
, AtsMark._Number as [Номер документа]
, '' as [Номер заказа]
, @CurrencyRubRRef as [Валюта документа] -- Валюта документа
, 'Руб' as [Ценовая группа]
, tabAts.atsRef as [1c_document_id]
, '' as [Организация] -- Организация
, '' as [Партнер] -- партнер
, '' as [PartnerId]
, '' as [Контрагент] -- контрагент
, '' as [Менеджер] -- Менеджер
, tabAts.nom AS Номенклатура -- Номенклатура
, '' as [artic_id]
, '' as [Курс usd]
, '' as [Курс usd2]
, CAST(tabAts._Fld33656 as decimal(10,3)) as [Количество] -- Количество
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
, 0 as [Таможня]
, 0 as [ЕАЭС]
, 0 as [Доставка] -- доставка
, 0 as [Сборка] -- Сборка
, 0 as [ЗатратыМП] -- Затраты мп
, 0 as [НДС]
, 0 as [ЗатратыСкладХранение] -- Затраты склад хранение
, 0 as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
, 0 AS Приемка
, tabAts.АтсМаркировка / 1000 AS [АтсМаркировка]
, CASE
WHEN DAY(AtsMark._Fld27693) <> DAY(AtsMark._Fld27694) THEN
(((20 - DATEPART(HOUR, AtsMark._Fld27693)) * 60 - DATEPART(MINUTE, AtsMark._Fld27693) - DATEPART(SECOND, AtsMark._Fld27693) / 60.0) +
((DATEDIFF(DAY, AtsMark._Fld27693, AtsMark._Fld27694) - 1) * 12 * 60) +
((DATEPART(HOUR, AtsMark._Fld27694) - 8) * 60 + DATEPART(MINUTE, AtsMark._Fld27694) + DATEPART(SECOND, AtsMark._Fld27694) / 60.0)) / SUM(tabAts._Fld33656) OVER (PARTITION BY tabAts.atsRef) * tabAts._Fld33656
ELSE
(DATEDIFF(MINUTE, AtsMark._Fld27693, AtsMark._Fld27694)) / SUM(tabAts._Fld33656) OVER (PARTITION BY tabAts.atsRef) * tabAts._Fld33656
END AS [ВремяВыполненияМинут]
, 0 AS [СборкаЗаказа]
FROM (
SELECT
rnRaboti.[_Period] AS [Период],
rnRaboti.[_RecorderRRef] AS atsRef,
rnRaboti.[_Fld33653RRef] AS nom, -- Номенклатура
SUM(rnRaboti.[_Fld33658]) / 1000 AS [АтсМаркировка],
SUM(rnRaboti._Fld33656) AS [_Fld33656]
FROM [MAG_2019].[dbo].[_AccumRg33652] AS rnRaboti
WHERE 1 = 1
AND rnRaboti.[_RecorderTRef] = 0x00006C28
GROUP BY
rnRaboti.[_Period],
rnRaboti.[_RecorderRRef],
rnRaboti.[_Fld33653RRef]
) AS tabAts
INNER JOIN [MAG_2019].[dbo].[_Document27688] AS AtsMark
ON AtsMark.[_IDRRef] = tabAts.atsRef
AND AtsMark._Posted = 0x01
AND AtsMark._Fld27694 >= @dtStart
WHERE 1 = 1
--UNION ALL
-- -- \\\\\\\\\\\\\\\\\\\\ СБОРКА ЗАКАЗА КЛИЕНТА \\\\\\\\\\\\\\\
-- SELECT -- TOP (1000)
--docOtbor._Date_Time as [Период]
--, 'Закупка' as [Статья]
--, 'Сборка заказа' as [Вид операции]
--, 'Закупка' as [Хоз операция]
--, 'Отбор (отбор) товара' as [тип документа]
--, docOtbor._Number as [Номер документа]
--, docZakazKlienta._Number as [Номер заказа]
--, @CurrencyRubRRef as [Валюта документа] -- Валюта документа
--, 'Руб' as [Ценовая группа]
--, docOtbor._IDRRef as [1c_document_id]
--, docZakazKlienta._Fld3129RRef as [Организация] -- Организация
--, docZakazKlienta._Fld3127RRef as [Партнер] -- партнер
--, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),5,12) )) as [PartnerId]
--, docZakazKlienta._Fld3128RRef as [Контрагент] -- контрагент
--, docZakazKlienta._Fld3138RRef as [Менеджер] -- Менеджер
-- , [_Fld5332RRef] as [1c_id] -- Номенклатура
--, '' as [artic_id]
--, '' as [Курс usd]
--, '' as [Курс usd2]
--, CAST([_Fld5330] as decimal(10, 3)) as [Количество] -- Количество
--, 0 as [Сумма]
--, 0 as [СуммаБезНДС]
--, 0 as [СуммаРучнойСкидки]
--, 0 as [СуммаАвтоСкидки]
--, 0 as [Закупка]
--, 0 as [Закупка, usd2]
--, 0 as [Таможня]
--, 0 as [ЕАЭС]
-- , 0 as [Доставка] -- доставка
--, 0 as [Сборка] -- Сборка
--, 0 as [ЗатратыМП] -- Затраты мп
--, 0 as [НДС]
--, 0 as [ЗатратыСкладХранение] -- Затраты склад хранение
--, 0 as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
--, 0 as [Приемка]
--, 0 as [АтсМаркировка]
-- , CASE
-- WHEN DAY(docOtbor.[_Fld5324]) <> DAY(docOtbor.[_Fld5325]) THEN
-- (((20 - DATEPART(HOUR, docOtbor.[_Fld5324])) * 60 - DATEPART(MINUTE, docOtbor.[_Fld5324]) - DATEPART(SECOND, docOtbor.[_Fld5324]) / 60.0) +
-- ((DATEDIFF(DAY, docOtbor.[_Fld5324], docOtbor.[_Fld5325]) - 1) * 12 * 60) +
-- ((DATEPART(HOUR, docOtbor.[_Fld5325]) - 8) * 60 + DATEPART(MINUTE, docOtbor.[_Fld5325]) + DATEPART(SECOND, docOtbor.[_Fld5325]) / 60.0)) / SUM([_Fld5330]) over (partition by [_Document453_IDRRef]) * [_Fld5330]
-- ELSE
-- (DATEDIFF(SECOND, docOtbor.[_Fld5324], docOtbor.[_Fld5325]) / 60.0) / SUM([_Fld5330]) over (partition by [_Document453_IDRRef]) * [_Fld5330]
-- END as [ВремяВыполненияМинут]
--,((SUM(1) over (partition by [_Document453_IDRRef]) / 5000 + [_Fld5330] / 20000)/2*30000) / 1000 as СборкаЗаказа
-- FROM [MAG_2019].[dbo].[_Document453_VT5326X1] as OtborTabOtbor
-- INNER JOIN [MAG_2019].[dbo].[_Document453X1] as docOtbor
-- ON docOtbor.[_IDRRef] = [_Document453_IDRRef]
-- and docOtbor._Posted = 0x01
-- and docOtbor._Fld5325 >= @dtStart
-- and docOtbor._Fld5324 >= @dtStart
-- and docOtbor.[_Fld5316_RTRef] = 0x000001F0 -- RSO
-- INNER JOIN [MAG_2019].[dbo].[_Document496X1] as docRSO
-- on docOtbor._Fld5316_RRRef = docRSO._IDRRef
-- and docRSO.[_Fld27744_RTRef] = 0x00000194 -- zakaz klienta
-- LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as docZakazKlienta
-- on docRSO.[_Fld27744_RRRef] = docZakazKlienta._IDRRef
-- WHERE 1=1
) as tabItogovoya
LEFT JOIN MAG_2019.dbo._reference50 as val
ON val._IDRRef = tabItogovoya.[Валюта документа]
WHERE DATEADD(year, -2000, [Период]) BETWEEN @dtStart and @dtEnd
) tabItog
WHERE 1=1
and [Период] BETWEEN @dtStart and @dtEnd
--AND [Период] < @dtEnd
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'
END
GO
/****** Object: StoredProcedure [pbi].[Заполнить себестоимостьОт2022(СкладХранение)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимостьОт2022(СкладХранение)]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- выберем вылуту рубль сразу ...
DECLARE @CurrencyRubRRef UNIQUEIDENTIFIER;
SELECT TOP (1) @CurrencyRubRRef = [_IDRRef]
FROM [MAG_2019].[dbo].[_Reference50]
WHERE _Code = '643';
-- \\\\\\\\\\\\\\\\\\\\ ЗАТРАТЫ СКЛАД ХРАНЕНИЕ \\\\\\\\\\\\\\\
SELECT --TOP (1)
[Период]
, 'Склад хранение'
,'Закупка'
, null -- регистратор
, '-' -- Номер документа
, '-' -- Номер заказа
, 'Склад хранение'
, '' -- Организация
, null as Партнер -- партнер
, null as Контрагент -- контрагент
, null as Менеджер -- Менеджер
, [1c_id] -- Номенклатура
, 0 -- Количество
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
, @CurrencyRubRRef -- Валюта документа
, '' -- ППУ
, 0 -- маркетинг
, 0 -- доставка
, 0 -- Сборка
, 0 -- Затраты мп
, 20000000 / 30 * ([volume] / [totalVolume]) / 1000 as [ЗатратыСкладХранение] -- Затраты склад хранение
, 200000 * ([volume] / [totalVolume]) / 1000 as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
, 0 -- Приемка
, 0 -- [АтсМаркировка]
, 0 -- [ВремяВыполненияМинут]
, 0 -- [СборкаЗаказа]
--,[_Fld33634_RRRef] -- статья расходов
FROM [mag_pbi].[pbi].[nomenclatureVolumeStorehouse]
where YEAR([Период]) >= 2024
END
GO
/****** Object: StoredProcedure [pbi].[Обновить себестоимость] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbi].[Обновить себестоимость]
@full_update bit = 0
AS
BEGIN
-- DECLARE @full_update bit = 1
DECLARE @dt datetime2 = '2015-01-01'
DECLARE @full_update_local_var bit = 0
--полностью обновляем таблицу в воскресенье
IF ( SELECT DATEPART(WEEKDAY, GETDATE()) )= 7 OR @full_update = 1 OR format(getdate(), 'yyyy-MM-dd') = '2023-07-29'--( SELECT DAY(CURRENT_TIMESTAMP) )= 1 OR @full_update = 1
SET @full_update_local_var = 1
SELECT @full_update_local_var
IF @full_update_local_var = 1
BEGIN
DROP TABLE IF EXISTS pbi.[Себестоимость] --таблицу удаляем, чтобы удалить индексы. так быстрее вставлять большие массивы данных
EXEC [sebest].[Создать таблицу]
END
ELSE BEGIN
SET @dt = (select DATEADD(MONTH, -1, GETDATE()))
END
--В этой процедуре создается таблица, в ней же очищается таблица себестоимость начиная с даты @dt
exec sebest.[Заполнить себестоимость закупкой] @dt-- Добавляем закупку
exec sebest.[Заполнить себестоимость начальным остатком] @dt-- Добавляем начальные остатки
/* поменял процедуру только на копирование регистра Выручка и Себестоимость продаж */
exec sebest.[Заполнить себестоимость продажей] @dt -- Добавляем продажи
exec [sebest].[Заполнить себестоимость комплектующими] @dt
exec sebest.[Заполнить себестоимость комплектами] @dt -- Добавляем все движения по фасовке
IF @full_update_local_var = 1--( SELECT DAY(CURRENT_TIMESTAMP) )= 1 OR @full_update = 1
exec sebest.[Создать индексы]
--Записываем две колонки с курсом usd2+2 и usd
UPDATE mag_pbi.pbi.[Себестоимость] SET
[Курс usd2] = (
SELECT TOP 1 _Fld13220/_Fld13221 FROM [mag_2019].[dbo].[_InfoRg13218] k--РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, k._Period) <= [Период]
ORDER BY k._Period desc)
,
[Курс usd] = (
SELECT TOP 1 _Fld13220/_Fld13221 FROM [mag_2019].[dbo].[_InfoRg13218] k--РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, k._Period) <= [Период]
ORDER BY k._Period desc)
WHERE [Период]>=@dt
--записываем закупочную цену в usd2 из рублей, кроме тех, у кого валюта документа usd2
UPDATE mag_pbi.pbi.[Себестоимость] SET [Закупка, usd2] = [Закупка]/[Курс usd2]
WHERE [Валюта документа]<>'USD2' AND [Статья] = 'Закупка' AND [Вид операции]<>'Продажа'
AND [Период]>=@dt
/* это главная процедура расчета себестоимости. Выполняется очень долго, каждое вс пересчитывает полностью весь регистр, каждый день считает только посл. 1 месяц*/
exec [sebest].[Расчет себестомисти] @dt, 0 -- запуск не для коплектов, только комплектующие
--exec [sebest].[Проставить стоимость комплектов] @dt
--exec [sebest].[Расчет себестомисти] @dt, 1 -- второй проход для комплектующих
UPDATE mag_pbi.pbi.[Себестоимость] SET [Учетная цена, новое] = CASE WHEN [Количество] <> 0 THEN [закупка] / [Количество] ELSE 0 END
WHERE 1=1--[Статья] = 'Закупка' AND [Вид операции]='Продажа'
AND [Период]>=@dt
--exec sebest.[Заполнить себестоимость курсовой разницей] -- Добавляем курсовую разницу
/*
0x80CD002590EC174111E581505088A8D5 USD
0x80D40CC47A052DFD11E6B6DD1820D178 Eur
0x80E90CC47A052DFD11E7145927CEFC24 Cny
0xAE9DB496910DCFD611E94F10743DE3FF USD2
0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
*/
END
/*
-- Продажу считаем по внутреннему курсу
/*UPDATE mag_pbi.pbi.[Себестоимость] SET [Курс usd2] = (
SELECT TOP 1 _Fld13220 FROM [mag_2019].[dbo].[_InfoRg13218] k--РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, k._Period) <= [Период]
ORDER BY k._Period desc)
WHERE [Статья] = 'Закупка' AND [Вид операции]='Продажа'
AND [Период]>=@dt
*/
--DECLARE @dt datetime2 = '2015-01-01'
--подставляем старое значение учетной цены
UPDATE mag_pbi.pbi.[Себестоимость] SET [Учетная цена, старое] = (
isnull(
(SELECT top 1 its.[_Fld27138] / 1000 FROM [mag_2019].[dbo].[_InfoRg27129X1] its -- РегистрСведений.ITS_ОсновнойОтчет
WHERE its._Fld27130RRef = [1C_id] AND its.[_Fld27138] > 0
and datediff(month, DATEADD(year, -2000, its._Period), [Период]) >= 0
ORDER BY its._period desc) ,
(SELECT TOP (1) [Цена]/1000
FROM [mag_reports].[sales].[pricelist] p
where p.[1c_id] = [1c_id] and [Вид цены] = 'Учетная цена (руб)'
ORDER BY _Period desc)
)
)
WHERE [Статья] = 'Закупка' AND [Вид операции]='Продажа'
AND [Период]>=@dt
*/
GO
/****** Object: StoredProcedure [pbi].[РасчетСебестоимостиОт2022] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE РасчетСебестоимостиОт2022
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
exec [sebest].[Заполнить себестоимостьОт2022(закупки+продажи)]
END
GO
/****** Object: StoredProcedure [pbi].[создание среза учетных цен] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [pbi].[создание среза учетных цен] as
BEGIN
--DROP TABlE analytics.[срез учетных цен]
INSERT INTO analytics.[срез учетных цен]
SELECT
[1c_id]
,[artic_id]
, null as [Учетная цена]
, null as [Учетная цена USD2+2]
, format(GETDATE(), 'yyyy-MM-dd') as [Период]
, null as [Количество]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] seb
group by [1c_id]
,[artic_id]
UPDATE srez SET
[Учетная цена] = (
SELECT
sum(Закупка)+sum(НДС)+sum(Доставка)+sum(Таможня)
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] ss
where Статья in ('Ввод начальных остатков', 'Закупка', 'Реализация', 'НДС', 'Доставка контейнера ВЭД', 'Производство товара')
AND ss.[1c_id]=srez.[1c_id]
)
FROM analytics.[срез учетных цен] srez
WHERE /* [Учетная цена] is null AND*/ [Период] = format(GETDATE(), 'yyyy-MM-dd')
UPDATE srez SET
[Количество] = (
SELECT
sum([Количество])
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] ss
where Статья in ('Ввод начальных остатков', 'Закупка', 'Реализация', 'НДС', 'Доставка контейнера ВЭД', 'Производство товара')
AND ss.[1c_id]=srez.[1c_id]
)
FROM analytics.[срез учетных цен] srez
WHERE /*[Количество] is null AND */[Период] = format(GETDATE(), 'yyyy-MM-dd')
UPDATE srez SET
[Учетная цена USD2+2] = (
SELECT
sum([Закупка, usd2])+sum(НДС/[Курс usd2])+sum(Доставка/[Курс usd2])+sum(Таможня/[Курс usd2])
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] ss
where Статья in ('Ввод начальных остатков', 'Закупка', 'Реализация', 'НДС', 'Доставка контейнера ВЭД', 'Производство товара')
AND ss.[1c_id]=srez.[1c_id]
)
FROM analytics.[срез учетных цен] srez
WHERE /*[Учетная цена USD2+2] is null AND*/ [Период] = format(GETDATE(), 'yyyy-MM-dd')
UPDATE analytics.[срез учетных цен] SET [Учетная цена] = [Учетная цена] / [Количество] WHERE [Период] = format(GETDATE(), 'yyyy-MM-dd') AND [Количество]>0
UPDATE analytics.[срез учетных цен] SET [Учетная цена USD2+2] = [Учетная цена USD2+2] / [Количество] WHERE [Период] = format(GETDATE(), 'yyyy-MM-dd') AND [Количество]>0
UPDATE analytics.[срез учетных цен] SET [Учетная цена USD2+2] = null WHERE [Период] = format(GETDATE(), 'yyyy-MM-dd') --AND [Количество]>0
-- обновляем учетку по закупкам, тк в продажах не было
/*
UPDATE p SET
[Учетная цена] =
( SELECT top 1 s.[Учетная цена]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0
ORDER by s.Период DESC
),
[Учетная цена USD2+2] =
( SELECT top 1 s.[Учетная цена USD2+2]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Закупка' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0
ORDER by s.Период DESC)
FROM analytics.[срез учетных цен] p
WHERE [Учетная цена] is null
-- обновляем учетку по вводу начальных остатков
UPDATE p SET
[Учетная цена] =
( SELECT top 1 s.[Учетная цена]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена] > 0
ORDER by s.Период DESC
),
[Учетная цена USD2+2] =
( SELECT top 1 s.[Учетная цена USD2+2]
FROM [mag_pbi].[pbiProd].[СебестоимостьСводныйОт2022] s
WHERE s.[1c_id]=p.[1c_id] AND s.[Статья]='Ввод начальных остатков' AND s.[Вид операции]='Приход' AND s.[Учетная цена USD2+2] > 0
ORDER by s.Период DESC)
FROM analytics.[срез учетных цен] p
WHERE [Учетная цена] is null
*/
END
GO
/****** Object: StoredProcedure [pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[ЗаполнитьСебестоимостьСводныйОт2022]
-- Add the parameters for the stored procedure here
AS
BEGIN
DELETE FROM mag_pbi.[pbiProd].[СебестоимостьСводныйОт2022] WHERE 1=1
DBCC CHECKIDENT ('[pbiProd].[СебестоимостьСводныйОт2022]', RESEED, 0);
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьСводныйОт2022] (
[Период]
,[Статья]
,[Вид операции]
,[Хоз операция]
,[Организация]
,[Партнер]
,[PartnerId]
,[Контрагент]
,[Менеджер]
,[Тип документа]
,[Номер документа]
,[Валюта документа]
,[Ценовая группа]
,[1c_document_id]
,[1c_id]
,[artic_id]
,[Количество]
,[Сумма]
,[СуммаБезНДС]
,[СуммаРучнойСкидки]
,[СуммаАвтоСкидки]
,[Закупка]
,[Закупка, usd2]
,[Курс usd2]
,[Курс usd]
,[Таможня]
,[Учетная цена]
,[Учетная цена USD2+2]
,[Учетная стоимость]
,[Учетная стоимость USD2+2]
,[Заказ закрыт]
,[Номер заказа]
,[Доставка]
,[НДС]
,[Производство]
,[Code]
,[ЗатратыСкладХранение]
,[Приемка]
,[АтсМаркировка]
,[ВремяВыполненияМинут]
,[СборкаЗаказа]
,[КоличествоУпаковок]
,[Сумма скидки]
,[Сумма скидки USD2+2]
,[Доп расходы]
,[Доп расходы USD2+2]
)
SELECT -- TOP (100)
[Период]
,[Статья]
,[Вид операции]
,[Хоз операция]
,[Организация]
,[Партнер]
,[PartnerId]
,[Контрагент]
,[Менеджер]
,[Тип документа]
,[Номер документа]
,[Валюта документа]
,[Ценовая группа]
,[1c_document_id]
,ss.[1c_id]
,ss.[artic_id]
,[Количество]
,[Сумма]
,[СуммаБезНДС]
,[СуммаРучнойСкидки]
,[СуммаАвтоСкидки]
,[Закупка]
,[Закупка, usd2]
,[Курс usd2]
,[Курс usd]
,[Таможня]
,[Учетная цена]
,[Учетная цена USD2+2]
,[Учетная стоимость]
,[Учетная стоимость USD2+2]
,[Заказ закрыт]
,[Номер заказа]
,[Доставка]
,[НДС]
,[Производство]
,nom.[code]
,[ЗатратыСкладХранение]
,[Приемка]
,[АтсМаркировка]
,[ВремяВыполненияМинут]
,[СборкаЗаказа]
,[Количество] / CASE WHEN ISNULL(nom.[Базовая упаковка], 1) = 0 THEN
1
else
ISNULL(nom.[Базовая упаковка], 1)
END as [КоличествоУпаковок]
, [СуммаРучнойСкидки] + [СуммаАвтоСкидки] as [Сумма скидки]
, ([СуммаРучнойСкидки] + [СуммаАвтоСкидки]) / [Курс usd2] as [Сумма скидки USD2+2]
,[Доп расходы]
,[Доп расходы USD2+2]
FROM [mag_pbi].[pbiProd].[СводныйСебестоимость] as ss
LEFT JOIN [mag_pbi].[pbi].[nomenclature] as nom
on nom.artic_id = ss.artic_id
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(АтсМаркировка)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
)
SELECT -- top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\ АТС МАРКИРОВКА \\\\\\\\\\\\\\\
SELECT -- TOP (1000)
DATEADD(year, -2000, tabAts.[Период]) as [Период]
, 'Атс маркировка' as [Статья]
, 'Приход' as [Вид операции]
, Null as [Хоз операция]
, 'Атс Маркировка товара' as [тип документа]
, AtsMark._Number as [Номер документа]
, '' as [Номер заказа]
, 'Руб' as [Валюта документа] -- Валюта документа
, 'Руб' as [Ценовая группа]
, tabAts.atsRef as [1c_document_id]
, Null as [Организация] -- Организация
, Null as [Партнер] -- партнер
, Null as [PartnerId]
, Null as [Контрагент] -- контрагент
, Null as [Менеджер] -- Менеджер
, tabAts.nom AS [1c_id] -- Номенклатура
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), tabAts.nom, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), tabAts.nom, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), tabAts.nom, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), tabAts.nom, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), tabAts.nom, 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= tabAts.[Период]
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= tabAts.[Период]
ORDER BY _Period desc ) as [Курс usd2]
, CAST(tabAts._Fld33656 as decimal(10,3)) as [Количество] -- Количество
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка] -- доставка
, Null as [Производство] -- Сборка
, Null as [ЗатратыМП] -- Затраты мп
, Null as [НДС]
, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
, Null as Приемка
, tabAts.АтсМаркировка / 1000 AS [АтсМаркировка]
, CASE
WHEN DAY(AtsMark._Fld27693) <> DAY(AtsMark._Fld27694) THEN
(((20 - DATEPART(HOUR, AtsMark._Fld27693)) * 60 - DATEPART(MINUTE, AtsMark._Fld27693) - DATEPART(SECOND, AtsMark._Fld27693) / 60.0) +
((DATEDIFF(DAY, AtsMark._Fld27693, AtsMark._Fld27694) - 1) * 12 * 60) +
((DATEPART(HOUR, AtsMark._Fld27694) - 8) * 60 + DATEPART(MINUTE, AtsMark._Fld27694) + DATEPART(SECOND, AtsMark._Fld27694) / 60.0)) / SUM(tabAts._Fld33656) OVER (PARTITION BY tabAts.atsRef) * tabAts._Fld33656
ELSE
(DATEDIFF(MINUTE, AtsMark._Fld27693, AtsMark._Fld27694)) / SUM(tabAts._Fld33656) OVER (PARTITION BY tabAts.atsRef) * tabAts._Fld33656
END as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM (
SELECT
rnRaboti.[_Period] AS [Период],
rnRaboti.[_RecorderRRef] AS atsRef,
rnRaboti.[_Fld33653RRef] AS nom, -- Номенклатура
SUM(rnRaboti.[_Fld33658]) / 1000 AS [АтсМаркировка],
SUM(rnRaboti._Fld33656) AS [_Fld33656]
FROM [MAG_2019].[dbo].[_AccumRg33652] AS rnRaboti
WHERE 1 = 1
AND rnRaboti.[_RecorderTRef] = 0x00006C28
GROUP BY
rnRaboti.[_Period],
rnRaboti.[_RecorderRRef],
rnRaboti.[_Fld33653RRef]
) AS tabAts
INNER JOIN [MAG_2019].[dbo].[_Document27688] AS AtsMark
ON AtsMark.[_IDRRef] = tabAts.atsRef
AND AtsMark._Posted = 0x01
AND AtsMark._Fld27694 >= @dtStart
WHERE 1 = 1
and tabAts.[Период] >= @dtSqlStart
) as tabPriemka
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ДопРасходы)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ДопРасходы)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
, [Доп расходы], [Доп расходы USD2+2]
)
SELECT -- top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство USD2+2]
, [Доп расходы] as [Доп расходы]
, [Доп расходы] / [Курс usd2] as [Доп расходы USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ДОП РАСХОДЫ \\\\\\\\\\\\\\\\
SELECT --TOP (1)
DATEADD(year, -2000, refPTU.[_Date_Time]) as [Период]
, 'Доп расходы' as [Статья]
, 'Приход' as [Вид операции]
, Null as [Хоз операция]
, 'ПТУ' as [тип документа]
, Null as [Номер документа]
, Null as [Номер заказа]
, val._Description as [Валюта документа]
, CASE
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб'
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал'
ELSE 'Неопределено'
END as [Ценовая группа]
, _Fld33630RRef as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = refPTU.[_Fld7121RRef] ) as [Организация]
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = refPTU.[_Fld7060RRef]) as [Партнер]
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),5,12) ))as PartnerId
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = refPTU.[_Fld7064RRef]) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = refPTU.[_Fld7067RRef]) as [Менеджер]
, [_Fld33631RRef] as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= refPTU.[_Date_Time]
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= refPTU.[_Date_Time]
ORDER BY _Period desc ) as [Курс usd2]
, Null as [Количество]
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка]
, Null as [Производство]
, Null as [ЗатратыМП]
, Null as [НДС]
, Null as [ЗатратыСкладХранение]
, Null as [ЗатратыСкладЗарплата]
, Null as [Приемка]
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
, [_Fld33633] / 1000 as [Доп расходы]
, 0 as [Доп расходы USD2+2]
FROM [MAG_2019].[dbo].[_InfoRg33629]
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = [_Fld33630RRef]
-- LEFT JOIN [MAG_2019].[dbo].[_Document483_VT7128X1] as refPtuNomen
--ON refPtuNomen.[_Document483_IDRRef] = refPTU.[_IDRRef]
-- AND refPtuNomen.[_Fld7130RRef] = [_Fld33631RRef]
LEFT JOIN MAG_2019.dbo._reference50 val
ON val._IDRRef = refPTU.[_Fld7059RRef]
LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura
ON refNomenclatura.[_IDRRef] = [_Fld33631RRef]
where [_Fld33634_RRRef] = 0x998DB49691D57EFD11F0366B9FA43F0B
and refPTU.[_Date_Time] >= @dtSqlStart
) as tabDopRashod
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Доставка)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
)
SELECT -- top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка] / [Курс usd2] as [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ДОСТАВКА \\\\\\\\\\\\\\\\
SELECT --TOP (1)
DATEADD(year, -2000, refPTU.[_Date_Time]) as [Период]
, 'Доставка контейнера ВЭД' as [Статья]
, 'Приход' as [Вид операции]
, Null as [Хоз операция]
, 'ПТУ' as [тип документа]
, Null as [Номер документа]
, Null as [Номер заказа]
, val._Description as [Валюта документа]
, CASE
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб'
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал'
ELSE 'Неопределено'
END as [Ценовая группа]
, _Fld33630RRef as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = refPTU.[_Fld7121RRef] ) as [Организация]
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = refPTU.[_Fld7060RRef]) as [Партнер]
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), refPTU.[_Fld7060RRef], 2),5,12) ))as PartnerId
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = refPTU.[_Fld7064RRef]) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = refPTU.[_Fld7067RRef]) as [Менеджер]
, [_Fld33631RRef] as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33631RRef], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= refPTU.[_Date_Time]
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= refPTU.[_Date_Time]
ORDER BY _Period desc ) as [Курс usd2]
, Null as [Количество]
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, [_Fld33633] / 1000 as [Доставка]
, Null as [Производство]
, Null as [ЗатратыМП]
, Null as [НДС]
, Null as [ЗатратыСкладХранение]
, Null as [ЗатратыСкладЗарплата]
, Null as [Приемка]
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM [MAG_2019].[dbo].[_InfoRg33629]
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = [_Fld33630RRef]
-- LEFT JOIN [MAG_2019].[dbo].[_Document483_VT7128X1] as refPtuNomen
--ON refPtuNomen.[_Document483_IDRRef] = refPTU.[_IDRRef]
-- AND refPtuNomen.[_Fld7130RRef] = [_Fld33631RRef]
LEFT JOIN MAG_2019.dbo._reference50 val
ON val._IDRRef = refPTU.[_Fld7059RRef]
LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura
ON refNomenclatura.[_IDRRef] = [_Fld33631RRef]
where [_Fld33634_RRRef] = 0x997EB49691D57EFD11ECE1AC556F9FF0
and refPTU.[_Date_Time] >= @dtSqlStart
) as tabDostavka
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Закупка)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство] , [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
)
SELECT --top 1000
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка] / [Курс usd2] as [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка] / [Курс usd2] as [Доставка USD2+2]
, [НДС] / [Курс usd2] as [НДС USD2+2]
, [Таможня] / [Курс usd2] as [Таможня USD2+2]
, [Производство] / [Курс usd2] as [Производство USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ЗАКУПКИ \\\\\\\\\\\\\\\\
select --top (1)
DATEADD(year, -2000, _Period) as [Период]
, case
WHEN r._RecorderTRef=0x000001A1 or r._RecorderTRef=0x0000020D THEN 'НДС'
--WHEN r._RecorderTRef=0x000001A1 THEN 'ЕАЭС'
--WHEN r._RecorderTRef=0x0000020D THEN 'Таможня'
ELSE 'Закупка'
END
as [Статья]
, 'Приход' as [Вид операции]
, Null as [Хоз операция]
, case r._RecorderTRef
WHEN 0x000001A1 then 'Заявление о ввозе товаров из ЕАЭС'
WHEN 0x00000189 then 'Возврат товаров поставщику'
WHEN 0x000001E3 then 'ПТУ'
WHEN 0x000001D5 then 'Передача товаров'
WHEN 0x000001B0 then 'Корректировка '
WHEN 0x0000020D then 'Таможенная декларация на импорт'
ELSE 'Неизвестный тип'
END as [тип документа]
, Null as [Номер документа]
, Null as [Номер заказа]
, val._Description as [Валюта документа]
, CASE
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб'
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал'
WHEN r._RecorderTRef = 0x0000020D THEN 'Руб'
ELSE 'Неопределено'
END as [Ценовая группа]
, r._RecorderRRef as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = r._Fld16346RRef ) as [Организация]
, (SELECT TOP(1) _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = r.[_Fld16353RRef]) as [Партнер]
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),5,12) ))as PartnerId
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = r._Fld16354_RRRef) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = [_Fld16348RRef]) as [Менеджер]
, analitikaUchetaNomenklaturi.[_Fld20498RRef] as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
--WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= r._Period
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
--WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= r._Period
ORDER BY _Period desc ) as [Курс usd2]
, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
THEN
case [_Fld16345RRef]
when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN -[_Fld16361]
ELSE [_Fld16361] END
--WHEN r._RecorderTRef = 0x0000020D THEN customDeclaration._Fld8943
WHEN r._RecorderTRef = 0x0000020D THEN 0
--WHEN r._RecorderTRef=0x000001A1 THEN docEAS.[_Fld4052]
WHEN r._RecorderTRef=0x000001A1 THEN 0
ELSE 0 END
as [Количество]
, [_Fld16362] / 1000 as [Сумма]
, [_Fld16363] / 1000 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
THEN
case [_Fld16345RRef]
when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN -[_Fld16362] / 1000
ELSE [_Fld16362] / 1000 END
ELSE 0 END
AS [Закупка]
, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка поле "сумма в валюте документа"
THEN
case [_Fld16345RRef]
when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN -[_Fld16373] / 1000
ELSE [_Fld16373] / 1000 END
ELSE 0 END as [Закупка, usd2]
, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000 END as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка] -- доставка
, Null as [Производство] -- [Производство]
, Null as [ЗатратыМП] -- Затраты МП
, CASE WHEN r._RecorderTRef=0x000001A1 or r._RecorderTRef=0x0000020D THEN ([_Fld16362] - [_Fld16363]) / 1000
ELSE Null END as [НДС]
, Null as [ЗатратыСкладХранение] -- Затраты cклад хранение
, Null as [ЗатратыСкладЗарплата]-- Затраты cклад зарплаты
, Null as [Приемка]
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
from
mag_2019.dbo._AccumRg16344 r-- Регистр накопления Закупки
LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef]
LEFT JOIN MAG_2019.dbo._Reference188X1 as N
on analitikaUchetaNomenklaturi.[_Fld20498RRef] = N._IDRRef
LEFT JOIN MAG_2019.dbo._reference50 val
ON val._IDRRef = r._Fld16372RRef
LEFT JOIN [MAG_2019].[dbo].[_Document525_VT8936] as customDeclaration
ON customDeclaration.[_Document525_IDRRef] = [r]._RecorderRRef
and analitikaUchetaNomenklaturi.[_Fld20498RRef] = customDeclaration._Fld8939RRef
LEFT JOIN [MAG_2019].[dbo].[_Document417_VT4034] as docEAS
ON docEAS.[_Document417_IDRRef] = [r]._RecorderRRef
and [_Fld16349RRef] = docEAS.[_Fld4037RRef]
where _Period >= @dtSqlStart
) tabZakupki
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ЗатратыМП)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство] , [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
)
SELECT -- top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\ ЗАТРАТЫ МП \\\\\\\\\\\\\\\
SELECT -- TOP (1000)
DATEADD(year, -2000, [_Period]) as [Период]
, 'Затраты МП' as [Статья]
, 'Приход' as [Вид операции]
, Null as [Хоз операция]
, 'Отчет комиссионера' as [тип документа]
, Null as [Номер документа]
, Null as [Номер заказа]
, 'Руб' as [Валюта документа]
, 'Руб' as [Ценовая группа]
, [_RecorderRRef] as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = otchetKommissionera.[_Fld5484RRef]) as [Организация]
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = otchetKommissionera.[_Fld5485RRef] ) as [Партнер]
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), otchetKommissionera.[_Fld5485RRef] , 2),5,12) ))as PartnerId
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = otchetKommissionera.[_Fld5486RRef]) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = otchetKommissionera.[_Fld5492RRef]) as [Менеджер]
, [_Fld33391RRef] as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld33391RRef], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= r.[_Period]
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= r.[_Period]
ORDER BY _Period desc ) as [Курс usd2]
, Null as [Количество]
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка]
, Null as [Производство]
, [_Fld33394] / 1000 as [ЗатратыМП]
, Null as [НДС]
, Null as [ЗатратыСкладХранение]
, Null as [ЗатратыСкладЗарплата]
, Null as [Приемка]
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM [MAG_2019].[dbo].[_AccumRg33390] as r
LEFT JOIN [MAG_2019].[dbo].[_Document458_VT5524] as otchetKommissioneraTabTovari
on otchetKommissioneraTabTovari.[_Fld5526RRef] = [_Fld33391RRef]
AND otchetKommissioneraTabTovari.[_Document458_IDRRef] = [_RecorderRRef]
LEFT JOIN [MAG_2019].[dbo].[_Document458] as otchetKommissionera
ON otchetKommissionera.[_IDRRef] = otchetKommissioneraTabTovari.[_Document458_IDRRef]
where [_Period] >= @dtSqlStart
) as tabZatratiMP
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Перерасчет)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Перерасчет)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
)
SELECT --top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\ СПИСАНИЕ ТОВАРОВ \\\\\\\\\\\\\\\
SELECT --top (555)
DATEADD(year, -2000, refSpisNedTov._Date_Time) as [Период]
, 'Списание товара' as [Статья]
, 'Расход' as [Вид операции]
, Null as [Хоз операция]
, 'Списание недостач' as [тип документа]
, refSpisNedTov._Number as [Номер документа]
, '' as [Номер заказа]
, 'Руб' as [Валюта документа] -- Валюта документа
, 'Руб' as [Ценовая группа]
, refSpisNedTov._IDRRef as [1c_document_id]
, Null as [Организация] -- Организация
, Null as [Партнер] -- партнер
, Null as [PartnerId]
, Null as [Контрагент] -- контрагент
, Null as [Менеджер] -- Менеджер
, tabSpisNedTov.[_Fld8532RRef] AS [1c_id] -- Номенклатура
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), tabSpisNedTov.[_Fld8532RRef], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= refSpisNedTov._Date_Time
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= refSpisNedTov._Date_Time
ORDER BY _Period desc ) as [Курс usd2]
, CAST(tabSpisNedTov.[_Fld8535] as decimal(15,3)) as [Количество] -- Количество
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка] -- доставка
, Null as [Производство] -- Сборка
, Null as [ЗатратыМП] -- Затраты мп
, Null as [НДС]
, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
, Null as Приемка
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM [MAG_2019].[dbo].[_Document512_VT8530] as tabSpisNedTov
INNER JOIN [MAG_2019].[dbo].[_Document512] as refSpisNedTov
on refSpisNedTov._IDRRef = tabSpisNedTov._Document512_IDRRef
and refSpisNedTov._Posted = 1
-- \\\\\\\\\\\\\\\\\\\\ ОПРИХОДОВАНИЕ ИЗЛИШКОВ ТОВАРОВ \\\\\\\\\\\\\\\
UNION ALL
SELECT --top (1000)
DATEADD(year, -2000, refOprixTov._Date_Time) as [Период]
, 'Оприходование излишков товара' as [Статья]
, 'Приход' as [Вид операции]
, Null as [Хоз операция]
, 'Оприходование излишков' as [тип документа]
, refOprixTov._Number as [Номер документа]
, '' as [Номер заказа]
, 'Руб' as [Валюта документа] -- Валюта документа
, 'Руб' as [Ценовая группа]
, refOprixTov._IDRRef as [1c_document_id]
, Null as [Организация] -- Организация
, Null as [Партнер] -- партнер
, Null as [PartnerId]
, Null as [Контрагент] -- контрагент
, Null as [Менеджер] -- Менеджер
, tabOprixTov.[_Fld5171RRef] AS [1c_id] -- Номенклатура
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), tabOprixTov.[_Fld5171RRef], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= refOprixTov._Date_Time
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= refOprixTov._Date_Time
ORDER BY _Period desc ) as [Курс usd2]
, CAST(tabOprixTov.[_Fld5174] as decimal(15,3)) as [Количество] -- Количество
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка] -- доставка
, Null as [Производство] -- Сборка
, Null as [ЗатратыМП] -- Затраты мп
, Null as [НДС]
, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
, Null as Приемка
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM [MAG_2019].[dbo].[_Document446_VT5169] as tabOprixTov
INNER JOIN [MAG_2019].[dbo].[_Document446] as refOprixTov
on refOprixTov._IDRRef = tabOprixTov.[_Document446_IDRRef]
and refOprixTov._Posted = 1
) as tabPereschet
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ПерерасчетСкладскойКонтур)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(ПерерасчетСкладскойКонтур)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] , [Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
)
SELECT --top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\ СПИСАНИЕ ТОВАРОВ \\\\\\\\\\\\\\\
SELECT --top (555)
DATEADD(year, -2000, RNtovariNaSkladah.[_Period]) as [Период]
, 'Пересчет товара' as [Статья]
, CASE WHEN [_RecordKind] = 1 THEN
'Расход'
ELSE
'Приход'
END as [Вид операции]
, Null as [Хоз операция]
, 'Списание недостач' as [тип документа]
, dokPereschet._Number as [Номер документа]
, '' as [Номер заказа]
, 'Руб' as [Валюта документа] -- Валюта документа
, 'Руб' as [Ценовая группа]
, [_RecorderRRef] as [1c_document_id]
, Null as [Организация] -- Организация
, Null as [Партнер] -- партнер
, Null as [PartnerId]
, Null as [Контрагент] -- контрагент
, Null as [Менеджер] -- Менеджер
, [_Fld17485RRef] AS [1c_id] -- Номенклатура
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld17485RRef], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= RNtovariNaSkladah.[_Period]
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= RNtovariNaSkladah.[_Period]
ORDER BY _Period desc ) as [Курс usd2]
, CASE WHEN [_RecordKind] = 1 THEN
[_Fld17491] * -1
ELSE
[_Fld17491]
END as [Количество] -- Количество
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка] -- доставка
, Null as [Производство] -- Сборка
, Null as [ЗатратыМП] -- Затраты мп
, Null as [НДС]
, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
, Null as Приемка
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM [MAG_2019].[dbo].[_AccumRg17484] as RNtovariNaSkladah
LEFT JOIN [MAG_2019].[dbo].[_Document473X1] as dokPereschet
on dokPereschet._IDRRef = [_RecorderRRef]
where [_RecorderTRef] = 0x000001D9 -- Документ пересчет
and [_Period] > @dtSqlStart
) as tabPereschet
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Приемка)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
)
SELECT -- top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\ ПРИЕМКА \\\\\\\\\\\\\\\
SELECT --top 1000
DATEADD(year, -2000, docOtbor._Date_Time) as [Период]
, 'Приемка товара' as [Статья]
, 'Приход' as [Вид операции]
, Null as [Хоз операция]
, 'Отбор (размещение) товара' as [тип документа]
, docOtbor._Number as [Номер документа]
, zakasPostavshiku._Number as [Номер заказа]
, 'Руб' as [Валюта документа] -- Валюта документа
, 'Руб' as [Ценовая группа]
, docOtbor._IDRRef as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = zakasPostavshiku._Fld3411RRef ) as [Организация]
, (SELECT TOP(1) _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = zakasPostavshiku._Fld3409RRef) as [Партнер]
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), zakasPostavshiku._Fld3409RRef , 2),5,12) )) as [PartnerId]
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = zakasPostavshiku._Fld3410RRef) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = zakasPostavshiku._Fld3415RRef) as [Менеджер]
, otborTabRazmeshenie._Fld5347RRef as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), otborTabRazmeshenie._Fld5347RRef, 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= docOtbor._Date_Time
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= docOtbor._Date_Time
ORDER BY _Period desc ) as [Курс usd2]
, Null as [Количество] -- Количество
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка] -- доставка
, Null as [Производство] -- Производство \\\ Сборка
, Null as [ЗатратыМП] -- Затраты мп
, Null as [НДС]
, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
, ((CASE
WHEN DAY(docOtbor._Fld5324) <> DAY(docOtbor._Fld5325) THEN
((20 - DATEPART(HOUR, docOtbor._Fld5324)) * 60 - DATEPART(MINUTE, docOtbor._Fld5324) - DATEPART(SECOND, docOtbor._Fld5324) / 60.0) +
((DATEDIFF(DAY, docOtbor._Fld5324, docOtbor._Fld5325) - 1) * 12 * 60) +
((DATEPART(HOUR, docOtbor._Fld5325) - 8) * 60 + DATEPART(MINUTE, docOtbor._Fld5325) + DATEPART(SECOND, docOtbor._Fld5325) / 60.0)
ELSE
DATEDIFF(SECOND, docOtbor._Fld5324, docOtbor._Fld5325) / 60.0
END * 3 / SUM(otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1)) over (partition by docOtbor._IDRRef)
* otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1)) +
((COUNT(*) over (partition by docOtbor._IDRRef) / 3000 + otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) / 50000 +
(upackovka.ves * otborTabRazmeshenie._Fld5346 / ISNULL(upackovka.chislitel, 1) / 15000)) / 3 * 20000)) / 1000 AS [Приемка]
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM
[MAG_2019].[dbo].[_Document453_VT5341X1] AS otborTabRazmeshenie
INNER JOIN [MAG_2019].[dbo].[_Document453X1] AS docOtbor
ON docOtbor._IDRRef = otborTabRazmeshenie._Document453_IDRRef
and docOtbor._Fld5316_RTRef = 0x000001E6 -- Фильтрация по псо
and docOtbor._Fld5325 >= @dtStart
and docOtbor._Fld5324 >= @dtStart
and docOtbor._Posted = 0x01
INNER JOIN [MAG_2019].[dbo].[_Document486] as docPSO
on docPSO._Fld7346_RTRef = 0x00000198 -- фильтрация по заказу поставщика
and docOtbor._Fld5316_RRRef = docPSO._IDRRef
LEFT JOIN [MAG_2019].[dbo].[_Document408X1] as zakasPostavshiku
on docPSO._Fld7346_RRRef = zakasPostavshiku._IDRRef
LEFT JOIN (
SELECT
upackovka._OwnerID_RRRef AS vladelec, -- Владелец
CASE WHEN upackovka._Fld24768 = 0 THEN
1
ELSE
ISNULL(upackovka._Fld24768, 1)
END AS chislitel, -- Числитель
upackovka._Fld24769 AS znamenatel, -- Знаменатель
CAST(CASE
WHEN 1 = 1 -- ВесИспользовать
AND upackovka._Fld24769 <> 0 -- Знаменатель
THEN upackovka._Fld24768 / upackovka._Fld24769
ELSE 0
END AS DECIMAL(15, 3)) AS ves
FROM
[MAG_2019].[dbo].[_Reference347X1] AS upackovka
WHERE
upackovka._Marked = 0 -- ПометкаУдаления
) AS upackovka
ON upackovka.vladelec = otborTabRazmeshenie._Fld5347RRef -- Сопоставление Номенклатуры и Владелец
WHERE
1=1
and ISNULL(otborTabRazmeshenie._Fld5346, 0) > 0
and docOtbor._Date_Time >= @dtSqlStart
) as tabPriemka
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Продажи)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2], [Заказ закрыт]
)
SELECT --top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка] / [Курс usd2] as [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство USD2+2]
, [Заказ закрыт]
FROM (
-- ///////////////// ПРОДАЖИ ////////////////
SELECT --TOP (1)
DATEADD(year, -2000, [_Period]) as [Период]
, 'Реализация' as [Статья]
, 'Расход' as [Вид операции]
, Null as [Хоз операция]
, case [_RecorderTRef]
WHEN 0x000001F4 then 'РТУ'
ELSE 'Неизвестный тип'
END [тип документа]
, docRTU.[_Number] as [Номер документа]
, orders.[_Number] as [Номер заказа]
, val._Description as [Валюта документа]
, CASE
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб'
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал'
ELSE 'Неопределено'
END as [Ценовая группа]
, [_RecorderRRef] as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = AnalitikaUchetaPartner.[_Fld20514RRef] ) as [Организация]
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = AnalitikaUchetaPartner.[_Fld20513RRef]) as [Партнер]
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), AnalitikaUchetaPartner.[_Fld20513RRef], 2),5,12) ))as PartnerId
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = AnalitikaUchetaPartner.[_Fld20515_RRRef]) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = orders._Fld3138RRef) as [Менеджер]
, analitikaUchetaNomenklaturi.[_Fld20498RRef] as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2),21,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2),17,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2),1,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef] , 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= r.[_Period]
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= r.[_Period]
ORDER BY _Period desc ) as [Курс usd2]
, [_Fld15567] as [Количество]
, [_Fld15568] / 1000 as [Сумма]
, Null as [СуммаБезНДС]
, [_Fld15595] / 1000 as [СуммаРучнойСкидки]
, [_Fld15596] / 1000 as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка]
, Null as [Производство]
, Null as [ЗатратыМП]
, Null as [НДС]
, Null as [ЗатратыСкладХранение]
, Null as [ЗатратыСкладЗарплата]
, Null as [Приемка]
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
, DATEADD(year, -2000, SostZakazaClienta.DateClose) as [Заказ закрыт]
FROM [MAG_2019].[dbo].[_AccumRg15547] as r
LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld15548RRef]
LEFT JOIN [MAG_2019].[dbo].[_Reference162] as AnalitikaUchetaPartner
on AnalitikaUchetaPartner.[_IDRRef] = [_Fld15550RRef]
LEFT JOIN [MAG_2019].[dbo].[_Document500X1] as docRTU
on docRTU.[_IDRRef] = [_RecorderRRef]
LEFT JOIN (SELECT
[_Document500_IDRRef] as _IDRRef
,MIN([_Fld7990_RRRef]) as orderRTU
FROM [MAG_2019].[dbo].[_Document500_VT7967X1]
GROUP BY
[_Document500_IDRRef]) as ordersRTU
ON ordersRTU._IDRRef = [_RecorderRRef]
LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as orders
ON orders.[_IDRRef] = ordersRTU.orderRTU
LEFT JOIN (SELECT --TOP (1000)
MIN([_Period]) as DateClose
,[_Fld28369_RRRef] as zakazrref
FROM [MAG_2019].[dbo].[_InfoRg28368]
where [_Fld28370_RRRef] = 0x9AE0BC17F922537141FF55A099D7C9C4
GROUP BY
[_Fld28369_RRRef]) as SostZakazaClienta
ON SostZakazaClienta.zakazrref = orders.[_IDRRef]
LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura
ON refNomenclatura.[_IDRRef] = analitikaUchetaNomenklaturi.[_Fld20498RRef]
LEFT JOIN MAG_2019.dbo._reference50 val
ON val._IDRRef = [_Fld15601RRef]
where r.[_Period] >= @dtSqlStart
) as tabProdaji
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Производство)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
)
SELECT -- top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка] / [Курс usd2] as [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство] / [Курс usd2] as [Производство USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\ СБОРКА РАСХОД БЕЗ ЗАТРАТ НА СБОРКУ\\\\\\\\\\\\\\\\
SELECT --TOP (1000)
DATEADD(year, -2000, znS.[_Date_Time]) as [Период]
, 'Производство товара' as [Статья]
, 'Расход' as [Вид операции]
, Null as [Хоз операция]
, 'Заказ на сборку' as [тип документа]
, Null as [Номер документа]
, Null as [Номер заказа]
, 'Руб' as [Валюта документа]
, 'Руб' as [Ценовая группа]
, TabGoods.[_Document407_IDRRef] as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = ZnS.[_Fld3348RRef] ) as [Организация]
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = Kontr.[_Fld20612RRef]) as [Партнер]
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),5,12) ))as PartnerId
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = ZnS.[_Fld27876RRef]) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = ZnS.[_Fld28230RRef]) as [Менеджер]
, [_Fld3381RRef] as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld3381RRef], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= znS.[_Date_Time]
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= znS.[_Date_Time]
ORDER BY _Period desc ) as [Курс usd2]
, [_Fld3385] as [Количество]
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
--, (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist]
-- WHERE [Вид цены] = 'Учетная цена (руб)'
-- AND [Дата] <= znS.[_Date_Time]
-- and [_Fld3381RRef] = [1c_id]
-- ORDER BY Дата desc ) / 1000 * [_Fld3385] * -1
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка]
, Null as [Производство]
, Null as [ЗатратыМП]
, Null as [НДС]
, Null as [ЗатратыСкладХранение]
, Null as [ЗатратыСкладЗарплата]
, Null as [Приемка]
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM [MAG_2019].[dbo].[_Document407_VT3379X1] as TabGoods
INNER JOIN [MAG_2019].[dbo].[_Document407X1] as ZnS -- Заказ на сборку
on ZnS._IDRRef = [_Document407_IDRRef]
and _Posted = 0x01 -- проведен
-- and [_Number] = 'АНУТ-010680' -- номер дока для проверки
and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
ON Kontr.[_IDRRef] = ZnS.[_Fld27876RRef]
where znS.[_Date_Time] >= @dtSqlStart
and TabGoods.[_Fld3392] = 0x00 -- отменено ложь
UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА ПРИХОД + ЗАТРАТЫ НА СБОРКУ \\\\\\\\\\\\\\\\
SELECT -- top 1000
DATEADD(year, -2000, znS.[_Date_Time]) as [Период]
, 'Производство товара' as [Статья]
, 'Приход' as [Вид операции]
, Null as [Хоз операция]
, 'Заказ на сборку' as [тип документа]
, Null as [Номер документа]
, ZnS._Number as [Номер заказа]
, 'Руб' as [Валюта документа]
, 'Руб' as [Ценовая группа]
, [табКомплекты].[_Document407_IDRRef] as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = ZnS.[_Fld3348RRef] ) as [Организация]
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = Kontr.[_Fld20612RRef]) as [Партнер]
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), Kontr.[_Fld20612RRef], 2),5,12) ))as PartnerId
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = ZnS.[_Fld27876RRef]) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = ZnS.[_Fld28230RRef]) as [Менеджер]
, [табКомплекты].[_Fld28059RRef] as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [табКомплекты].[_Fld28059RRef], 2),5,12))) as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= znS.[_Date_Time]
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND _Period <= znS.[_Date_Time]
ORDER BY _Period desc ) as [Курс usd2]
, [табКомплекты].[_Fld28063] as [Количество]
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, [табКомплектующие].Закупка as Закупка -- Новый не костыль
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка]
, TabZatratiSborka.sborka / 1000 as [Производство]
, Null as [ЗатратыМП]
, Null as [НДС]
, Null as [ЗатратыСкладХранение]
, Null as [ЗатратыСкладЗарплата]
, Null as [Приемка]
, Null as [АтсМаркировка]
, Null as [ВремяВыполненияМинут]
, Null as [СборкаЗаказа]
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM [MAG_2019].[dbo]._Document407_VT28057X1 as [табКомплекты] -- список товаров к поступлению ...
INNER JOIN [MAG_2019].[dbo].[_Document407X1] as ZnS -- Заказ на сборку
on ZnS._IDRRef = [табКомплекты].[_Document407_IDRRef]
and _Posted = 0x01 -- проведен
and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
LEFT JOIN (SELECT --top 500
SUM(tabItog.[Закупка]) as [Закупка]
, tabItog.[КодСтрокиКомплекта]
, [ZnSRref] as [ZnSRref]
FROM (
SELECT
(SELECT TOP 1 [Учетная цена] FROM [mag_pbi].[pbiProd].[СебестоимостьПроизводствоОт2022]
WHERE [Период] <= znS.[_Date_Time]
and [1c_id] = [табКомплектующие]._Fld3381RRef
ORDER BY [Период] desc ) * [_Fld3385] as [Закупка]
,[табКомплектующие].[_Fld28055] as [КодСтрокиКомплекта]
, ZnS._IDRRef as [ZnSRref]
FROM [MAG_2019].[dbo].[_Document407_VT3379X1] as [табКомплектующие] -- в конфе это тч Товары, здесь лежит список товаров на ВХОД и Вариант комплектации ...
--ON [табКомплектующие]._Document407_IDRRef = [табКомплекты].[_Document407_IDRRef]
--and [табКомплектующие]
INNER JOIN [MAG_2019].[dbo].[_Document407X1] as ZnS -- Заказ на сборку
on ZnS._IDRRef = [табКомплектующие].[_Document407_IDRRef]
and _Posted = 0x01 -- проведен
and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
) as tabItog
GROUP BY
tabItog.[КодСтрокиКомплекта]
, [ZnSRref]
) as [табКомплектующие] -- в конфе это тч Товары, здесь лежит список товаров на ВХОД и Вариант комплектации ...
ON [табКомплектующие].КодСтрокиКомплекта = [табКомплекты].[_Fld28070]
and [табКомплектующие].ZnSRref = [табКомплекты].[_Document407_IDRRef]
LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
ON Kontr.[_IDRRef] = ZnS.[_Fld27876RRef]
LEFT JOIN (SELECT --TOP (1000)
[_RecorderRRef] -- регистратор
, [_Fld33653RRef] -- Номенклатура
, SUM([_Fld33658]) / 1000 as sborka -- сборка
FROM [MAG_2019].[dbo].[_AccumRg33652] -- рн работы
where [_RecorderTRef] = 0x00000197
group by
[_RecorderRRef]
, [_Fld33653RRef] -- Номенклатура
) as TabZatratiSborka
ON TabZatratiSborka.[_RecorderRRef] = [табКомплекты].[_Document407_IDRRef]
and TabZatratiSborka.[_Fld33653RRef] = [табКомплекты].[_Fld28059RRef]
where 1=1
and [табКомплекты].[_Fld28152] = 0x00 -- отменено ложь
and znS.[_Date_Time] >= @dtSqlStart
--and tabSet.[_Fld28059RRef] = 0x9987B49691D57EFD11EEE1296BB584D6
--and ZnS._Number = 'АНУТ-007990'
--and znS.[_Date_Time] >= @dtSqlStart
) as tabProizvodstvo
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Заполнить себестоимостьОт2022(Сборка)]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @dtStart dateTime2;
DECLARE @dtEnd datetime2;
DECLARE @dtSqlStart dateTime2;
DECLARE @dtSqlEnd datetime2;
SET @dtStart = '2022-01-01'
SET @dtEnd= '2030-01-01'
SET @dtSqlStart = '4022-01-01'
SET @dtSqlEnd= '4030-01-01'
INSERT INTO mag_pbi.[pbiProd].[СебестоимостьОт2022]
([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id], [artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Производство], [ЗатратыМП], [НДС], [ЗатратыСкладХранение], [ЗатратыСкладЗарплата], [Приемка],
[АтсМаркировка], [ВремяВыполненияМинут], [СборкаЗаказа], [Доставка USD2+2], [НДС USD2+2], [Таможня USD2+2], [Производство USD2+2]
)
SELECT -- top (1000)
[Период]
, [Статья]
, [Вид операции]
, [Хоз операция]
, [тип документа]
, [Номер документа]
, [Номер заказа]
, [Валюта документа]
, [Ценовая группа]
, [1c_document_id]
, [Организация]
, [Партнер]
, [PartnerId]
, [Контрагент]
, [Менеджер]
, [1c_id]
, [artic_id]
, [Курс usd]
, [Курс usd2]
, [Количество]
, [Сумма]
, [СуммаБезНДС]
, [СуммаРучнойСкидки]
, [СуммаАвтоСкидки]
, [Закупка]
, [Закупка, usd2]
, [Таможня]
, [ЕАЭС]
, [Доставка]
, [Производство]
, [ЗатратыМП]
, [НДС]
, [ЗатратыСкладХранение]
, [ЗатратыСкладЗарплата]
, [Приемка]
, [АтсМаркировка]
, [ВремяВыполненияМинут]
, [СборкаЗаказа]
, [Доставка USD2+2] as [Доставка USD2+2]
, [НДС USD2+2]
, [Таможня USD2+2]
, [Производство] / [Курс usd2] as [Производство USD2+2]
FROM (
-- \\\\\\\\\\\\\\\\\\\\ СБОРКА ЗАКАЗА КЛИЕНТА \\\\\\\\\\\\\\\
SELECT --TOP (100000)
DATEADD(year, -2000, docOtbor._Date_Time) as [Период]
, 'Сборка заказа' as [Статья]
, 'Приход' as [Вид операции]
, Null as [Хоз операция]
, 'Отбор (отбор) товара' as [тип документа]
, docOtbor._Number as [Номер документа]
, docZakazKlienta._Number as [Номер заказа]
, 'Руб' as [Валюта документа] -- Валюта документа
, 'Руб' as [Ценовая группа]
, docOtbor._IDRRef as [1c_document_id]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = docZakazKlienta._Fld3129RRef ) as [Организация]
, (SELECT TOP(1)_description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = docZakazKlienta._Fld3127RRef) as [Партнер]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), docZakazKlienta._Fld3127RRef, 2),5,12) )) as [PartnerId]
, (SELECT TOP(1) _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = docZakazKlienta._Fld3128RRef) as [Контрагент]
, (SELECT TOP(1) _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = docZakazKlienta._Fld3138RRef) as [Менеджер]
, [_Fld5332RRef] as [1c_id] -- Номенклатура
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), [_Fld5332RRef], 2),5,12))) as [artic_id]
--, '' as [artic_id]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
--WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= docOtbor._Date_Time
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
--WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND _Period <= docOtbor._Date_Time
ORDER BY _Period desc ) as [Курс usd2]
, CAST([_Fld5330] as decimal(10,3)) as [Количество] -- Количество
, Null as [Сумма]
, Null as [СуммаБезНДС]
, Null as [СуммаРучнойСкидки]
, Null as [СуммаАвтоСкидки]
, Null as [Закупка]
, Null as [Закупка, usd2]
, Null as [Таможня]
, Null as [ЕАЭС]
, Null as [Доставка] -- доставка
, Null as [Производство] -- Сборка
, Null as [ЗатратыМП] -- Затраты мп
, Null as [НДС]
, Null as [ЗатратыСкладХранение] -- Затраты склад хранение
, Null as [ЗатратыСкладЗарплата] -- Затраты склад зарплата
, Null as [Приемка]
, Null as [АтсМаркировка]
, CASE
WHEN DAY(docOtbor.[_Fld5324]) <> DAY(docOtbor.[_Fld5325]) THEN
(((20 - DATEPART(HOUR, docOtbor.[_Fld5324])) * 60 - DATEPART(MINUTE, docOtbor.[_Fld5324]) - DATEPART(SECOND, docOtbor.[_Fld5324]) / 60.0) +
((DATEDIFF(DAY, docOtbor.[_Fld5324], docOtbor.[_Fld5325]) - 1) * 12 * 60) +
((DATEPART(HOUR, docOtbor.[_Fld5325]) - 8) * 60 + DATEPART(MINUTE, docOtbor.[_Fld5325]) + DATEPART(SECOND, docOtbor.[_Fld5325]) / 60.0)) / SUM([_Fld5330]) over (partition by [_Document453_IDRRef]) * [_Fld5330]
ELSE
(DATEDIFF(SECOND, docOtbor.[_Fld5324], docOtbor.[_Fld5325]) / 60.0) / SUM([_Fld5330]) over (partition by [_Document453_IDRRef]) * [_Fld5330]
END as [ВремяВыполненияМинут]
, ((SUM(1) over (partition by [_Document453_IDRRef]) / 5000 + [_Fld5330] / 20000)/2*30000) / 1000 as СборкаЗаказа
, Null as [Доставка USD2+2]
, Null as [НДС USD2+2]
, Null as [Таможня USD2+2]
, Null as [Производство USD2+2]
FROM [MAG_2019].[dbo].[_Document453_VT5326X1] as OtborTabOtbor
INNER JOIN [MAG_2019].[dbo].[_Document453X1] as docOtbor
ON docOtbor.[_IDRRef] = [_Document453_IDRRef]
and docOtbor._Posted = 0x01
and docOtbor._Fld5325 >= @dtStart
and docOtbor._Fld5324 >= @dtStart
and docOtbor.[_Fld5316_RTRef] = 0x000001F0 -- RSO
INNER JOIN [MAG_2019].[dbo].[_Document496X1] as docRSO
on docOtbor._Fld5316_RRRef = docRSO._IDRRef
and docRSO.[_Fld27744_RTRef] = 0x00000194 -- zakaz klienta
LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as docZakazKlienta
on docRSO.[_Fld27744_RRRef] = docZakazKlienta._IDRRef
WHERE 1=1
and docOtbor._Date_Time >= @dtSqlStart
) as tabSborka
END
GO
/****** Object: StoredProcedure [pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Пакетное: Подготовка таблицы СебестоимостьОт2022]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DELETE FROM mag_pbi.pbiProd.[СебестоимостьОт2022] WHERE 1=1
DBCC CHECKIDENT ('[pbiProd].[СебестоимостьОт2022]', RESEED, 0);
END
GO
/****** Object: StoredProcedure [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Приход] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням]
([1c_id], [УровеньПроизводства])
SELECT
tabNomLVL.[1c_id] as [1c_id]
, ISNULL(tabZNS.[УровеньПроизводства], 1) as [УровеньПроизводства]
FROM (
SELECT
_OwnerIDRRef as [1c_id]
FROM
[MAG_2019].[dbo].[_Reference54]
LEFT JOIN [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLvl
on NomLvl.[1c_id] = _OwnerIDRRef
WHERE
NomLvl.[УровеньПроизводства] IS NULL) as tabNomLVL
LEFT JOIN (
SELECT
TabGoods.[_Fld3381RRef] as [1c_id]
, 2 as [УровеньПроизводства]
FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
--INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
-- on ZnS._IDRRef = [_Document407_IDRRef]
-- and _Posted = 0x01 -- проведен
-- and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
where [_Fld3392] = 0x00 -- отменено ложь
GROUP BY
TabGoods.[_Fld3381RRef]
) as tabZNS
ON 1=1
and tabZNS.[1c_id] = tabNomLVL.[1c_id]
END
GO
/****** Object: StoredProcedure [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Расход] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Расход]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням]
([1c_id], [УровеньПроизводства])
SELECT DISTINCT
[_Fld3381RRef] as [1c_id]
, 0 as [УровеньПроизводства]
FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
WHERE [_Fld3381RRef] NOT IN ( SELECT NomLVL.[1c_id] FROM [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLVL)
END
GO
/****** Object: StoredProcedure [pbiProd].[Подготовка Производство: единая процедура для подготовки] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: единая процедура для подготовки]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DELETE FROM [pbiProd].[СебестоимостьПроизводствоОт2022]
WHERE 1=1
DELETE FROM [pbiProd].[НоменклатураВПроизводствеПоУровням]
WHERE 1=1
exec [pbiProd].[Подготовка Производство: Заполнить уровень 0]
exec [pbiProd].[Подготовка Производство: Заполнить уровень 1]
exec [pbiProd].[Подготовка Производство: Заполнить уровень 2]
exec [pbiProd].[Подготовка Производство: Заполнить уровень 3]
exec [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Расход]
exec [pbiProd].[Подготовка Производство: Дозаполнить уровни по ЗНС Приход];
WITH CTE AS (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY УровеньПроизводства
ORDER BY ID -- или другая логика сортировки внутри группы
) AS RowNumNew
FROM
[pbiProd].[НоменклатураВПроизводствеПоУровням]
)
UPDATE CTE
SET RowNum = RowNumNew
END
GO
/****** Object: StoredProcedure [pbiProd].[Подготовка Производство: Заполнить уровень 0] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Заполнить уровень 0]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням]
([1c_id], [УровеньПроизводства])
SELECT DISTINCT--TOP (1000)
[_Fld18241RRef] as [1c_id]
, 0 as [УровеньПроизводства]
FROM [MAG_2019].[dbo].[_Reference54_VT18239]
where [_Fld18241RRef] NOT IN (SELECT
[_OwnerIDRRef]
FROM [MAG_2019].[dbo].[_Reference54])
END
GO
/****** Object: StoredProcedure [pbiProd].[Подготовка Производство: Заполнить уровень 1] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Заполнить уровень 1]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням]
([1c_id], [УровеньПроизводства])
SELECT
tabItog.nomVlad as [1c_id]
, 1 as [УровеньПроизводства]
FROM (
SELECT DISTINCT
refKomplekt._OwnerIDRRef as nomVlad
, MAX(ISNULL(NomLvl.[УровеньПроизводства], 99)) as [УровеньПроизводства]
FROM [MAG_2019].[dbo].[_Reference54_VT18239]
LEFT JOIN [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLvl
on NomLvl.[1c_id] = _Fld18241RRef and NomLvl.УровеньПроизводства = 0
LEFT JOIN [MAG_2019].[dbo].[_Reference54] as refKomplekt
on refKomplekt._IDRRef = [_Reference54_IDRRef]
GROUP BY
refKomplekt._OwnerIDRRef
HAVING
MAX(ISNULL(NomLvl.[УровеньПроизводства], 99)) = 0) as tabItog
END
GO
/****** Object: StoredProcedure [pbiProd].[Подготовка Производство: Заполнить уровень 2] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Заполнить уровень 2]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням]
([1c_id], [УровеньПроизводства])
SELECT
tabItog.nomVlad
, 2 as [УровеньПроизводства]
FROM (
SELECT
refKomplekt._OwnerIDRRef as nomVlad
, MAX(ISNULL(NomLvl.[УровеньПроизводства], 99)) as [УровеньПроизводства]
FROM [MAG_2019].[dbo].[_Reference54_VT18239]
LEFT JOIN [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLvl
on NomLvl.[1c_id] = _Fld18241RRef
LEFT JOIN [MAG_2019].[dbo].[_Reference54] as refKomplekt
on refKomplekt._IDRRef = [_Reference54_IDRRef]
GROUP BY
refKomplekt._OwnerIDRRef
HAVING
MAX(ISNULL(NomLvl.[УровеньПроизводства], 99)) = 1
) as tabItog
END
GO
/****** Object: StoredProcedure [pbiProd].[Подготовка Производство: Заполнить уровень 3] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка Производство: Заполнить уровень 3]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO mag_pbi.[pbiProd].[НоменклатураВПроизводствеПоУровням]
([1c_id], [УровеньПроизводства])
SELECT
tabItog.nomVlad
, 3 as [УровеньПроизводства]
FROM (
SELECT
refKomplekt._OwnerIDRRef as nomVlad
, MAX(ISNULL(NomLvl.[УровеньПроизводства], 99)) as [УровеньПроизводства]
FROM [MAG_2019].[dbo].[_Reference54_VT18239]
LEFT JOIN [mag_pbi].[pbiProd].[НоменклатураВПроизводствеПоУровням] as NomLvl
on NomLvl.[1c_id] = _Fld18241RRef
LEFT JOIN [MAG_2019].[dbo].[_Reference54] as refKomplekt
on refKomplekt._IDRRef = [_Reference54_IDRRef]
GROUP BY
refKomplekt._OwnerIDRRef
HAVING
MAX(ISNULL(NomLvl.[УровеньПроизводства], 99)) = 2
) as tabItog
END
GO
/****** Object: StoredProcedure [pbiProd].[Подготовка: Заполнить группы номенклатуры для расчета] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Подготовка: Заполнить группы номенклатуры для расчета]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN
DELETE FROM mag_pbi.pbiProd.GroupsOfNomenclature
INSERT INTO mag_pbi.pbiProd.GroupsOfNomenclature (artic_id)
SELECT --TOP (1000)
[artic_id]
FROM [mag_pbi].[pbi].[nomenclature]
DECLARE @articid nchar(36)
DECLARE @2k int
DECLARE @4k int
DECLARE @6k int
DECLARE @8k int
DECLARE @10k int
DECLARE @15k int
DECLARE @20k int
DECLARE @Counter2k int
DECLARE @Counter4k int
DECLARE @Counter6k int
DECLARE @Counter8k int
DECLARE @Counter10k int
DECLARE @Counter15k int
DECLARE @Counter20k int
DECLARE @counter int
SET @2k = 1
SET @4k = 1
SET @6k = 1
SET @8k = 1
SET @10k = 1
SET @15k = 1
SET @20k = 1
SET @counter = 1
SET @Counter2k = 1
SET @Counter4k = 1
SET @Counter6k = 1
SET @Counter8k = 1
SET @Counter10k = 1
SET @Counter15k = 1
SET @Counter20k = 1
DECLARE itterate CURSOR FOR
SELECT
[artic_id]
FROM mag_pbi.[pbiProd].[GroupsOfNomenclature] as s
order by
[artic_id]
OPEN itterate
FETCH NEXT FROM itterate INTO @articid
WHILE @@FETCH_STATUS = 0
BEGIN
if @Counter2k <= 2000 begin
SET @Counter2k = @Counter2k + 1
end
else begin
SET @Counter2k = 0
SET @2k = @2k + 1
end
if @Counter4k <= 4000 begin
SET @Counter4k = @Counter4k + 1
end
else begin
SET @Counter4k = 0
SET @4k = @4k + 1
end
if @Counter6k <= 6000 begin
SET @Counter6k = @Counter6k + 1
end
else begin
SET @Counter6k = 0
SET @6k = @6k + 1
end
if @Counter8k <= 8000 begin
SET @Counter8k = @Counter8k + 1
end
else begin
SET @Counter8k = 0
SET @8k = @8k + 1
end
if @Counter10k <= 10000 begin
SET @Counter10k = @Counter10k + 1
end
else begin
SET @Counter10k = 0
SET @10k = @10k + 1
end
if @Counter15k <= 15000 begin
SET @Counter15k = @Counter15k + 1
end
else begin
SET @Counter15k = 0
SET @15k = @15k + 1
end
if @Counter20k <= 20000 begin
SET @Counter20k = @Counter20k + 1
end
else begin
SET @Counter20k = 0
SET @20k = @20k + 1
end
UPDATE mag_pbi.[pbiProd].[GroupsOfNomenclature]
SET [2k] = @2k
,[4k] = @4k
,[6k] = @6k
,[8k] = @8k
,[10k] = @10k
,[15k] = @15k
,[20k] = @20k
WHERE [artic_id]= @articid
FETCH NEXT FROM itterate INTO @articid
END
CLOSE itterate
DEALLOCATE itterate
END
END
GO
/****** Object: StoredProcedure [pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [pbiProd].[Производство: Заполнить 1сid для СебестоимостьПроизводствоОт2022]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
UPDATE [pbiProd].[СебестоимостьПроизводствоОт2022]
SET [pbiProd].[СебестоимостьПроизводствоОт2022].[1c_id] = nom.[1c_id]
FROM [pbiProd].[СебестоимостьПроизводствоОт2022] ss
LEFT JOIN [mag_pbi].[pbi].[nomenclature] as nom ON ss.artic_id = nom.artic_id
WHERE ss.[1c_id] IS NULL;
END
GO
/****** Object: StoredProcedure [sebest].[ComputeStorehouseVolume] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[ComputeStorehouseVolume]
-- Add the parameters for the stored procedure here
AS
BEGIN
DELETE FROM [pbi].[nomenclatureVolumeStorehouse] WHERE 1=1
;
WITH calendar AS (
SELECT
[_Fld13119] AS date -- date
FROM [MAG_2019].[dbo].[_InfoRg13116]
WHERE [_Fld13117RRef] = 0x80CD002590EC174111E58150B83C760D -- calendar
AND [_Fld13118] > 2018 -- year
),
GoodsInStorehousesTurnover AS (
SELECT
GoodsInStorehousesTurnover.period AS period,
GoodsInStorehousesTurnover.nomenclature AS nomenclature,
GoodsInStorehousesTurnover.storehouse as storehouse,
SUM(GoodsInStorehousesTurnover.Turnover) OVER (PARTITION BY storehouse, nomenclature ORDER BY period) AS balance
FROM (
SELECT
period,
nomenclature,
storehouse,
SUM(Turnover) as Turnover
FROM (SELECT --Top (1000)
[_Period] AS period,
[_Fld17485RRef] AS nomenclature,
[_Fld17488RRef] AS storehouse,
CASE
WHEN [_RecordKind] = 0 THEN [_Fld17491]
ELSE -[_Fld17491]
END AS Turnover
FROM [MAG_2019].[dbo].[_AccumRg17484]
WHERE
1=1
--and [_Fld17485RRef] = 0x80C5305A3A00E12B11E585239E47A898 -- nom
AND [_Fld17488RRef] = 0x80D70CC47A052DFD11E6C841742D2F2C -- storehouse дед-2
) as tabTurnover
GROUP BY
period,
nomenclature,
storehouse) AS GoodsInStorehousesTurnover
)
INSERT INTO [pbi].[nomenclatureVolumeStorehouse] ([Период], [balance], [1c_id], [storehouse], [volume], [totalVolume])
SELECT --top (10000)
calendar_date as [Период],
GoodsInStorehousesTurnover.balance as balance,
GoodsInStorehousesTurnover.nomenclature as [1c_id],
GoodsInStorehousesTurnover.storehouse as storehouse,
GoodsInStorehousesTurnover.balance * tabVolume.volume as volume,
SUM(GoodsInStorehousesTurnover.balance * tabVolume.volume) OVER (PARTITION BY GoodsInStorehousesTurnover.storehouse, calendar_date) as totalVolume
FROM (
SELECT
calendar.date AS calendar_date,
MAX(GoodsInStorehousesTurnover.period) AS turnover_period,
GoodsInStorehousesTurnover.nomenclature AS nomenclature,
GoodsInStorehousesTurnover.storehouse as storehouse
FROM calendar
LEFT JOIN GoodsInStorehousesTurnover
ON calendar.date >= GoodsInStorehousesTurnover.period
GROUP BY
calendar.date,
GoodsInStorehousesTurnover.nomenclature,
GoodsInStorehousesTurnover.storehouse
) AS tabBalancePeriodMax
LEFT JOIN GoodsInStorehousesTurnover
ON GoodsInStorehousesTurnover.nomenclature = tabBalancePeriodMax.nomenclature
AND GoodsInStorehousesTurnover.period = tabBalancePeriodMax.turnover_period
LEFT JOIN (SELECT --top (1000)
_OwnerID_RRRef as [1c_id]
,case when _Fld24768 = 0 then
0
else
_Fld24771 / _Fld24768
end as volume
FROM [MAG_2019].dbo._Reference347X1 u
INNER JOIN [mag_2019].dbo._Reference188X1 nn ON nn._IDRRef = u._OwnerID_RRRef
INNER JOIN [mag_pbi].[pbi].[nomenclature] nom on nom.[1c_id] = u._OwnerID_RRRef and nom.[Статус] <> 'Не для продажи'
where
u.[_Marked] = 0x00) as tabVolume
on tabVolume.[1c_id] = tabBalancePeriodMax.nomenclature
where
YEAR(calendar_date) >= 4024
and GoodsInStorehousesTurnover.balance <> 0
and DATEADD(YEAR, -2000, calendar_date) <= GETDATE()
ORDER BY
calendar_date;
END
GO
/****** Object: StoredProcedure [sebest].[Заполнить итоги до 2022] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить итоги до 2022]
-- Add the parameters for the stored procedure here
AS
BEGIN
DELETE FROM [pbi].[СебестоимостьИтогиДо2022]
WHERE 1=1
INSERT INTO mag_pbi.pbi.[СебестоимостьИтогиДо2022] (
[artic_id], [Количество], [Закупка], [Таможня], [ЕАЭС], [Доставка], [НДС], [Сборка], [Учетная цена])
SELECT --TOP (5000)
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
[artic_id]
,[Количество]
,[Закупка]
,[Таможня]
,[ЕАЭС]
,[Доставка]
,[НДС]
,[Сборка]
,case when [Количество] = 0 then
0
else
([Закупка] + [Таможня] + [ЕАЭС] + [Доставка] + [НДС] + [Сборка]) / [Количество]
end as [Учетная цена]
FROM (SELECT
[artic_id]
,SUM([Количество]) as [Количество]
,SUM([Закупка]) as [Закупка]
,SUM([Таможня]) as [Таможня]
,SUM([ЕАЭС]) as [ЕАЭС]
,SUM([Доставка]) as [Доставка]
,SUM([НДС]) as [НДС]
,SUM([Сборка]) as [Сборка]
FROM
(SELECT
[artic_id]
,CASE WHEN [Вид операции] = 'Продажа' THEN
-SUM([Количество])
else
SUM([Количество])
end as [Количество]
,SUM([Закупка]) as [Закупка]
,SUM([Таможня]) as [Таможня]
,SUM([ЕАЭС]) as [ЕАЭС]
,SUM([Доставка]) as [Доставка]
,SUM([НДС]) as [НДС]
,SUM([Сборка]) as [Сборка]
FROM [mag_pbi].[pbi].[СебестоимостьДо2022]
-- where [artic_id] = '25c0d4a5-00dc-11e8-80f7-0cc47a052dfd'
group by
[Вид операции]
,[artic_id] ) as tabMain
GROUP BY
[artic_id]) tabItog
--WHERE YEAR([Период]) < 2022
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'
END
GO
/****** Object: StoredProcedure [sebest].[Заполнить себестоимость до 2022] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость до 2022]
-- Add the parameters for the stored procedure here
AS
BEGIN
DELETE FROM [pbi].[СебестоимостьДо2022]
WHERE 1=1
INSERT INTO mag_pbi.pbi.[СебестоимостьДо2022] ([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id],
[artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня], [Доставка] ,[Сборка], [НДС] ,[Учетная стоимость] ,[Учетная стоимость USD2+2] ,[Учетная цена]
,[Учетная цена USD2+2]
--, [CodeUT]
/*[Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС] */)
SELECT --TOP (5000)
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
[Период]
,[Статья]
,[Вид операции]
,[Хоз операция]
,[тип документа]
,[Номер документа]
,[Номер заказа]
,[Валюта документа]
,[Ценовая группа]
,[1c_document_id]
,[Организация]
,[Партнер]
,[PartnerId]
,[Контрагент]
,[Менеджер]
,[1c_id]
,[artic_id]
,[Курс usd]
,[Курс usd2]
,[Количество]
,[Сумма]
,[СуммаБезНДС]
,[СуммаРучнойСкидки]
,[СуммаАвтоСкидки]
,[Закупка]
,[Закупка, usd2]
,[Таможня]
--,[ЕАЭС]
--,[Маркетинг]
,[Доставка]
,[Сборка]
--, [ЗатратыМП]
--,[CodeUT]
, [НДС]
,[Учетная стоимость]
,[Учетная стоимость USD2+2]
,[Учетная цена]
,[Учетная цена USD2+2]
FROM (
SELECT -- TOP (1000)
[id]
,[Период]
,[Статья]
,[Вид операции]
,[Хоз операция]
,[Организация]
,[Партнер]
,[PartnerId]
,[Контрагент]
,[Менеджер]
,[Тип документа]
,[Номер документа]
,[Валюта документа]
,[Ценовая группа]
,[1c_document_id]
,[1c_id]
,[artic_id]
,[Количество]
,[Сумма]
,[СуммаБезНДС]
,[СуммаРучнойСкидки]
,[СуммаАвтоСкидки]
,[Закупка]
,[Закупка, usd2]
,[Курс usd2]
,[Курс usd]
,[Таможня]
,[Учетная цена]
,[Учетная цена USD2+2]
,[Учетная стоимость]
,[Учетная стоимость USD2+2]
,[Заказ закрыт]
,[Номер заказа]
,[Доставка]
,[НДС]
,[Сборка]
,[PriceListPrice]
FROM [mag_pbi].[pbi].[Себестоимость+СебестоимостьПродаж]
) tabItog
WHERE YEAR([Период]) < 2022
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'
END
GO
/****** Object: StoredProcedure [sebest].[Заполнить себестоимость закупкой] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость закупкой]
@dt datetime2 = '2015-01-01'
AS
BEGIN
/*r._RecorderTRef:
0x000001A1 Заявление о ввозе товаров из ЕАЭС
0x000001E3 ПТУ
0x00000189 Возврат товаров поставщику
0x000001D5 Передача товаров
0x000001B0 Корректировка приобретения
0x0000020D Таможенная декларация на импорт
закупка: (0x000001E3, 0x00000189,0x000001D5, 0x000001B0)
ЕАЭС: 0x000001A1
Таможня: 0x0000020D
*/
/*
0x80CD002590EC174111E581505088A8D5 USD
0x80D40CC47A052DFD11E6B6DD1820D178 Eur
0x80E90CC47A052DFD11E7145927CEFC24 Cny
0xAE9DB496910DCFD611E94F10743DE3FF USD2
0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
*/
DELETE FROM mag_pbi.pbi.[Себестоимость] WHERE [Период]>@dt
DBCC CHECKIDENT ('[pbi].[Себестоимость]', RESEED, 0);
INSERT INTO mag_pbi.pbi.[Себестоимость] ([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id],
[artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня],[ЕАЭС], [Доставка] ,[Сборка], [ЗатратыМП], [НДС]
--, [CodeUT]
/*[Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС] */)
SELECT --TOP (5000)
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
[Период]
,[Статья]
,[Вид операции]
,[Хоз операция]
,[тип документа]
,[Номер документа]
,[Номер заказа]
,[Валюта документа]
,[Ценовая группа]
,[1c_document_id]
,[Организация]
,[Партнер]
,[PartnerId]
,[Контрагент]
,[Менеджер]
,[1c_id]
,[artic_id]
,[Курс usd]
,[Курс usd2]
,[Количество]
,[Сумма]
,[СуммаБезНДС]
,[СуммаРучнойСкидки]
,[СуммаАвтоСкидки]
, CASE WHEN YEAR([Период]) <= 2021 and ([Партнер] = 'КИТАЙ' or [Партнер] = 'Luca-S') and [Валюта документа] <> 'руб.' Then
[Закупка] * 1.42
ELSE
[Закупка]
END as [Закупка]
, CASE WHEN YEAR([Период]) <= 2021 and ([Партнер] = 'КИТАЙ' or [Партнер] = 'Luca-S') and [Валюта документа] <> 'руб.' Then
[Закупка, usd2] * 1.42
ELSE
[Закупка, usd2]
END as [Закупка, usd2]
,[Таможня]
,[ЕАЭС]
--,[Маркетинг]
,[Доставка]
,[Сборка]
, [ЗатратыМП]
--,[CodeUT]
, [НДС]
FROM (
select --top (1)
DATEADD(year, -2000, _Period) as [Период]
, case
WHEN r._RecorderTRef=0x000001A1 or r._RecorderTRef=0x0000020D THEN 'НДС'
--WHEN r._RecorderTRef=0x000001A1 THEN 'ЕАЭС'
--WHEN r._RecorderTRef=0x0000020D THEN 'Таможня'
ELSE 'Закупка'
END
as [Статья]
, 'Закупка' as [Вид операции]
, h.value as [Хоз операция]
, case r._RecorderTRef
WHEN 0x000001A1 then 'Заявление о ввозе товаров из ЕАЭС'
WHEN 0x00000189 then 'Возврат товаров поставщику'
WHEN 0x000001E3 then 'ПТУ'
WHEN 0x000001D5 then 'Передача товаров'
WHEN 0x000001B0 then 'Корректировка '
WHEN 0x0000020D then 'Таможенная декларация на импорт'
ELSE 'Неизвестный тип'
END as [тип документа]
, '-' as [Номер документа]
, '-' as [Номер заказа]
, val._Description as [Валюта документа]
,CASE
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб'
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал'
WHEN r._RecorderTRef = 0x0000020D THEN 'Руб'
ELSE 'Неопределено'
END as [Ценовая группа]
, r._RecorderRRef as [1c_document_id]
, (SELECT _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = r._Fld16346RRef ) as [Организация]
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = r.[_Fld16353RRef]) as [Партнер]
--, r.[_Fld16353RRef] as PartnerId
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), r.[_Fld16353RRef], 2),5,12) ))as PartnerId
, (SELECT _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = r._Fld16354_RRRef) as [Контрагент]
, (SELECT _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = [_Fld16348RRef]) as [Менеджер]
, analitikaUchetaNomenklaturi.[_Fld20498RRef] as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),21,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),17,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),1,4),'-',SUBSTRING(convert(nvarchar(36), analitikaUchetaNomenklaturi.[_Fld20498RRef], 2),5,12))) as [artic_id]
,CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
THEN
case [_Fld16345RRef]
when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN -[_Fld16361]
ELSE [_Fld16361] END
--WHEN r._RecorderTRef = 0x0000020D THEN customDeclaration._Fld8943
WHEN r._RecorderTRef = 0x0000020D THEN 0
--WHEN r._RecorderTRef=0x000001A1 THEN docEAS.[_Fld4052]
WHEN r._RecorderTRef=0x000001A1 THEN 0
ELSE 0 END
as [Количество]
, [_Fld16362] / 1000 as [Сумма]
, [_Fld16363] / 1000 as [СуммаБезНДС]
,0 as [СуммаРучнойСкидки]
,0 as [СуммаАвтоСкидки]
, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка
THEN
case [_Fld16345RRef]
when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN -[_Fld16362] / 1000
ELSE [_Fld16362] / 1000 END
ELSE 0 END
AS [Закупка]
, CASE WHEN r._RecorderTRef IN (0x000001E3, 0x00000189,0x000001D5, 0x000001B0) -- только для вида операция закупка поле "сумма в валюте документа"
THEN
case [_Fld16345RRef]
when 0x970191967A54A8814BA45C6234640F68 /* возврат, берем с минусом */ THEN -[_Fld16373] / 1000
ELSE [_Fld16373] / 1000 END
ELSE 0 END as [Закупка, usd2]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
--WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, r._Period)
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
--WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, r._Period)
ORDER BY _Period desc ) as [Курс usd2]
/*, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000
ELSE 0 END
as [Таможня]
, CASE WHEN r._RecorderTRef=0x000001A1 THEN [_Fld16369] / 1000
ELSE 0 END
as [ЕАЭС] */
, CASE WHEN r._RecorderTRef=0x0000020D THEN [_Fld16369] / 1000 END as [Таможня]
, 0 as [ЕАЭС]
, 0 as [Маркетинг] -- маркетинг
, 0 as [Доставка] -- доставка
, 0 as [Сборка]-- Сборка
, 0 as [ЗатратыМП] -- Затраты МП
,CASE WHEN LEFT(n._Code, 2) = '00' -- только для вида операция закупка
THEN '9' + CONVERT(nvarchar(15), TRIM('-' FROM TRIM ( '00' FROM n._Code)))
ELSE '8' + TRIM ( 'УТ-' FROM n._Code)
END
as [CodeUT]
, CASE WHEN r._RecorderTRef=0x000001A1 THEN ([_Fld16362] - [_Fld16363]) / 1000
WHEN r._RecorderTRef=0x0000020D THEN ([_Fld16362] - [_Fld16363]) / 1000
ELSE 0 END
as [НДС]
--,RIGHT(n._Code, LEN(n._Code) - DATALENGTH(CONVERT(VARCHAR(100),'УТ-'))) as [CodeUT]
from
mag_2019.dbo._AccumRg16344 r-- Регистр накопления Закупки
LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld16349RRef]
left join MAG_2019.dbo._Reference188X1 as N
on analitikaUchetaNomenklaturi.[_Fld20498RRef] = N._IDRRef
LEFT JOIN [mag_reports].[dbo].[enums] h
ON h._IDRref = r._Fld16345RRef
LEFT JOIN MAG_2019.dbo._reference50 val
ON val._IDRRef = r._Fld16372RRef
LEFT JOIN [MAG_2019].[dbo].[_Document525_VT8936] as customDeclaration
ON customDeclaration.[_Document525_IDRRef] = [r]._RecorderRRef
and analitikaUchetaNomenklaturi.[_Fld20498RRef] = customDeclaration._Fld8939RRef
LEFT JOIN [MAG_2019].[dbo].[_Document417_VT4034] as docEAS
ON docEAS.[_Document417_IDRRef] = [r]._RecorderRRef
and [_Fld16349RRef] = docEAS.[_Fld4037RRef]
-- WHERE DATEADD(year, -2000, _Period) > @dt
UNION ALL
SELECT -- top (1000)
DATEADD(year, -2000, date) -- период
,SR -- Статья расходов
, ВидОперации -- Вид операции
, '' -- хоз операция
, typeReg -- Тип документа
, НомерДокумента -- Номер документа
, [Номер заказа] -- Номер заказа клиента для РТУ
, val._Description -- Валюта документа
, CASE
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб'
WHEN refNomenclatura._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал'
ELSE 'Неопределено'
END -- Ценовая группа
, Регистратор -- Ссылка на документ
, refOrganizaciya.[_Description] -- Организация
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = Партнер) -- Партнер
-- , [Партнер] as PartnerId
, LOWER(CONCAT(SUBSTRING ( convert(nvarchar(36), [Партнер], 2), 25,8),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),21,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),17,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),1,4),'-',SUBSTRING ( convert(nvarchar(36), [Партнер], 2),5,12) ))as PartnerId
, (SELECT _Description FROM [mag_2019].[dbo]._Reference168 kt /*контрагенты*/ WHERE kt._IDRRef = Контрагент) -- Контрагент
, (SELECT _description FROM [MAG_2019].[dbo].[_Reference228X1] WHERE _IDRRef = Менеджер) -- Менеджер
, onec_id -- 1с id
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), onec_id, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), onec_id, 2),5,12))) -- arctic id
, kolvo -- количество
, [Сумма] / 1000
, [СуммаБезНДС] / 1000
, [СуммаРучнойСкидки] / 1000
, [СуммаАвтоСкидки] / 1000
, [Закупка] -- закупка
, [Закупка, usd2] -- закупка usd2
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date)
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, date)
ORDER BY _Period desc ) as [Курс usd2]
, 0 -- Таможня
, 0 --ЕАЭС
, marketing / 1000 -- маркетинг
, delivery / 1000 -- доставка
, [Сборка] / 1000 as [Сборка]-- Сборка
, [ЗатратыМП] / 1000 -- Затраты МП
,CASE WHEN LEFT(refNomenclatura._Code, 2) = '00' -- только для вида операция закупка
THEN '9' + CONVERT(nvarchar(15), TRIM('-' FROM TRIM ( '00' FROM refNomenclatura._Code)))
ELSE '8' + TRIM ( 'УТ-' FROM refNomenclatura._Code)
END
as [CodeUT]
, 0 -- НДС
-- ,RIGHT(refNomenclatura._Code, LEN(refNomenclatura._Code) - DATALENGTH(CONVERT(VARCHAR(100),'УТ-'))) as [CodeUT]
FROM (
-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\ ДОСТАВКА \\\\\\\\\\\\\\\\
SELECT --TOP (1)
refPTU.[_Date_Time] as date -- дата
, 'Доставка контейнера ВЭД' as SR
,'Закупка' as ВидОперации
,[_Fld33630RRef] as Регистратор -- регистратор
, '-' as НомерДокумента -- Номер документа
, '-' [Номер заказа]
,'ПТУ' as typeReg -- типРегистратора
,refPTU.[_Fld7121RRef] as Организация -- Организация
,refPTU.[_Fld7060RRef] as Партнер -- партнер
,refPTU.[_Fld7064RRef] as Контрагент -- контрагент
,refPTU.[_Fld7067RRef] as Менеджер -- Менеджер
,[_Fld33631RRef] as onec_id -- Номенклатура
--,refPtuNomen.[_Fld7134] as kolvo -- Количество
, 0 as kolvo -- Количество
--, [_Fld33633] as [Сумма]
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
,refPTU.[_Fld7059RRef] as ВалютаДокумента -- Валюта документа
,[_Fld33632RRef] -- ППУ
,0 as marketing -- маркетинг
,[_Fld33633] as delivery -- доставка
,0 as [Сборка]-- Сборка
, 0 as [ЗатратыМП]-- Затраты мп
-- ,[_Fld33634_RRRef] -- статья расходов
FROM [MAG_2019].[dbo].[_InfoRg33629]
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = [_Fld33630RRef]
LEFT JOIN [MAG_2019].[dbo].[_Document483_VT7128X1] as refPtuNomen
ON refPtuNomen.[_Document483_IDRRef] = refPTU.[_IDRRef]
AND refPtuNomen.[_Fld7130RRef] = [_Fld33631RRef]
where [_Fld33634_RRRef] = 0x997EB49691D57EFD11ECE1AC556F9FF0
UNION ALL
-- \\\\\\\\\\\\ МАРКЕТИНГ \\\\\\\\\\\\\\\
SELECT --TOP (1)
refPTU.[_Date_Time]
, 'Маркетинг'
,'Закупка'
,[_Fld33630RRef] -- регистратор
, '-' -- Номер документа
, '-' -- Номер заказа
,'ПТУ'
,refPTU.[_Fld7121RRef] -- Организация
,refPTU.[_Fld7060RRef] as Партнер -- партнер
,refPTU.[_Fld7064RRef] as Контрагент -- контрагент
,refPTU.[_Fld7067RRef] as Менеджер -- Менеджер
,[_Fld33631RRef] -- Номенклатура
, 0 -- Количество
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
, refPTU.[_Fld7059RRef] -- Валюта документа
,[_Fld33632RRef] -- ППУ
,[_Fld33633] -- маркетинг
, 0 -- доставка
,0 -- Сборка
, 0 -- Затраты мп
--,[_Fld33634_RRRef] -- статья расходов
FROM [MAG_2019].[dbo].[_InfoRg33629]
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = [_Fld33630RRef]
where [_Fld33634_RRRef] = 0x9981B49691D57EFD11EDCE203CED30C4
UNION ALL
-- ///////////////// ПРОДАЖИ ////////////////
SELECT --TOP (1)
[_Period]
,'Реализация'
,'Продажа'
,[_RecorderRRef] -- регистратор
,docRTU.[_Number] -- Номер документа
, orders.[_Number] -- Номер заказа
,case [_RecorderTRef]
WHEN 0x000001F4 then 'РТУ'
ELSE 'Неизвестный тип'
END
, AnalitikaUchetaPartner.[_Fld20514RRef] -- Организация
, AnalitikaUchetaPartner.[_Fld20513RRef] -- партнер
, AnalitikaUchetaPartner.[_Fld20515_RRRef] -- контрагент
, [_Fld15559RRef] as Менеджер -- Менеджер
, analitikaUchetaNomenklaturi.[_Fld20498RRef] -- Номенклатура
, [_Fld15567] -- количество
, [_Fld15568] as [Сумма]
, 0 as [СуммаБезНДС]
, [_Fld15595] as [СуммаРучнойСкидки]
, [_Fld15596] as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
,CASE
WHEN [_Fld15601RRef] IS NULL THEN 'руб.' -- Валюта документа
ELSE [_Fld15601RRef]
END AS [Валюта документа]
, '' -- ППУ
,0 -- маректинг
,0 -- Доставка
,0 -- Сборка
, 0 -- Затраты мп
FROM [MAG_2019].[dbo].[_AccumRg15547]
LEFT JOIN [MAG_2019].[dbo].[_Reference160] as analitikaUchetaNomenklaturi
on analitikaUchetaNomenklaturi.[_IDRRef] = [_Fld15548RRef]
LEFT JOIN [MAG_2019].[dbo].[_Reference162] as AnalitikaUchetaPartner
on AnalitikaUchetaPartner.[_IDRRef] = [_Fld15550RRef]
LEFT JOIN [MAG_2019].[dbo].[_Document500X1] as docRTU
on docRTU.[_IDRRef] = [_RecorderRRef]
LEFT JOIN (SELECT
[_Document500_IDRRef] as _IDRRef
,MIN([_Fld7990_RRRef]) as orderRTU
FROM [MAG_2019].[dbo].[_Document500_VT7967X1]
GROUP BY
[_Document500_IDRRef]) as ordersRTU
ON ordersRTU._IDRRef = [_RecorderRRef]
LEFT JOIN [MAG_2019].[dbo].[_Document404X1] as orders
ON orders.[_IDRRef] = ordersRTU.orderRTU
UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА РАСХОД БЕЗ ЗАТРАТ НА СБОРКУ\\\\\\\\\\\\\\\\
SELECT TOP (1000)
znS.[_Date_Time] as per
, 'Сборка'
, 'Продажа'
, TabGoods.[_Document407_IDRRef] -- регистратор
, '-' -- Номер документа
, '-' -- Номер заказа
,'Заказ на сборку'
, ZnS.[_Fld3348RRef] -- Организация
, Kontr.[_Fld20612RRef] -- партнер
, ZnS.[_Fld27876RRef] -- контрагент
, ZnS.[_Fld28230RRef] -- Менеджер
, [_Fld3381RRef] as nom -- Номенклатура
, [_Fld3385] as kolvo -- Количество
--, tabset.[_Fld28063]
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, (SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist]
WHERE [Вид цены] = 'Учетная цена (руб)'
AND [Дата] <= znS.[_Date_Time]
and [_Fld3381RRef] = [1c_id]
ORDER BY Дата desc ) / 1000 * [_Fld3385] * -1 as [Закупка]
, 0 as [Закупка, usd2]
, currency._IDRRef -- Валюта документа
, '' -- ППУ
, 0 -- маректинг
, 0 -- Доставка
, 0 -- сборка
, 0 -- Затраты мп
FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
on ZnS._IDRRef = [_Document407_IDRRef]
and _Posted = 0x01 -- проведен
--and [_Number] = 'АНУТ-010680' -- номер дока для проверки
and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
ON Kontr.[_IDRRef] = ZnS.[_Fld27876RRef]
LEFT JOIN (SELECT TOP (1) [_IDRRef]
FROM [MAG_2019].[dbo].[_Reference50]
where _code = '643') as currency
on 1 = 1
UNION ALL
-- \\\\\\\\\\\\\\\\ СБОРКА ПРИХОД + ЗАТРАТЫ НА СБОРКУ \\\\\\\\\\\\\\\\
SELECT TOP (333)
znS.[_Date_Time]
, 'Сборка'
, 'Закупка'
, TabGoods.[_Document407_IDRRef] -- регистратор
, '-' -- Номер документа
, '-' -- Номер заказа
,'Заказ на сборку'
, ZnS.[_Fld3348RRef] -- Организация
, Kontr.[_Fld20612RRef] -- партнер
, ZnS.[_Fld27876RRef] -- контрагент
, ZnS.[_Fld28230RRef] -- Менеджер
, tabSet.[_Fld28059RRef] -- Номенклатура
--, [_Fld3385] -- Количество
, tabset.[_Fld28063]
, 0 as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
--, CASE WHEN tabSetPrices.[SumSebes] IS NULL THEN 0
-- ELSE tabSetPrices.[SumSebes] / 1000 * tabset.[_Fld28063]
-- end as [Закупка]
,(SELECT TOP 1 [Цена] FROM [mag_pbi].[pbi].[pricelist]
WHERE [Вид цены] = 'Учетная цена (руб)'
AND [дата] <= znS.[_Date_Time]
and [_Fld3381RRef] = [1c_id]
ORDER BY Дата desc ) / 1000 * [_Fld3385] as [SumSebes]
, 0 as [Закупка, usd2]
, currency._IDRRef -- Валюта документа
, '' -- ППУ
, 0 -- маректинг
, 0 -- Доставка
, TabZatratiSborka.sborka as sborka -- сборка
, 0 -- Затраты мп
FROM [MAG_2019].[dbo].[_Document407_VT3379] as TabGoods
INNER JOIN [MAG_2019].[dbo].[_Document407] as ZnS -- Заказ на сборку
on ZnS._IDRRef = [_Document407_IDRRef]
and _Posted = 0x01 -- проведен
-- and [_Number] = 'АНУТ-010680' -- номер дока для проверки
and [_Fld3352RRef] = 0x97266ED3BEFAB868480833CDF0FCF236 -- статус Закрыт
LEFT JOIN [MAG_2019].[dbo]._Document407_VT28057 as tabSet -- тч комплекты, тут связь было-стало
on tabSet.[_Fld28070] = [_Fld28055]
and tabSet._Document407_IDRRef = TabGoods._Document407_IDRRef
LEFT JOIN [MAG_2019].[dbo].[_Reference168] as Kontr
ON Kontr.[_IDRRef] = ZnS.[_Fld27876RRef]
LEFT JOIN (SELECT TOP (1) [_IDRRef]
FROM [MAG_2019].[dbo].[_Reference50]
where _code = '643') as currency
on 1 = 1
LEFT JOIN (SELECT --TOP (1000)
[_RecorderRRef] -- регистратор
, [_Fld33653RRef] -- Номенклатура
, SUM([_Fld33658]) / 1000 as sborka -- сборка
FROM [MAG_2019].[dbo].[_AccumRg33652] -- рн работы
where [_RecorderTRef] = 0x00000197
group by
[_RecorderRRef]
, [_Fld33653RRef] -- Номенклатура
) as TabZatratiSborka
ON TabZatratiSborka.[_RecorderRRef] = TabGoods.[_Document407_IDRRef]
and TabZatratiSborka.[_Fld33653RRef] = tabSet.[_Fld28059RRef]
where [_Fld3392] = 0x00 -- отменено ложь
UNION ALL
-- \\\\\\\\\\\\\\\\\\\\ ЗАТРАТЫ МП \\\\\\\\\\\\\\\
SELECT -- TOP (1000)
[_Period]
,'Затраты МП'
,'Закупка'
,[_RecorderRRef] -- Регистратор отчет комиссионера
, '-' -- Номер документа
, '-' -- Номер заказа
, 'Отчет комиссионера'
, otchetKommissionera.[_Fld5484RRef] -- Организация
, otchetKommissionera.[_Fld5485RRef] -- партнер
, otchetKommissionera.[_Fld5486RRef] -- контрагент
, otchetKommissionera.[_Fld5492RRef] -- Менеджер
,[_Fld33391RRef] -- номенклатура
--,otchetKommissioneraTabTovari.[_Fld5531] -- Количество
,0 -- Количество
,0 as [Сумма]
--,[_Fld33394] as [Сумма]
, 0 as [СуммаБезНДС]
, 0 as [СуммаРучнойСкидки]
, 0 as [СуммаАвтоСкидки]
, 0 as [Закупка]
, 0 as [Закупка, usd2]
, currency._IDRRef -- Валюта документа
, '' -- ППУ
, 0 -- маректинг
, 0 -- Доставка
, 0 -- сборка
, [_Fld33394] -- Затраты МП
FROM [MAG_2019].[dbo].[_AccumRg33390]
LEFT JOIN [MAG_2019].[dbo].[_Document458_VT5524] as otchetKommissioneraTabTovari
on otchetKommissioneraTabTovari.[_Fld5526RRef] = [_Fld33391RRef]
AND otchetKommissioneraTabTovari.[_Document458_IDRRef] = [_RecorderRRef]
LEFT JOIN [MAG_2019].[dbo].[_Document458] as otchetKommissionera
ON otchetKommissionera.[_IDRRef] = otchetKommissioneraTabTovari.[_Document458_IDRRef]
LEFT JOIN (SELECT TOP (1) [_IDRRef]
FROM [MAG_2019].[dbo].[_Reference50]
where _code = '643') as currency
on 1 = 1
) as tabMain
LEFT JOIN [MAG_2019].[dbo].[_Reference188X1] as refNomenclatura
ON refNomenclatura.[_IDRRef] = tabMain.onec_id
LEFT JOIN [MAG_2019].[dbo].[_Document483X1] as refPTU
ON refPTU.[_IDRRef] = tabMain.Регистратор
LEFT JOIN [MAG_2019].[dbo].[_Document484] as refPPU
ON refPPU.[_IDRRef] = tabMain.Регистратор
LEFT JOIN [MAG_2019].[dbo].[_Reference198X1] as refOrganizaciya
on refOrganizaciya._IDRRef = tabMain.Организация
LEFT JOIN MAG_2019.dbo._reference50 val
ON val._IDRRef = tabMain.ВалютаДокумента
) tabItog
WHERE [Период] > @dt
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'
END
GO
/****** Object: StoredProcedure [sebest].[Заполнить себестоимость комплектами] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость комплектами]
-- Add the parameters for the stored procedure here
@dt datetime2 = '2015-01-01'
AS
BEGIN
insert into pbi.[Себестоимость]([Период], [Статья], [Вид операции],[Номер документа],[Тип документа], [1c_id], [artic_id], [Количество], [Ценовая группа])
select
k.[Период]
, 'Закупка' as [Статья]
, 'Фасовка_Комплекты' as [Вид операции]
, [Номер документа]
, 'Заказ на сборку' as [Тип документа]
, [1c_id]
, [artic_id]
, [Количество]
, [Ценовая группа]
FROM pbi.[сборки_комплекты] k
WHERE
[Период] > @dt
END
GO
/****** Object: StoredProcedure [sebest].[Заполнить себестоимость комплектующими] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [sebest].[Заполнить себестоимость комплектующими]
-- Add the parameters for the stored procedure here
@dt datetime2 = '2015-01-01'
AS
BEGIN
insert into pbi.[Себестоимость]([Период], [Статья], [Вид операции],[Номер документа],[Тип документа], [1c_id], [artic_id], [Количество], [Ценовая группа])
select
k.[Период]
, 'Закупка' as [Статья]
, 'Фасовка_Комплектующие' as [Вид операции]
, [Номер документа]
, 'Заказ на сборку' as [Тип документа]
, [1c_id]
, [artic_id]
, [Количество]
, [Ценовая группа]
FROM pbi.[сборки_комплектующие] k
WHERE
[Период] > @dt
END
GO
/****** Object: StoredProcedure [sebest].[Заполнить себестоимость курсовой разницей] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость курсовой разницей]
-- Add the parameters for the stored procedure here
AS
BEGIN
insert into pbi.[Себестоимость] ([Период], [Статья], [Вид операции], [1c_id], [artic_id], [Количество], [Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС])
SELECT --TOP (1000)
[Период]
, 'Курсовая разница' as [Статья]
,[Вид операции]
,[1c_id]
,[artic_id]
, 0 as [Количество]
, isnull([Валютная сумма] *
(SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= [Период]
ORDER BY _Period desc) - [Сумма], 0)
as [Сумма]
, 0 as [Сумма Без НДС]
, 0 as [Валютная сумма]
, 0 as [Валютная сумма Без НДС]
FROM
mag_pbi.pbi.[Себестоимость]
where
[Вид операции] = 'Продажа'
and [Статья] = 'Закупка'
and [Валютная сумма] <> 0
and isnull([Валютная сумма] *
(SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= [Период]
ORDER BY _Period desc) - [Сумма], 0) <> 0
END
GO
/****** Object: StoredProcedure [sebest].[Заполнить себестоимость начальным остатком] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость начальным остатком]
-- Add the parameters for the stored procedure here
@dt datetime2 = '2015-01-01'
AS
BEGIN
/*
0x80CD002590EC174111E581505088A8D5 USD
0x80D40CC47A052DFD11E6B6DD1820D178 Eur
0x80E90CC47A052DFD11E7145927CEFC24 Cny
0xAE9DB496910DCFD611E94F10743DE3FF USD2
0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
*/
insert into pbi.[Себестоимость]([Период], [Статья], [Вид операции],[Хоз операция],[Организация],[Тип документа],[Номер документа],[Валюта документа],[Ценовая группа],[1c_document_id], [1c_id], [artic_id], [Количество], [Закупка], [Закупка, usd2], [Курс usd], [Курс usd2]/*, [Курс usd2], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС] */)
SELECT
tabItog.[Период],
tabItog.[Статья],
tabItog.[Вид операции],
tabItog.[Хоз операция],
tabItog.[Организация],
tabItog.[Тип документа],
tabItog.[Номер документа],
tabItog.[Валюта документа],
tabItog.[Ценовая группа],
tabItog.[1c_document_id],
tabItog.[1c_id],
tabItog.[artic_id],
tabItog.[Количество],
tabItog.[Закупка],
tabItog.[Закупка] / tabItog.[Курс usd2] as [Закупка, usd2],
tabItog.[Курс usd],
tabItog.[Курс usd2]
FROM (select
DATEADD(year, -2000, _Date_Time) as [Период]
, 'Ввод начальных остатков' as [Статья]
, 'Закупка' as [Вид операции]
, 'Ввод остатков' as [Хоз операция]
, (SELECT _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = d._Fld1778RRef ) as [Организация]
, 'Ввод остатков' as [Тип документа]
, D._Number as [Номер документа]
, 'руб.' as [Валюта документа]
, 'Руб' as [Ценовая группа]
, D._IDRRef as [1c_document_id]
, _Fld1811RRef as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), _Fld1811RRef, 2),5,12))) as [artic_id]
, _Fld1816 as [Количество]
, _Fld1816 * isnull((SELECT TOP (1) [Цена] / 1000
FROM [mag_reports].[sales].[pricelist] pl
where [1c_id] = _Fld1811RRef
and [Вид цены] = 'Учетная цена (руб)'
--and pl._Period <= _Date_Time
ORDER BY _Period), 0) as [Закупка]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0x80CD002590EC174111E581505088A8D5 --USD
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, _Date_Time)
ORDER BY _Period desc ) as [Курс usd]
, (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, _Period) <= DATEADD(year, -2000, _Date_Time)
ORDER BY _Period desc ) as [Курс usd2]
from
mag_2019.dbo._Document385 as D-- Документ Ввод остатков
inner join mag_2019.dbo._Document385_VT1809 as Tov-- Документ Ввод остатков.Товары
on D._IDRRef = Tov._Document385_IDRRef
inner join MAG_2019.dbo._Reference188X1 as N
on Tov._Fld1811RRef = N._IDRRef
where
D._Posted = 0x01
and d._Fld1777RRef = 0x8EADCC7BFE3B43C24D37E47DE504409F -- Тип операции = Собственные товары
AND DATEADD(year, -2000, d._Date_Time) > '2012') as tabItog
END
GO
/****** Object: StoredProcedure [sebest].[Заполнить себестоимость продажей] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить себестоимость продажей]
-- Add the parameters for the stored procedure here
@dt datetime2 = '2015-01-01'
AS
BEGIN
/* Вставить все продажи в таблицу себестоимости */
/* UPDATE для каждой строки в отдельной процедуре */
insert into pbi.[Себестоимость]([Период], [Статья], [Вид операции],[Организация],[Партнер],[Менеджер],[Номер документа],[Тип документа], [1c_id], [artic_id]
, [Количество],[Сумма],[СуммаБезНДС],[СуммаРучнойСкидки],[СуммаАвтоСкидки],[Номер заказа],[Заказ закрыт], [Ценовая группа]
)
select --top 100
DATEADD(year, -2000, r._Period) as [Период]
, 'Закупка' as [Статья]
, 'Продажа' as [Вид операции]
, (SELECT _description FROM [MAG_2019].[dbo].[_Reference198X1] org WHERE org._IDRRef = anp._Fld20514RRef ) as [Организация]
, (SELECT _description FROM [mag_2019].[dbo]._Reference215X1 prt /*партнеры*/ WHERE prt._IDRRef = anp._Fld20513RRef) as [Партнер]
, (SELECT _description FROM [mag_2019].[dbo].[_Reference228X1] WHERE _IDRRef = z._Fld3138RRef) as [Менеджер]
, CASE _RecorderTRef
WHEN 0x000001F4 THEN (SELECT _Number FROM MAG_2019.dbo._Document500X1 d WHERE d._IDRRef = r._RecorderRRef)
WHEN 0x00000188 THEN (SELECT _Number FROM MAG_2019.dbo._Document392 d WHERE d._IDRRef = r._RecorderRRef)
WHEN 0x000001B1 THEN (SELECT _Number FROM MAG_2019.dbo._Document433 d WHERE d._IDRRef = r._RecorderRRef)
WHEN 0x000001CA THEN (SELECT _Number FROM MAG_2019.dbo._Document458 d WHERE d._IDRRef = r._RecorderRRef)
WHEN 0x000001E4 THEN (SELECT _Number FROM MAG_2019.dbo._Document484 d WHERE d._IDRRef = r._RecorderRRef)
WHEN 0x000001D5 THEN (SELECT _Number FROM MAG_2019.dbo._Document469 d WHERE d._IDRRef = r._RecorderRRef)
WHEN 0x00000178 THEN (SELECT _Number FROM MAG_2019.dbo._Document376 d WHERE d._IDRRef = r._RecorderRRef)
END as [Номер документа]
, CASE _RecorderTRef
WHEN 0x000001F4 THEN 'Реализация'
WHEN 0x00000188 THEN 'Возврат'
WHEN 0x000001B1 THEN 'Корректировка реализации'
WHEN 0x000001CA THEN 'Отчет комиссионера'
WHEN 0x000001E4 THEN 'Приобретение Услуг и прочих активов'
WHEN 0x000001D5 THEN 'Передача Товаров между организаций'
WHEN 0x00000178 THEN 'Акт выполненных работ'
END as [Тип документа]
, n._IDRRef as [1c_id]
, LOWER(CONCAT(SUBSTRING(convert(nvarchar(36), n._IDRRef, 2), 25,8),'-',SUBSTRING(convert(nvarchar(36), n._IDRRef, 2),21,4),'-',SUBSTRING(convert(nvarchar(36), n._IDRRef, 2),17,4),'-',SUBSTRING(convert(nvarchar(36), n._IDRRef, 2),1,4),'-',SUBSTRING(convert(nvarchar(36), n._IDRRef, 2),5,12))) as [artic_id]
, -1 * r._Fld15567 as [Количество]
, r._Fld15568 / 1000 as 'sum'
, r._Fld15569 / 1000 as 'СуммаБезНДС'
, r._Fld15595 / 1000 as 'СуммаРучнойСкидки'
, r._Fld15596 / 1000 as 'СуммаАвтоСкидки'
, z._Number as [Номер заказа]
, (SELECT top 1 convert(datetime, DATEADD(year, -2000, l._Period), 104) from [pbi].[ЛогЗаказов] l where l.status = 'Закрыт' and l.zakazNum = z._IDRRef) as [Заказ закрыт]
, CASE
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Руб'
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Вал'
ELSE 'Неопределено'
END as [Ценовая группа]
from
mag_2019.dbo._AccumRg15547 r-- Регистр накопления Выручка и себестоимость продаж
/*LEFT JOIN [MAG_2019].[dbo]._InfoRg12119 an-- Регистр сведений Аналитика учета номенклатуры
on r._Fld15548RRef = an._Fld12126RRef
*/
INNER JOIN [mag_2019].[dbo]._Reference160 an /*ключ аналитики номенклатуры*/ ON r._Fld15548RRef = an._IDRRef
INNER JOIN [mag_2019].[dbo]._Reference188X1 n /*номенклатура*/ ON n._IDRRef = an._Fld20498RRef
LEFT JOIN [MAG_2019].[dbo].[_Document404X1] z /* заказ клиента */ ON z._IDRRef = r._Fld15549_RRRef
--LEFT JOIN [mag_2019].[dbo]._Document500X1 rlz /*документ реализации*/ ON r._RecorderRRef = rlz._IDRRef
INNER JOIN [mag_2019].[dbo]._Reference162 anp /*Ключ аналитики партнера*/ ON r._Fld15550RRef = anp._IDRRef
where 1=1
AND DATEADD(year, -2000, r._Period)> @dt
END
GO
/****** Object: StoredProcedure [sebest].[Заполнить СебестоимостьСебестоимостьПродажиРезультат] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Заполнить СебестоимостьСебестоимостьПродажиРезультат]
AS
BEGIN
/*r._RecorderTRef:
0x000001A1 Заявление о ввозе товаров из ЕАЭС
0x000001E3 ПТУ
0x00000189 Возврат товаров поставщику
0x000001D5 Передача товаров
0x000001B0 Корректировка приобретения
0x0000020D Таможенная декларация на импорт
закупка: (0x000001E3, 0x00000189,0x000001D5, 0x000001B0)
ЕАЭС: 0x000001A1
Таможня: 0x0000020D
*/
/*
0x80CD002590EC174111E581505088A8D5 USD
0x80D40CC47A052DFD11E6B6DD1820D178 Eur
0x80E90CC47A052DFD11E7145927CEFC24 Cny
0xAE9DB496910DCFD611E94F10743DE3FF USD2
0xAE9EB496910DCFD611E95C66B5DE3AFA USD2+2
*/
DELETE FROM mag_pbi.pbi.[СебестоимостьСебестоимостьПродажиРезультат] WHERE 1=1
INSERT INTO mag_pbi.pbi.[СебестоимостьСебестоимостьПродажиРезультат] ([Период], [Статья], [Вид операции],
[Хоз операция],[Тип документа],[Номер документа], [Номер заказа], [Валюта документа],[Ценовая группа], [1c_document_id],
[Организация],[Партнер], [PartnerId], [Контрагент],[Менеджер],
[1c_id],
[artic_id], [Курс usd] ,[Курс usd2], [Количество], [Сумма], [СуммаБезНДС], [СуммаРучнойСкидки], [СуммаАвтоСкидки],
[Закупка],[Закупка, usd2], [Таможня], [Доставка] ,[Сборка], [НДС], [code], [Учетная цена] ,[Учетная цена USD2+2]
,[Учетная стоимость] ,[Учетная стоимость USD2+2]
--, [CodeUT]
/*[Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС] */)
SELECT --TOP (5000)
-- это финальная выборка, её не корректировать(можно только комменить поля которые не нужны к выводу), менять всё во вложенных запросах ...
[Период]
,[Статья]
,[Вид операции]
,[Хоз операция]
,[тип документа]
,[Номер документа]
,[Номер заказа]
,[Валюта документа]
,[Ценовая группа]
,[1c_document_id]
,[Организация]
,[Партнер]
,[PartnerId]
,[Контрагент]
,[Менеджер]
,[1c_id]
,[artic_id]
,[Курс usd]
,[Курс usd2]
,[Количество]
,[Сумма]
,[СуммаБезНДС]
,[СуммаРучнойСкидки]
,[СуммаАвтоСкидки]
,[Закупка]
,[Закупка, usd2]
,[Таможня]
,[Доставка]
,[Сборка]
,[НДС]
,[code]
,[Учетная цена]
,[Учетная цена USD2+2]
,[Учетная стоимость]
,[Учетная стоимость USD2+2]
FROM (
SELECT -- TOP (1000)
[Период]
,[Статья]
,[Вид операции]
,[Хоз операция]
,[Тип документа]
,[Номер документа]
,[Номер заказа]
,[Валюта документа]
,[Ценовая группа]
,[1c_document_id]
,[Организация]
,[Партнер]
,[PartnerId]
,[Контрагент]
,[Менеджер]
,tabMain.[1c_id]
,tabMain.[artic_id]
,[Курс usd]
,[Курс usd2]
,[Количество]
,[Сумма]
,[СуммаБезНДС]
,[СуммаРучнойСкидки]
,[СуммаАвтоСкидки]
,[Закупка]
,[Закупка, usd2]
,[Таможня]
,[Доставка]
,[Сборка]
,[НДС]
, tabNom.[code]
,[Учетная цена]
,[Учетная цена USD2+2]
,[Учетная стоимость]
,[Учетная стоимость USD2+2]
FROM [mag_pbi].[pbi].[Себестоимость+СебестоимостьПродажОт2022] as tabMain
LEFT JOIN [mag_pbi].[pbi].[nomenclature] as tabNom
on tabNom.[artic_id] = tabMain.[artic_id]
) tabItog
WHERE 1=1
--and [artic_id] = 'cdb37c08-84c6-11e5-80c5-305a3a00e12b'
END
GO
/****** Object: StoredProcedure [sebest].[Проставить стоимость комплектов] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [sebest].[Проставить стоимость комплектов]
@dt datetime2(0) = '2015'
AS
BEGIN
UPDATE [pbi].[Себестоимость] SET
[Закупка] = (
SELECT -1*SUM(Закупка)
FROM [pbi].[Себестоимость] ss
INNER JOIN [pbi].[Сборки] sb
ON sb.[Дата документа] = ss.Период AND sb.[Номер документа] = ss.[Номер документа]
WHERE
sb.[ИД номенклатура комплекта] = k.[1c_id]
--0x80C5305A3A00E12B11E584C1000D5AA5
),
[Закупка, usd2] = (
SELECT -1*SUM([Закупка, usd2])
FROM [pbi].[Себестоимость] ss
INNER JOIN [pbi].[Сборки] sb
ON sb.[Дата документа] = ss.Период AND sb.[Номер документа] = ss.[Номер документа]
WHERE
sb.[ИД номенклатура комплекта] = k.[1c_id]
--0x80C5305A3A00E12B11E584C1000D5AA5
),
[Таможня] = (
SELECT -1*SUM([Таможня])
FROM [pbi].[Себестоимость] ss
INNER JOIN [pbi].[Сборки] sb
ON sb.[Дата документа] = ss.Период AND sb.[Номер документа] = ss.[Номер документа]
WHERE
sb.[ИД номенклатура комплекта] = k.[1c_id]
--0x80C5305A3A00E12B11E584C1000D5AA5
),
[ЕАЭС] = (
SELECT -1*SUM([ЕАЭС])
FROM [pbi].[Себестоимость] ss
INNER JOIN [pbi].[Сборки] sb
ON sb.[Дата документа] = ss.Период AND sb.[Номер документа] = ss.[Номер документа]
WHERE
sb.[ИД номенклатура комплекта] = k.[1c_id]
--0x80C5305A3A00E12B11E584C1000D5AA5
)
FROM [pbi].[Себестоимость] k
WHERE k. [Статья]='Закупка' AND k.[Вид операции] = 'Фасовка_Комплекты'
AND [Период] > @dt
END
GO
/****** Object: StoredProcedure [sebest].[Расчет себестомисти] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [sebest].[Расчет себестомисти]
@date datetime2(0) = '2018',
@complekty bit = 0
as
BEGIN
DECLARE @uid binary(16)
DECLARE @q numeric(15,3)
DECLARE @dt datetime2(0)
DECLARE @id INT
DECLARE @vid varchar(255)
DECLARE @cenovaya_gruppa varchar(12)
DECLARE @zakupka numeric(38,15)
DECLARE @zakupka_usd2 numeric(38,15)
DECLARE @kurs_usd2 numeric(15, 3)
DECLARE @kurs_usd numeric(15, 3)
DECLARE @kolich numeric(15,3)
DECLARE @eaes numeric(38,15)
DECLARE @tamoznia numeric(38,15)
DECLARE db_cursor CURSOR FOR
SELECT
id
, s.[1c_id]
, [количество]
, [Период]
, [Вид операции]
, CASE
WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E584520AEC30EC THEN 'Валютная'
--WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN 'Рублевая'
ELSE 'Рублевая'
END as cenovaya_gruppa
, s.[Курс usd2]
, s.[Курс usd]
FROM mag_pbi.pbi.[Себестоимость] s
INNER JOIN MAG_2019.dbo._Reference188X1 n--mag_reports.sales.w_nomenclature n
ON n._IDRRef=s.[1c_id]
WHERE 1=1
and [Статья]='Закупка'
AND ([Вид операции] IN ('Продажа'/*, 'Фасовка_Комплектующие', 'Фасовка_Комплекты'*/))
AND [Период] > @date
/*AND ( @complekty=0 AND n._IDRRef not in (SELECT [1c_id] FROM [pbi].[Сборки_комплекты])
OR
@complekty=1 AND n._IDRRef in (SELECT [1c_id] FROM [pbi].[Сборки_комплекты])
)
*/
--and n.[1c_id]=0x80F1305A3A00E12B11E63D0035692388
--and n.[1c_id]=0xAEC4B496910DCFD611EC421521579D74
--AND n.code = 'УТ-00039503'
ORDER BY [Период] ASC
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @id, @uid, @q, @dt, @vid, @cenovaya_gruppa, @kurs_usd2, @kurs_usd
WHILE @@FETCH_STATUS = 0
BEGIN
--IF @vid = 'Продажа' OR @vid = 'Фасовка_Комплектующие' BEGIN
/* расчет статьи себестоимости Закупка, вид операции Продажа */
SET @kolich = ISNULL((SELECT sum([Количество]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND ([Вид операции] IN ('Закупка', 'Продажа'/*, 'Фасовка_Комплектующие', 'Фасовка_Комплекты'*/) ) AND [Период] < @dt ),0)
IF @cenovaya_gruppa = 'Рублевая' BEGIN
SET @zakupka = ISNULL((SELECT sum([Закупка]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND ([Вид операции] IN ('Закупка', 'Продажа'/*, 'Фасовка_Комплектующие', 'Фасовка_Комплекты'*/) ) AND [Период] < @dt ),0)
SET @zakupka = ( -- сумма всего / кол всего * кол
CASE WHEN @kolich <= 0 THEN 0
ELSE
CASE WHEN -@zakupka > @zakupka/@kolich * @q THEN -@zakupka
ELSE @zakupka/@kolich * @q END
END
)
SET @zakupka_usd2 = @zakupka / @kurs_usd2
END
ELSE BEGIN
SET @zakupka_usd2 = ISNULL((SELECT sum([Закупка, usd2]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND ([Вид операции] IN ('Закупка', 'Продажа'/*, 'Фасовка_Комплектующие', 'Фасовка_Комплекты'*/)) AND [Период] < @dt ),0)
--select @zakupka_usd2
SET @zakupka_usd2 = ( -- сумма всего / кол всего * кол
CASE WHEN @kolich <= 0 THEN 0
ELSE
CASE WHEN -@zakupka_usd2 > @zakupka_usd2/@kolich * @q THEN -@zakupka_usd2
ELSE @zakupka_usd2/@kolich * @q END
END
)
--select @zakupka_usd2
SET @zakupka = @zakupka_usd2 * @kurs_usd2
--select @kurs_usd2
END
SET @eaes = ISNULL((SELECT sum([ЕАЭС]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND [Вид операции]='ЕАЭС' AND [Период] < @dt ),0)
SET @tamoznia = ISNULL((SELECT sum([Таможня]) FROM mag_pbi.pbi.[Себестоимость] WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND [Вид операции]='Таможня' AND [Период] < @dt ),0)
UPDATE mag_pbi.pbi.[Себестоимость]
SET [Закупка] = @zakupka
, [Закупка, usd2] = @zakupka_usd2
, [ЕАЭС] = ( -- сумма всего / кол всего * кол
CASE WHEN @kolich <= 0 THEN 0
ELSE
CASE WHEN -@eaes > @eaes/@kolich * @q THEN -@eaes
ELSE @eaes/@kolich * @q END
END
)
, [Таможня] = ( -- сумма всего / кол всего * кол
CASE WHEN @kolich <= 0 THEN 0
ELSE
CASE WHEN -@tamoznia > @tamoznia/@kolich * @q THEN -@tamoznia
ELSE @tamoznia/@kolich * @q END
END
)
WHERE id=@id
--END --@vid = 'Продажа'
FETCH NEXT FROM db_cursor INTO @id, @uid, @q, @dt, @vid, @cenovaya_gruppa, @kurs_usd2, @kurs_usd
END
CLOSE db_cursor
DEALLOCATE db_cursor
END
/*
ELSE if @vid = 'Фасовка_Комплекты'
UPDATE [mag_reports].[sebest].[Себестоимость]
SET [Сумма] = ( -- сумма всех комплектующих
SELECT sum(-[Сумма])
FROM [mag_reports].[sebest].[Себестоимость] WHERE [Комплект] = @uid AND [Статья] = 'Закупка' AND [Период] = dateadd(second, -1, @dt) AND [Сумма]<>0 and [Вид операции] = 'Фасовка_Комплектующие')
, [Валютная сумма] = ( -- сумма всех комплектующих
SELECT sum(-[Валютная сумма])
FROM [mag_reports].[sebest].[Себестоимость] WHERE [Комплект] = @uid AND [Статья] = 'Закупка' AND [Период] = dateadd(second, -1, @dt) AND [Валютная сумма]<>0 and [Вид операции] = 'Фасовка_Комплектующие')
WHERE id=@id
*/
--расчет по учетной цене
/*UPDATE [sebest].[Себестоимость]
SET [Учетная цена]=
/*
--первый вариант учетной цены - по учетной цене руб
(SELECT TOP (1) [Цена] / 1000
FROM [mag_reports].[sales].[pricelist] pl
where pl.[1c_id] = @uid and [Вид цены] = 'Учетная цена (руб)'
AND DATEADD(year, -2000, pl._Period) <= @dt
ORDER BY pl._Period desc)
*/
--второй вариант учетной цены - для вал товара пересчитываем уч цену через курс
(CASE
WHEN (SELECT _Fld21101RRef FROM MAG_2019.dbo._Reference188X1 WHERE _IDRRef = @uid) = 0x80C5305A3A00E12B11E584520AEC30EC THEN --'Валютная'
-- Если валютная ценовая группа, то берем учетную цену (вал)
(SELECT TOP (1) [Цена] / 1000
FROM [mag_reports].[sales].[pricelist] pl
where pl.[1c_id] = @uid and [Вид цены] = 'Учетная цена (вал)'
AND DATEADD(year, -2000, pl._Period) <= @dt
ORDER BY pl._Period desc) * (SELECT TOP 1 _Fld13220 FROM [MAG_2019].[dbo].[_InfoRg13218] rg --РегистрСведений.КурсыВалют
WHERE _Fld13219RRef = 0xAE9EB496910DCFD611E95C66B5DE3AFA --USD2+2
AND DATEADD(year, -2000, rg._Period)<= @dt
ORDER BY rg._Period desc)
ELSE --WHEN n._Fld21101RRef=0x80C5305A3A00E12B11E5845202CA01FB THEN --'Рублевая'
(SELECT TOP (1) [Цена] / 1000
FROM [mag_reports].[sales].[pricelist] pl
where pl.[1c_id] = @uid and [Вид цены] = 'Учетная цена (руб)'
AND DATEADD(year, -2000, pl._Period) <= @dt
ORDER BY pl._Period desc)
END
)
WHERE id=@id*/
/* ЗДЕСЬ ВСТАВЛЯЕМ РАСЧЕТ ДРУГИХ СТАТЕЙ СЕБЕСТОИМОСТИ ПРИ ПРОДАЖЕ */
/*if @vid = 'Фасовка_Комплекты'
insert into [sebest].[Себестоимость] ([Период], [Статья], [Вид операции], [1c_id], [artic_id], [Количество], [Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС])
select
@dt as [Период]
, [Статья]
, @vid as [Вид операции]
, @uid as [1c_id]
, @ar as [artic_id]
, 0 as [Количество]
, sum([Сумма]) as [Сумма]
, 0 as [Сумма Без НДС]
, sum([Валютная сумма]) as [Валютная сумма]
, 0 as [Валютная сумма Без НДС]
FROM [mag_reports].[sebest].[Себестоимость]
WHERE [Комплект] = @uid AND not [Статья] = 'Закупка' AND [Период] = dateadd(second, -1, @dt) and [Вид операции] = 'Фасовка_Комплектующие'
group by
[Статья]
else
insert into [sebest].[Себестоимость] ([Период], [Статья], [Вид операции], [1c_id], [artic_id], [Комплект], [Количество], [Сумма], [Сумма Без НДС], [Валютная сумма], [Валютная сумма Без НДС])
select
@dt as [Период]
, [Статья]
, @vid as [Вид операции]
, @uid as [1c_id]
, @ar as [artic_id]
, @kom as [Комплект]
, 0 as [Количество]
, @q * (sum([Сумма]) / (select sum([Количество])
FROM [mag_reports].[sebest].[Себестоимость]
WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND [Период] < @dt)) as [Сумма]
, 0 as [Сумма Без НДС]
, @q * (sum([Валютная сумма]) / (select sum([Количество])
FROM [mag_reports].[sebest].[Себестоимость]
WHERE [1c_id] = @uid AND [Статья] = 'Закупка' AND [Период] < @dt)) as [Валютная сумма]
, 0 as [Валютная сумма Без НДС]
FROM [mag_reports].[sebest].[Себестоимость]
WHERE [1c_id] = @uid AND not [Статья] = 'Закупка' AND [Период] < @dt
group by
[Статья]
*/
GO
/****** Object: StoredProcedure [sebest].[Создать индексы] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
*/
CREATE PROCEDURE [sebest].[Создать индексы] as
BEGIN
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20220320-182545] ON [pbi].[Себестоимость]
(
[1c_id] ASC,
[Период] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [NonClusteredIndex-1] ON [pbi].[Себестоимость]
([Статья],[Вид операции],[Период])
INCLUDE ([1c_id],[Количество])
CREATE NONCLUSTERED INDEX [NonClusteredIndex-2] ON [pbi].[Себестоимость]
(
[1c_id] ASC,
[Статья] ASC,
[Период] ASC
)
CREATE NONCLUSTERED INDEX [NonClusteredIndex-2-1] ON [pbi].[Себестоимость]
(
[Партнер] ASC,
[Период] ASC
)
CREATE NONCLUSTERED INDEX [NonClusteredIndex-3] ON [pbi].[Себестоимость]
(
[1c_id] ASC,
[Статья] ASC,
[Вид операции] ASC,
[Период] ASC
)
INCLUDE([Закупка],[ЕАЭС],[Таможня],[Количество])WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [NonClusteredIndex-4]
ON [pbi].[Себестоимость] ([Период],[Статья],[Вид операции],[1c_id],[Количество])
CREATE NONCLUSTERED INDEX [NonClusteredIndex-5]
ON [pbi].[Себестоимость] ([Статья],[1c_id],[Период])
CREATE NONCLUSTERED INDEX [NonClusteredIndex-6]
ON [pbi].[Себестоимость] ([Статья],[Вид операции],[1c_id],[Период])
END
GO
/****** Object: StoredProcedure [sebest].[Создать таблицу] Script Date: 2026-03-03 11:15:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Object: Table [sebest].[Себестоимость] Script Date: 10.04.2022 8:42:54 ******/
CREATE procedure [sebest].[Создать таблицу] as
BEGIN
CREATE TABLE [pbi].[Себестоимость](
id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[Период] [datetime2](0) NULL,
[Статья] [varchar](255) NOT NULL,
[Вид операции] [varchar](255) NOT NULL default '',
[Хоз операция] [varchar](255) NOT NULL default '',
[Организация] [varchar](255) NULL default '',
[Партнер] [varchar](255) NULL default '',
[Контрагент] [varchar](255) NULL default '',
[Менеджер] [varchar](255) NULL default '',
[Тип документа] [varchar](255) NULL default '',
[Номер документа] [varchar](255) NULL default '',
[Валюта документа] [varchar](255) NULL default '',
[Ценовая группа] [varchar](255) NULL default '',
[1c_document_id] [binary](16) NULL,
[1c_id] [binary](16) NULL,
[artic_id] [nvarchar](36) NULL,
[Количество] [numeric](15, 3) NULL default 0,
[Сумма] numeric(38,15) NULL default 0,
[СуммаБезНДС] numeric(38,15) NULL default 0,
[СуммаРучнойСкидки] numeric(38,15) NULL default 0,
[СуммаАвтоСкидки] numeric(38,15) NULL default 0,
[Закупка] numeric(38,15) NULL default 0,
[Закупка, usd2] numeric(38,15) NULL default 0,
[Курс usd2] [numeric](15, 3) NULL default 0,
[Курс usd] [numeric](15, 3) NULL default 0,
[Таможня] numeric(38,15) NULL default 0,
[ЕАЭС] numeric(38,15) NULL default 0,
[Учетная цена] numeric(38,15) NULL default 0,
[Учетная цена USD2+2] numeric(38,15) NULL default 0,
[Заказ закрыт] datetime NULL,
[Номер заказа] nchar(11) NULL,
[Маркетинг] numeric(38,15) NULL default 0,
[Доставка] numeric(38,15) NULL default 0,
[НДС] numeric(38,15) NULL default 0,
[Сборка] numeric(38,15) NULL default 0,
[ЗатратыМП] numeric(38,15) NULL default 0,
[PartnerId] [nvarchar](36) NULL,
[Учетная стоимость] numeric(38,15) NULL default 0,
[Учетная стоимость USD2+2] numeric(38,15) NULL default 0
) ON [PRIMARY]
END
GO