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

30.05.17

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Перерасчет итогов регистра бухгалтерии в 1С:
.rar 7,33Kb
41
41 Скачать (1 SM) Купить за 1 850 руб.

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

На предприятии, где я работаю имеется база 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 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    9260    Evg-Lylyk    61    

44

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

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

13.03.2024    5097    spyke    28    

49

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

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

13.03.2024    7573    vasilev2015    20    

42

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

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

2 стартмани

15.02.2024    12422    241    ZAOSTG    80    

115

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

Принимать, хранить и анализировать показания счетчиков (метрики) в базе 1С? Почему бы нет? Но это решение быстро привело к проблемам с производительностью при попытках построить какую-то более-менее сложную аналитику. Переход на PostgresSQL только временно решил проблему, т.к. количество записей уже исчислялось десятками миллионов и что-то сложное вычислить на таких объемах за разумное время становилось все сложнее. Кое-что уже практически невозможно. А что будет с производительностью через пару лет - представить страшно. Надо что-то предпринимать! В этой статье поделюсь своим первым опытом применения СУБД Clickhouse от Яндекс. Как работает, что может, как на нее планирую (если планирую) переходить, сравнение скорости работы, оценка производительности через пару лет, пример работы из 1С. Все это приправлено текстами запросов, кодом, алгоритмами выполненных действий и преподнесено вам для ознакомления в этой статье.

1 стартмани

24.01.2024    5669    glassman    18    

40

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

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

09.01.2024    14016    doom2good    49    

71
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. GROOVY 2510 30.05.17 15:09 Сейчас в теме
Превосходная статья, для тех кто хочет разобраться в механизмах регистров бухгалтерии.
4. anig99 2852 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 2852 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 2852 19.12.20 23:21 Сейчас в теме
Добрый вечер! Текущий способ помог и мне, но остается открытым вопрос, почему так происходит?
У меня эта проблема возникла в ноябре. Расчет шел больше суток, потом я его вырубал. Все месяцы до этого считались и считаются быстро (по 1-2 минуты). Я пробовал очищать таблицы итого и пересчитывать, убирать проводки отдельных счетов, искать битые ссылки, проверял на разных базах. Но ничего необычного не находил. Максимум, что выяснил, что если оставить проводки с 1 по 5 число, то расчет идет 10-15 минут. Далее Помог только описанный в статья способ. Итог рассчитался за 15 секунд.
Как найти причину, чтобы не пришлось каждый раз чистить таблицы?
6. anig99 2852 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 2852 21.12.20 05:42 Сейчас в теме
(7) Доброе утро! Вчера всё-таки выяснили в чем дело. Не обновлялась статистика по регистрам. Вручную обновил статистику, добавил соответствующее задание на перестройку индексов с обновлением статистики, включил флаг для SQL сервера для баз с режимом совместимости.
tyazhovkin; due; +2 Ответить
9. due 390 11.07.22 09:34 Сейчас в теме
(8)
включил флаг для SQL сервера для баз с режимом совместимости
Добрый день! Можете уточнить какой флаг включали для оптимизации?
Оставьте свое сообщение