Перерасчет итогов регистра бухгалтерии в 1С

30.05.17

База данных - HighLoad оптимизация

Вариант перерасчета итогов частями (помесячно), если при типовом пересчете 1С зависает.

Скачать файлы

Наименование Файл Версия Размер
Перерасчет итогов регистра бухгалтерии в 1С:
.rar 7,33Kb
40
.rar 7,33Kb 40 Скачать

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

На предприятии, где я работаю имеется база 1С бухгалтерии 1.6, в которой велся учет с 2013 по 2016 годы. По счетам 41.01, 45.01 учет велся в разрезе 2 субконто. Третье субконто (партии) не использовался (себестоимость по среднему). Вдруг руководству потребовалось посмотреть карточку счетов 41.01, 45.01 в разрезе поставщиков, т.е. партий товара. Было принято решение заполнить 3 субконто (партии), используя для этого данные регистра "НДС партий товаров" (его вели, т.к. присутствовали реализации на эскпорт). Немного о специфике этой базы данных и сервера БД. Номенклатура товара более 100 тыс., размер базы 80 Г. Сервер  sql сервер Intel Xeon E5530 2.4 GHz 2 2 процессора (16 ядер) 48 ГБ ОЗУ, СУБД MS SQL 2012. 

Про саму методику заполнения 3 субконто на основании данных регистра "НДС парий товаров" подробно описывать не буду, если кому интересно пишите в комметариях, отвечу. Хочу только отметить, что выключил использование итогов (РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(ЛОЖЬ)) и текущих итогов РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(ЛОЖЬ) для ускорения работы с наборами движений 1С (чтобы кроме самих таблиц записей еще не происходил пересчет итогов). Итоги запланировать расчитать разово в конце обработки.

После того как 3-е субконто было заполнено начал расчитывать итоги. Но первый же месяц зависал на пересчете именно таблицы остаток 3-го субконто на несколько часов, не помогла даже реиндексация таблиц. Возможно большое кол-во строк в таблицах движений (около 10 млн) и  значений субконто (около 40 млн.)., так же сам запрос, приведенный ниже, сконструирован таким образом, т.е. многочисленные join-ны, чтобы привязать в к движениям значения всех 3-х субконто так же затратная операция.

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

  • Таблица движений (_AccRg5550);
  • Итоги без субконто (_AccRgAT05560);
  • Итоги 1 субконто (_AccRgAT15570);
  • Итоги 2 субконто (_AccRgAT25571);
  • Итоги 3 субконто (_AccRgAT35572);
  • Итоги оборотов между счетами (_AccRgCT5573);
  • Значения субконо (_AccRgED5574).

Прочие таблицы:   Виды субконто (_Acc3_ExtDim5522).

Для понимания, приведу фрагмент запроса по расчету 3-го субконто, полученный из Profiler:

SELECT
			T2._AccountDtRRef AS AccountRRef,
			T2._Fld5551RRef AS Fld5551RRef,
			T2._Fld5552DtRRef AS Fld5552RRef,
			T3._EDCount AS EDCount_,
			T5._Value_TYPE AS EDValue1_TYPE,
			T5._Value_RTRef AS EDValue1_RTRef,
			T5._Value_RRRef AS EDValue1_RRRef,
			T7._Value_TYPE AS EDValue2_TYPE,
			T7._Value_RTRef AS EDValue2_RTRef,
			T7._Value_RRRef AS EDValue2_RRRef,
			T9._Value_TYPE AS EDValue3_TYPE,
			T9._Value_RTRef AS EDValue3_RTRef,
			T9._Value_RRRef AS EDValue3_RRRef,
			T2._Fld5553 AS TurnoverDt5561_,
			CAST (0.0 AS NUMERIC (15, 2)) AS TurnoverCt5562_,
			T2._Fld5554Dt AS TurnoverDt5564_,
			CAST (0.0 AS NUMERIC (15, 2)) AS TurnoverCt5565_,
			T2._Fld5555Dt AS TurnoverDt5567_,
			CAST (0.0 AS NUMERIC (15, 3)) AS TurnoverCt5568_
		FROM
			_AccRg5550 T2
			INNER JOIN #tt1 T3 WITH (NOLOCK)
				ON T3._IDRRef = T2._AccountDtRRef
		 		AND T3._EDCount = @P1
			LEFT OUTER JOIN _Acc3_ExtDim5522 T4
				ON T4._Acc3_IDRRef = T2._AccountDtRRef
		 		AND T4._LineNo = @P2
			LEFT OUTER JOIN _AccRgED5574 T5
				ON T5._Period > = @P3
		 		AND T5._Period < @P4
		 		AND T5._Period = T2._Period
		 		AND T5._RecorderTRef = T2._RecorderTRef
		 		AND T5._RecorderRRef = T2._RecorderRRef
		 		AND T5._LineNo = T2._LineNo
		 		AND T5._Correspond = @P5
		 		AND T5._KindRRef = T4._DimKindRRef
			LEFT OUTER JOIN _Acc3_ExtDim5522 T6
				ON T6._Acc3_IDRRef = T2._AccountDtRRef
		 		AND T6._LineNo = @P6
			LEFT OUTER JOIN _AccRgED5574 T7
				ON T7._Period > = @P7
		 		AND T7._Period < @P8
		 		AND T7._Period = T2._Period
		 		AND T7._RecorderTRef = T2._RecorderTRef
		 		AND T7._RecorderRRef = T2._RecorderRRef
		 		AND T7._LineNo = T2._LineNo
		 		AND T7._Correspond = @P9
		 		AND T7._KindRRef = T6._DimKindRRef
			LEFT OUTER JOIN _Acc3_ExtDim5522 T8
				ON T8._Acc3_IDRRef = T2._AccountDtRRef
		 		AND T8._LineNo = @P10
			LEFT OUTER JOIN _AccRgED5574 T9
				ON T9._Period > = @P11
		 		AND T9._Period < @P12
		 		AND T9._Period = T2._Period
		 		AND T9._RecorderTRef = T2._RecorderTRef
		 		AND T9._RecorderRRef = T2._RecorderRRef
		 		AND T9._LineNo = T2._LineNo
		 		AND T9._Correspond = @P13
		 		AND T9._KindRRef = T8._DimKindRRef
		WHERE
			T2._Active = 0x01
			AND (T2._Period > = @P14
			AND T2._Period < @P15)

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

