USE [mag_pbi] GO /****** Object: StoredProcedure [analytics].[create_forecast_loop] Script Date: 2026-03-03 11:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO 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]) ); /* 4.1) Из ЗаявкиТовары: [Количество текущее], [Дата поступления]; статус <> На согласовании */ INSERT INTO #inb_status(sku_1c_id, [month], [status], units) SELECT s.sku_1c_id, DATEFROMPARTS(YEAR(zt.[Дата поступления]), MONTH(zt.[Дата поступления]), 1), N'Заявка', SUM(COALESCE(zt.[Количество текущее], 0.0)) FROM [analytics].[ЗаявкиТовары] zt JOIN #skus s ON s.code = zt.code WHERE zt.[Статус заявки] <> N'На согласовании' AND zt.[Дата поступления] IS NOT NULL GROUP BY s.sku_1c_id, DATEFROMPARTS(YEAR(zt.[Дата поступления]), MONTH(zt.[Дата поступления]), 1); /* 4.2) Из ЗаказыВЗаявках: [Количество], [Желаемая дата]; статусы В пути, Закрыт, Выгружен на складе, Принят */ INSERT INTO #inb_status(sku_1c_id, [month], [status], units) SELECT s.sku_1c_id, DATEFROMPARTS(YEAR(z.[Желаемая дата]), MONTH(z.[Желаемая дата]), 1), z.[Статус], SUM(COALESCE(z.[Количество], 0.0)) FROM [analytics].[ЗаказыВЗаявках] z JOIN #skus s ON s.code = z.code WHERE z.[Статус] IN (N'В пути', N'Закрыт', N'Выгружен на складе', N'Принят') AND z.[Желаемая дата] IS NOT NULL GROUP BY s.sku_1c_id, DATEFROMPARTS(YEAR(z.[Желаемая дата]), MONTH(z.[Желаемая дата]), 1), z.[Статус]; 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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. Продажи по g–g1 × месяц (2023–2025) ------------------------------------------------------------- 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. Список g–g1 ------------------------------------------------------------- IF OBJECT_ID('tempdb..#GroupList') IS NOT NULL DROP TABLE #GroupList; SELECT DISTINCT [g], [g1] INTO #GroupList FROM #SalesByGroupMonth; ------------------------------------------------------------- -- 3. g–g1 × все 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. Общий объём продаж по g–g1 ------------------------------------------------------------- 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:49:37 ******/ 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. База продаж 2024–2025 по g–g1 × месяц ------------------------------------------------------------ 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. Список всех g–g1, которые продавались ------------------------------------------------------------ IF OBJECT_ID('tempdb..#GroupList') IS NOT NULL DROP TABLE #GroupList; SELECT DISTINCT sbgm.[g], sbgm.[g1] INTO #GroupList FROM #SalesByGroupMonth sbgm; ------------------------------------------------------------ -- 4. g–g1 × все 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. Общий объём продаж по g–g1 за все 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 месяцам для каждого g–g1 = 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- 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:49:37 ******/ 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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 '2024-12-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(Дата) ), -- Календарь месяцев: декабрь 2024 + месяцы 2025 (1–10) Months AS ( SELECT DATEFROMPARTS(2024, 12, 1) AS MonthStart, EOMONTH(DATEFROMPARTS(2024, 12, 1)) AS MonthEnd UNION ALL 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 WHERE DATEADD(DAY, v.number, MonthStart) >= '2025-01-01' ------------------------------------------------------------------------- -- 4. Интерполяция ноября 1–18 ;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' ), Keys AS ( SELECT COALESCE(o.Узел, n.Узел) AS Узел, COALESCE(o.Склад, n.Склад) AS Склад, COALESCE(o.artic_id, n.artic_id) AS artic_id, COALESCE(o.id_внешний, n.id_внешний) AS id_внешний, o.PrevQty, o.PrevAvail, o.PrevPack, n.Qty19, n.Avail19, n.Pack19 FROM OctoberEnd o FULL OUTER JOIN November19 n ON o.Узел = n.Узел AND o.Склад = n.Склад AND o.artic_id = n.artic_id AND o.id_внешний = n.id_внешний ) INSERT INTO pbi.ostatki_mp_2025_interpolated ( Дата, Узел, Склад, artic_id, id_внешний, [Остаток МП, шт], [Доступно МП, упак], [Остаток МП, упак] ) SELECT DATEADD(DAY, d.number, CAST('2025-11-01' AS DATE)) AS Дата, k.Узел, k.Склад, k.artic_id, k.id_внешний, ISNULL(k.PrevPack,0) + ((ISNULL(k.Pack19, 0) - ISNULL(k.PrevPack,0)) * (d.number + 1)) / 19.0, ISNULL(k.PrevAvail,0) + ((ISNULL(k.Avail19, 0) - ISNULL(k.PrevAvail,0)) * (d.number + 1)) / 19.0, ISNULL(k.PrevQty,0) + ((ISNULL(k.Qty19, 0) - ISNULL(k.PrevQty,0)) * (d.number + 1)) / 19.0 FROM Keys k 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- 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:49:37 ******/ 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:49:37 ******/ 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:49:37 ******/ 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