Сперва я скопировал таблицы движений и значений итогов в новые таблицы, очистив после этого оригинальные таблицы:

--движения
select * into _AccRg5550_copy from _AccRg5550 (nolock) 

--знач субконто
select * into _AccRgED5574_copy from _AccRgED5574 (nolock) 

--удаление движений в основной таблице движений
TRUNCATE TABLE _AccRg5550

--удаление движений в основной таблице значений субконто 
TRUNCATE TABLE _AccRgED5574

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

declare @ДатаНач datetime;
set @ДатаНач = '2013-01-01';
declare @ДатаКон datetime;
set @ДатаКон = '2013-01-31 23:59:59';

--удаление записей, оставшихся при расчете предыдущего месяца
TRUNCATE TABLE _AccRg5550
TRUNCATE TABLE _AccRgED5574

--заполнение записей из копий таблиц (только за месяц расчета)

--движения
insert into _AccRg5550 
select * from _AccRg5550_copy (nolock) as t1  
where t1._Period between @ДатаНач and @ДатаКон

--значения субконто
insert into _AccRgED5574 
select * from _AccRgED5574_copy (nolock) as t1  
where t1._Period between @ДатаНач and @ДатаКон

После выполнения очередного для каждого месяца по очистке и заполнения движений, выполнял непосредственный расчет итогов очередного месяца срествами 1С.

После расчета последнего месяца вернул исходные записи в таблицы движений и значений субконто:

--движения
TRUNCATE TABLE _AccRg5550
insert into _AccRg5550 
select * from _AccRg5550_copy (nolock)

--значения субконто
TRUNCATE TABLE _AccRgED5574
insert into _AccRgED5574 
select * from _AccRgED5574_copy (nolock) 

Для упрощения действий для каждого месяца написал обработку для 1С (помесячный очитка и заполнение таблиц в SQL + расчет итогов). Обработку прикладываю. Если кому поможет данная статья буду рад.

P.S. В данной статье привидены скрипты с названиями таблиц для моей базы данных, в вашем случае нужно использовать имена таблиц Вашей базы данных, посмотреть их можно разными способами, например через к функцию 1С ПолучитьСтруктуруХраненияБазыДанных. 

См. также

Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы

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

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    3014    spyke    27    

42

Быстродействие типовой 1С

HighLoad оптимизация Платформа 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    5128    vasilev2015    19    

37

Анализируем SQL сервер глазами 1С-ника

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

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих зааросов на sql, ожиданий, конвертация запроса в 1с и рекомендации где может тормозить

1 стартмани

15.02.2024    7668    159    ZAOSTG    68    

96

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

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    6008    doom2good    48    

63

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    8895    ivanov660    6    

76

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

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

15.11.2023    5119    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16206    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. GROOVY 2505 30.05.17 15:09 Сейчас в теме
Превосходная статья, для тех кто хочет разобраться в механизмах регистров бухгалтерии.
4. anig99 2843 19.12.20 23:20 Сейчас в теме
(1)Добрый вечер! Текущий способ помог и мне, но остается открытым вопрос, почему так происходит?
У меня эта проблема возникла в ноябре. Расчет шел больше суток, потом я его вырубал. Все месяцы до этого считались и считаются быстро (по 1-2 минуты). Я пробовал очищать таблицы итого и пересчитывать, убирать проводки отдельных счетов, искать битые ссылки, проверял на разных базах. Но ничего необычного не находил. Максимум, что выяснил, что если оставить проводки с 1 по 5 число, то расчет идет 10-15 минут. Далее Помог только описанный в статья способ. Итог рассчитался за 15 секунд.
Как найти причину, чтобы не пришлось каждый раз чистить таблицы?

Вот зависающий отчет из profilerа

exec sp_executesql N'INSERT INTO #tt7 WITH(TABLOCK) (_Period, _AccountRRef, _Fld13158RRef, _Fld13159RRef, _EDValue1_TYPE, _EDValue1_RTRef, _EDValue1_RRRef, _EDValue2_TYPE, _EDValue2_RTRef, _EDValue2_RRRef, _Fld13160, _TurnoverDt13171, _TurnoverCt13172, _Turnover13173, _Fld13161, _TurnoverDt13174, _TurnoverCt13175, _Turnover13176, _Fld13162, _TurnoverDt13177, _TurnoverCt13178, _Turnover13179) SELECT
*P1,
T1.AccountRRef,
T1.Fld13158RRef,
T1.Fld13159RRef,
T1.EDValue1_TYPE,
T1.EDValue1_RTRef,
T1.EDValue1_RRRef,
T1.EDValue2_TYPE,
T1.EDValue2_RTRef,
T1.EDValue2_RRRef,
*P2,
CAST(SUM(T1.TurnoverDt13171_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverCt13172_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverDt13171_ - T1.TurnoverCt13172_) AS NUMERIC(22, 2)),
*P3,
CAST(SUM(T1.TurnoverDt13174_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverCt13175_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverDt13174_ - T1.TurnoverCt13175_) AS NUMERIC(22, 2)),
*P4,
CAST(SUM(T1.TurnoverDt13177_) AS NUMERIC(21, 3)),
CAST(SUM(T1.TurnoverCt13178_) AS NUMERIC(21, 3)),
CAST(SUM(T1.TurnoverDt13177_ - T1.TurnoverCt13178_) AS NUMERIC(22, 3))
FROM (SELECT
T2._AccountDtRRef AS AccountRRef,
T2._Fld13158RRef AS Fld13158RRef,
T2._Fld13159DtRRef AS Fld13159RRef,
T3._EDCount AS EDCount_,
T5._Value_TYPE AS EDValue1_TYPE,
T5._Value_RTRef AS EDValue1_RTRef,
T5._Value_RRRef AS EDValue1_RRRef,
T7._Value_TYPE AS EDValue2_TYPE,
T7._Value_RTRef AS EDValue2_RTRef,
T7._Value_RRRef AS EDValue2_RRRef,
T2._Fld13160 AS TurnoverDt13171_,
CAST(*P5 AS NUMERIC(15, 2)) AS TurnoverCt13172_,
T2._Fld13161Dt AS TurnoverDt13174_,
CAST(*P6 AS NUMERIC(15, 2)) AS TurnoverCt13175_,
T2._Fld13162Dt AS TurnoverDt13177_,
CAST(*P7 AS NUMERIC(15, 3)) AS TurnoverCt13178_
FROM dbo._AccRg13157 T2
INNER JOIN #tt4 T3 WITH(NOLOCK)
ON T3._IDRRef = T2._AccountDtRRef AND T3._EDCount = *P8
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T4
ON T4._Acc4_IDRRef = T2._AccountDtRRef AND T4._LineNo = *P9
LEFT OUTER JOIN dbo._AccRgED13184 T5
ON T5._Period >= *P10 AND T5._Period < *P11 AND T5._Period = T2._Period AND T5._RecorderTRef = T2._RecorderTRef AND T5._RecorderRRef = T2._RecorderRRef AND T5._LineNo = T2._LineNo AND T5._Correspond = *P12 AND T5._KindRRef = T4._DimKindRRef
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T6
ON T6._Acc4_IDRRef = T2._AccountDtRRef AND T6._LineNo = *P13
LEFT OUTER JOIN dbo._AccRgED13184 T7
ON T7._Period >= *P14 AND T7._Period < *P15 AND T7._Period = T2._Period AND T7._RecorderTRef = T2._RecorderTRef AND T7._RecorderRRef = T2._RecorderRRef AND T7._LineNo = T2._LineNo AND T7._Correspond = *P16 AND T7._KindRRef = T6._DimKindRRef
WHERE T2._Active = 0x01 AND (T2._Period >= *P17 AND T2._Period < *P18) AND T2._AccountDtRRef <> 0x00000000000000000000000000000000
UNION ALL SELECT
T8._AccountCtRRef AS AccountRRef,
T8._Fld13158RRef AS Fld13158RRef,
T8._Fld13159CtRRef AS Fld13159RRef,
T9._EDCount AS EDCount_,
T11._Value_TYPE AS EDValue1_TYPE,
T11._Value_RTRef AS EDValue1_RTRef,
T11._Value_RRRef AS EDValue1_RRRef,
T13._Value_TYPE AS EDValue2_TYPE,
T13._Value_RTRef AS EDValue2_RTRef,
T13._Value_RRRef AS EDValue2_RRRef,
CAST(*P19 AS NUMERIC(15, 2)) AS TurnoverDt13171_,
T8._Fld13160 AS TurnoverCt13172_,
CAST(*P20 AS NUMERIC(15, 2)) AS TurnoverDt13174_,
T8._Fld13161Ct AS TurnoverCt13175_,
CAST(*P21 AS NUMERIC(15, 3)) AS TurnoverDt13177_,
T8._Fld13162Ct AS TurnoverCt13178_
FROM dbo._AccRg13157 T8
INNER JOIN #tt4 T9 WITH(NOLOCK)
ON T9._IDRRef = T8._AccountCtRRef AND T9._EDCount = *P22
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T10
ON T10._Acc4_IDRRef = T8._AccountCtRRef AND T10._LineNo = *P23
LEFT OUTER JOIN dbo._AccRgED13184 T11
ON T11._Period >= *P24 AND T11._Period < *P25 AND T11._Period = T8._Period AND T11._RecorderTRef = T8._RecorderTRef AND T11._RecorderRRef = T8._RecorderRRef AND T11._LineNo = T8._LineNo AND T11._Correspond = *P26 AND T11._KindRRef = T10._DimKindRRef
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T12
ON T12._Acc4_IDRRef = T8._AccountCtRRef AND T12._LineNo = *P27
LEFT OUTER JOIN dbo._AccRgED13184 T13
ON T13._Period >= *P28 AND T13._Period < *P29 AND T13._Period = T8._Period AND T13._RecorderTRef = T8._RecorderTRef AND T13._RecorderRRef = T8._RecorderRRef AND T13._LineNo = T8._LineNo AND T13._Correspond = *P30 AND T13._KindRRef = T12._DimKindRRef
WHERE T8._Active = 0x01 AND (T8._Period >= *P31 AND T8._Period < *P32) AND T8._AccountCtRRef <> 0x00000000000000000000000000000000) T1
GROUP BY T1.AccountRRef,
T1.Fld13158RRef,
T1.Fld13159RRef,
T1.EDValue1_TYPE,
T1.EDValue1_RTRef,
T1.EDValue1_RRRef,
T1.EDValue2_TYPE,
T1.EDValue2_RTRef,
T1.EDValue2_RRRef',N'*P1 datetime2(3),*P2 numeric(10),*P3 numeric(10),*P4 numeric(10),*P5 numeric(10),*P6 numeric(10),*P7 numeric(10),*P8 numeric(10),*P9 numeric(10),*P10 datetime2(3),*P11 datetime2(3),*P12 numeric(10),*P13 numeric(10),*P14 datetime2(3),*P15 datetime2(3),*P16 numeric(10),*P17 datetime2(3),*P18 datetime2(3),*P19 numeric(10),*P20 numeric(10),*P21 numeric(10),*P22 numeric(10),*P23 numeric(10),*P24 datetime2(3),*P25 datetime2(3),*P26 numeric(10),*P27 numeric(10),*P28 datetime2(3),*P29 datetime2(3),*P30 numeric(10),*P31 datetime2(3),*P32 datetime2(3)','4020-11-01 00:00:00',0,0,0,0,0,0,2,1,'4020-11-01 00:00:00','4020-12-01 00:00:00',0,2,'4020-11-01 00:00:00','4020-12-01 00:00:00',0,'4020-11-01 00:00:00','4020-12-01 00:00:00',0,0,0,2,1,'4020-11-01 00:00:00','4020-12-01 00:00:00',1,2,'4020-11-01 00:00:00','4020-12-01 00:00:00',1,'4020-11-01 00:00:00','4020-12-01 00:00:00'
Показать
2. пользователь 19.12.20 23:11
Сообщение было скрыто модератором.
...
3. anig99 2843 19.12.20 23:20 Сейчас в теме
Добрый вечер! Текущий способ помог и мне, но остается открытым вопрос, почему так происходит?
У меня эта проблема возникла в ноябре. Расчет шел больше суток, потом я его вырубал. Все месяцы до этого считались и считаются быстро (по 1-2 минуты). Я пробовал очищать таблицы итого и пересчитывать, убирать проводки отдельных счетов, искать битые ссылки, проверял на разных базах. Но ничего необычного не находил. Максимум, что выяснил, что если оставить проводки с 1 по 5 число, то расчет идет 10-15 минут. Далее Помог только описанный в статья способ. Итог рассчитался за 15 секунд.
Как найти причину, чтобы не пришлось каждый раз чистить таблицы?

Вот зависающий отчет из profilerа

exec sp_executesql N'INSERT INTO #tt7 WITH(TABLOCK) (_Period, _AccountRRef, _Fld13158RRef, _Fld13159RRef, _EDValue1_TYPE, _EDValue1_RTRef, _EDValue1_RRRef, _EDValue2_TYPE, _EDValue2_RTRef, _EDValue2_RRRef, _Fld13160, _TurnoverDt13171, _TurnoverCt13172, _Turnover13173, _Fld13161, _TurnoverDt13174, _TurnoverCt13175, _Turnover13176, _Fld13162, _TurnoverDt13177, _TurnoverCt13178, _Turnover13179) SELECT
*P1,
T1.AccountRRef,
T1.Fld13158RRef,
T1.Fld13159RRef,
T1.EDValue1_TYPE,
T1.EDValue1_RTRef,
T1.EDValue1_RRRef,
T1.EDValue2_TYPE,
T1.EDValue2_RTRef,
T1.EDValue2_RRRef,
*P2,
CAST(SUM(T1.TurnoverDt13171_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverCt13172_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverDt13171_ - T1.TurnoverCt13172_) AS NUMERIC(22, 2)),
*P3,
CAST(SUM(T1.TurnoverDt13174_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverCt13175_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverDt13174_ - T1.TurnoverCt13175_) AS NUMERIC(22, 2)),
*P4,
CAST(SUM(T1.TurnoverDt13177_) AS NUMERIC(21, 3)),
CAST(SUM(T1.TurnoverCt13178_) AS NUMERIC(21, 3)),
CAST(SUM(T1.TurnoverDt13177_ - T1.TurnoverCt13178_) AS NUMERIC(22, 3))
FROM (SELECT
T2._AccountDtRRef AS AccountRRef,
T2._Fld13158RRef AS Fld13158RRef,
T2._Fld13159DtRRef AS Fld13159RRef,
T3._EDCount AS EDCount_,
T5._Value_TYPE AS EDValue1_TYPE,
T5._Value_RTRef AS EDValue1_RTRef,
T5._Value_RRRef AS EDValue1_RRRef,
T7._Value_TYPE AS EDValue2_TYPE,
T7._Value_RTRef AS EDValue2_RTRef,
T7._Value_RRRef AS EDValue2_RRRef,
T2._Fld13160 AS TurnoverDt13171_,
CAST(*P5 AS NUMERIC(15, 2)) AS TurnoverCt13172_,
T2._Fld13161Dt AS TurnoverDt13174_,
CAST(*P6 AS NUMERIC(15, 2)) AS TurnoverCt13175_,
T2._Fld13162Dt AS TurnoverDt13177_,
CAST(*P7 AS NUMERIC(15, 3)) AS TurnoverCt13178_
FROM dbo._AccRg13157 T2
INNER JOIN #tt4 T3 WITH(NOLOCK)
ON T3._IDRRef = T2._AccountDtRRef AND T3._EDCount = *P8
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T4
ON T4._Acc4_IDRRef = T2._AccountDtRRef AND T4._LineNo = *P9
LEFT OUTER JOIN dbo._AccRgED13184 T5
ON T5._Period >= *P10 AND T5._Period < *P11 AND T5._Period = T2._Period AND T5._RecorderTRef = T2._RecorderTRef AND T5._RecorderRRef = T2._RecorderRRef AND T5._LineNo = T2._LineNo AND T5._Correspond = *P12 AND T5._KindRRef = T4._DimKindRRef
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T6
ON T6._Acc4_IDRRef = T2._AccountDtRRef AND T6._LineNo = *P13
LEFT OUTER JOIN dbo._AccRgED13184 T7
ON T7._Period >= *P14 AND T7._Period < *P15 AND T7._Period = T2._Period AND T7._RecorderTRef = T2._RecorderTRef AND T7._RecorderRRef = T2._RecorderRRef AND T7._LineNo = T2._LineNo AND T7._Correspond = *P16 AND T7._KindRRef = T6._DimKindRRef
WHERE T2._Active = 0x01 AND (T2._Period >= *P17 AND T2._Period < *P18) AND T2._AccountDtRRef <> 0x00000000000000000000000000000000
UNION ALL SELECT
T8._AccountCtRRef AS AccountRRef,
T8._Fld13158RRef AS Fld13158RRef,
T8._Fld13159CtRRef AS Fld13159RRef,
T9._EDCount AS EDCount_,
T11._Value_TYPE AS EDValue1_TYPE,
T11._Value_RTRef AS EDValue1_RTRef,
T11._Value_RRRef AS EDValue1_RRRef,
T13._Value_TYPE AS EDValue2_TYPE,
T13._Value_RTRef AS EDValue2_RTRef,
T13._Value_RRRef AS EDValue2_RRRef,
CAST(*P19 AS NUMERIC(15, 2)) AS TurnoverDt13171_,
T8._Fld13160 AS TurnoverCt13172_,
CAST(*P20 AS NUMERIC(15, 2)) AS TurnoverDt13174_,
T8._Fld13161Ct AS TurnoverCt13175_,
CAST(*P21 AS NUMERIC(15, 3)) AS TurnoverDt13177_,
T8._Fld13162Ct AS TurnoverCt13178_
FROM dbo._AccRg13157 T8
INNER JOIN #tt4 T9 WITH(NOLOCK)
ON T9._IDRRef = T8._AccountCtRRef AND T9._EDCount = *P22
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T10
ON T10._Acc4_IDRRef = T8._AccountCtRRef AND T10._LineNo = *P23
LEFT OUTER JOIN dbo._AccRgED13184 T11
ON T11._Period >= *P24 AND T11._Period < *P25 AND T11._Period = T8._Period AND T11._RecorderTRef = T8._RecorderTRef AND T11._RecorderRRef = T8._RecorderRRef AND T11._LineNo = T8._LineNo AND T11._Correspond = *P26 AND T11._KindRRef = T10._DimKindRRef
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T12
ON T12._Acc4_IDRRef = T8._AccountCtRRef AND T12._LineNo = *P27
LEFT OUTER JOIN dbo._AccRgED13184 T13
ON T13._Period >= *P28 AND T13._Period < *P29 AND T13._Period = T8._Period AND T13._RecorderTRef = T8._RecorderTRef AND T13._RecorderRRef = T8._RecorderRRef AND T13._LineNo = T8._LineNo AND T13._Correspond = *P30 AND T13._KindRRef = T12._DimKindRRef
WHERE T8._Active = 0x01 AND (T8._Period >= *P31 AND T8._Period < *P32) AND T8._AccountCtRRef <> 0x00000000000000000000000000000000) T1
GROUP BY T1.AccountRRef,
T1.Fld13158RRef,
T1.Fld13159RRef,
T1.EDValue1_TYPE,
T1.EDValue1_RTRef,
T1.EDValue1_RRRef,
T1.EDValue2_TYPE,
T1.EDValue2_RTRef,
T1.EDValue2_RRRef',N'*P1 datetime2(3),*P2 numeric(10),*P3 numeric(10),*P4 numeric(10),*P5 numeric(10),*P6 numeric(10),*P7 numeric(10),*P8 numeric(10),*P9 numeric(10),*P10 datetime2(3),*P11 datetime2(3),*P12 numeric(10),*P13 numeric(10),*P14 datetime2(3),*P15 datetime2(3),*P16 numeric(10),*P17 datetime2(3),*P18 datetime2(3),*P19 numeric(10),*P20 numeric(10),*P21 numeric(10),*P22 numeric(10),*P23 numeric(10),*P24 datetime2(3),*P25 datetime2(3),*P26 numeric(10),*P27 numeric(10),*P28 datetime2(3),*P29 datetime2(3),*P30 numeric(10),*P31 datetime2(3),*P32 datetime2(3)','4020-11-01 00:00:00',0,0,0,0,0,0,2,1,'4020-11-01 00:00:00','4020-12-01 00:00:00',0,2,'4020-11-01 00:00:00','4020-12-01 00:00:00',0,'4020-11-01 00:00:00','4020-12-01 00:00:00',0,0,0,2,1,'4020-11-01 00:00:00','4020-12-01 00:00:00',1,2,'4020-11-01 00:00:00','4020-12-01 00:00:00',1,'4020-11-01 00:00:00','4020-12-01 00:00:00'
Показать
5. anig99 2843 19.12.20 23:21 Сейчас в теме
Добрый вечер! Текущий способ помог и мне, но остается открытым вопрос, почему так происходит?
У меня эта проблема возникла в ноябре. Расчет шел больше суток, потом я его вырубал. Все месяцы до этого считались и считаются быстро (по 1-2 минуты). Я пробовал очищать таблицы итого и пересчитывать, убирать проводки отдельных счетов, искать битые ссылки, проверял на разных базах. Но ничего необычного не находил. Максимум, что выяснил, что если оставить проводки с 1 по 5 число, то расчет идет 10-15 минут. Далее Помог только описанный в статья способ. Итог рассчитался за 15 секунд.
Как найти причину, чтобы не пришлось каждый раз чистить таблицы?
6. anig99 2843 19.12.20 23:22 Сейчас в теме
(5) вот отчет из profiler
Добрый вечер! Текущий способ помог и мне, но остается открытым вопрос, почему так происходит?
У меня эта проблема возникла в ноябре. Расчет шел больше суток, потом я его вырубал. Все месяцы до этого считались и считаются быстро (по 1-2 минуты). Я пробовал очищать таблицы итого и пересчитывать, убирать проводки отдельных счетов, искать битые ссылки, проверял на разных базах. Но ничего необычного не находил. Максимум, что выяснил, что если оставить проводки с 1 по 5 число, то расчет идет 10-15 минут. Далее Помог только описанный в статья способ. Итог рассчитался за 15 секунд.
Как найти причину, чтобы не пришлось каждый раз чистить таблицы?

Вот зависающий отчет из profilerа

exec sp_executesql N'INSERT INTO #tt7 WITH(TABLOCK) (_Period, _AccountRRef, _Fld13158RRef, _Fld13159RRef, _EDValue1_TYPE, _EDValue1_RTRef, _EDValue1_RRRef, _EDValue2_TYPE, _EDValue2_RTRef, _EDValue2_RRRef, _Fld13160, _TurnoverDt13171, _TurnoverCt13172, _Turnover13173, _Fld13161, _TurnoverDt13174, _TurnoverCt13175, _Turnover13176, _Fld13162, _TurnoverDt13177, _TurnoverCt13178, _Turnover13179) SELECT
*P1,
T1.AccountRRef,
T1.Fld13158RRef,
T1.Fld13159RRef,
T1.EDValue1_TYPE,
T1.EDValue1_RTRef,
T1.EDValue1_RRRef,
T1.EDValue2_TYPE,
T1.EDValue2_RTRef,
T1.EDValue2_RRRef,
*P2,
CAST(SUM(T1.TurnoverDt13171_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverCt13172_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverDt13171_ - T1.TurnoverCt13172_) AS NUMERIC(22, 2)),
*P3,
CAST(SUM(T1.TurnoverDt13174_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverCt13175_) AS NUMERIC(21, 2)),
CAST(SUM(T1.TurnoverDt13174_ - T1.TurnoverCt13175_) AS NUMERIC(22, 2)),
*P4,
CAST(SUM(T1.TurnoverDt13177_) AS NUMERIC(21, 3)),
CAST(SUM(T1.TurnoverCt13178_) AS NUMERIC(21, 3)),
CAST(SUM(T1.TurnoverDt13177_ - T1.TurnoverCt13178_) AS NUMERIC(22, 3))
FROM (SELECT
T2._AccountDtRRef AS AccountRRef,
T2._Fld13158RRef AS Fld13158RRef,
T2._Fld13159DtRRef AS Fld13159RRef,
T3._EDCount AS EDCount_,
T5._Value_TYPE AS EDValue1_TYPE,
T5._Value_RTRef AS EDValue1_RTRef,
T5._Value_RRRef AS EDValue1_RRRef,
T7._Value_TYPE AS EDValue2_TYPE,
T7._Value_RTRef AS EDValue2_RTRef,
T7._Value_RRRef AS EDValue2_RRRef,
T2._Fld13160 AS TurnoverDt13171_,
CAST(*P5 AS NUMERIC(15, 2)) AS TurnoverCt13172_,
T2._Fld13161Dt AS TurnoverDt13174_,
CAST(*P6 AS NUMERIC(15, 2)) AS TurnoverCt13175_,
T2._Fld13162Dt AS TurnoverDt13177_,
CAST(*P7 AS NUMERIC(15, 3)) AS TurnoverCt13178_
FROM dbo._AccRg13157 T2
INNER JOIN #tt4 T3 WITH(NOLOCK)
ON T3._IDRRef = T2._AccountDtRRef AND T3._EDCount = *P8
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T4
ON T4._Acc4_IDRRef = T2._AccountDtRRef AND T4._LineNo = *P9
LEFT OUTER JOIN dbo._AccRgED13184 T5
ON T5._Period >= *P10 AND T5._Period < *P11 AND T5._Period = T2._Period AND T5._RecorderTRef = T2._RecorderTRef AND T5._RecorderRRef = T2._RecorderRRef AND T5._LineNo = T2._LineNo AND T5._Correspond = *P12 AND T5._KindRRef = T4._DimKindRRef
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T6
ON T6._Acc4_IDRRef = T2._AccountDtRRef AND T6._LineNo = *P13
LEFT OUTER JOIN dbo._AccRgED13184 T7
ON T7._Period >= *P14 AND T7._Period < *P15 AND T7._Period = T2._Period AND T7._RecorderTRef = T2._RecorderTRef AND T7._RecorderRRef = T2._RecorderRRef AND T7._LineNo = T2._LineNo AND T7._Correspond = *P16 AND T7._KindRRef = T6._DimKindRRef
WHERE T2._Active = 0x01 AND (T2._Period >= *P17 AND T2._Period < *P18) AND T2._AccountDtRRef <> 0x00000000000000000000000000000000
UNION ALL SELECT
T8._AccountCtRRef AS AccountRRef,
T8._Fld13158RRef AS Fld13158RRef,
T8._Fld13159CtRRef AS Fld13159RRef,
T9._EDCount AS EDCount_,
T11._Value_TYPE AS EDValue1_TYPE,
T11._Value_RTRef AS EDValue1_RTRef,
T11._Value_RRRef AS EDValue1_RRRef,
T13._Value_TYPE AS EDValue2_TYPE,
T13._Value_RTRef AS EDValue2_RTRef,
T13._Value_RRRef AS EDValue2_RRRef,
CAST(*P19 AS NUMERIC(15, 2)) AS TurnoverDt13171_,
T8._Fld13160 AS TurnoverCt13172_,
CAST(*P20 AS NUMERIC(15, 2)) AS TurnoverDt13174_,
T8._Fld13161Ct AS TurnoverCt13175_,
CAST(*P21 AS NUMERIC(15, 3)) AS TurnoverDt13177_,
T8._Fld13162Ct AS TurnoverCt13178_
FROM dbo._AccRg13157 T8
INNER JOIN #tt4 T9 WITH(NOLOCK)
ON T9._IDRRef = T8._AccountCtRRef AND T9._EDCount = *P22
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T10
ON T10._Acc4_IDRRef = T8._AccountCtRRef AND T10._LineNo = *P23
LEFT OUTER JOIN dbo._AccRgED13184 T11
ON T11._Period >= *P24 AND T11._Period < *P25 AND T11._Period = T8._Period AND T11._RecorderTRef = T8._RecorderTRef AND T11._RecorderRRef = T8._RecorderRRef AND T11._LineNo = T8._LineNo AND T11._Correspond = *P26 AND T11._KindRRef = T10._DimKindRRef
LEFT OUTER JOIN dbo._Acc4_ExtDim13078 T12
ON T12._Acc4_IDRRef = T8._AccountCtRRef AND T12._LineNo = *P27
LEFT OUTER JOIN dbo._AccRgED13184 T13
ON T13._Period >= *P28 AND T13._Period < *P29 AND T13._Period = T8._Period AND T13._RecorderTRef = T8._RecorderTRef AND T13._RecorderRRef = T8._RecorderRRef AND T13._LineNo = T8._LineNo AND T13._Correspond = *P30 AND T13._KindRRef = T12._DimKindRRef
WHERE T8._Active = 0x01 AND (T8._Period >= *P31 AND T8._Period < *P32) AND T8._AccountCtRRef <> 0x00000000000000000000000000000000) T1
GROUP BY T1.AccountRRef,
T1.Fld13158RRef,
T1.Fld13159RRef,
T1.EDValue1_TYPE,
T1.EDValue1_RTRef,
T1.EDValue1_RRRef,
T1.EDValue2_TYPE,
T1.EDValue2_RTRef,
T1.EDValue2_RRRef',N'*P1 datetime2(3),*P2 numeric(10),*P3 numeric(10),*P4 numeric(10),*P5 numeric(10),*P6 numeric(10),*P7 numeric(10),*P8 numeric(10),*P9 numeric(10),*P10 datetime2(3),*P11 datetime2(3),*P12 numeric(10),*P13 numeric(10),*P14 datetime2(3),*P15 datetime2(3),*P16 numeric(10),*P17 datetime2(3),*P18 datetime2(3),*P19 numeric(10),*P20 numeric(10),*P21 numeric(10),*P22 numeric(10),*P23 numeric(10),*P24 datetime2(3),*P25 datetime2(3),*P26 numeric(10),*P27 numeric(10),*P28 datetime2(3),*P29 datetime2(3),*P30 numeric(10),*P31 datetime2(3),*P32 datetime2(3)','4020-11-01 00:00:00',0,0,0,0,0,0,2,1,'4020-11-01 00:00:00','4020-12-01 00:00:00',0,2,'4020-11-01 00:00:00','4020-12-01 00:00:00',0,'4020-11-01 00:00:00','4020-12-01 00:00:00',0,0,0,2,1,'4020-11-01 00:00:00','4020-12-01 00:00:00',1,2,'4020-11-01 00:00:00','4020-12-01 00:00:00',1,'4020-11-01 00:00:00','4020-12-01 00:00:00'
Показать
7. MarcoPolo3 50 20.12.20 23:50 Сейчас в теме
(5) Приветствую, причина скорее всего в том, что текущая модель хранения данных регистра бухгалтерии и запросы, которые формирует 1С при расчете итогов, при большом количестве записей в таблицах строит не оптимальные планы запроса на стороне MSSQL (если оптимальные при такой модели вообще можно построить). К сожалению я не имею достаточной квалификации по MSSQL, чтобы "копнуть" глубже в данном вопросе, поэтому ума хватило только на такой своеобразный "костыль".
8. anig99 2843 21.12.20 05:42 Сейчас в теме
(7) Доброе утро! Вчера всё-таки выяснили в чем дело. Не обновлялась статистика по регистрам. Вручную обновил статистику, добавил соответствующее задание на перестройку индексов с обновлением статистики, включил флаг для SQL сервера для баз с режимом совместимости.
9. due 385 11.07.22 09:34 Сейчас в теме
(8)
включил флаг для SQL сервера для баз с режимом совместимости
Добрый день! Можете уточнить какой флаг включали для оптимизации?
Оставьте свое сообщение