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

30.05.17

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

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

Файлы

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

Наименование Скачано Купить файл
Перерасчет итогов регистра бухгалтерии в 1С:
.rar 7,33Kb
44 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

На предприятии, где я работаю имеется база 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С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    6964    ivanov660    48    

52

HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    9252    ivanov660    39    

61

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    11681    ivanov660    13    

64

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

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

06.06.2024    18125    Evg-Lylyk    73    

46

HighLoad оптимизация Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

13.03.2024    8856    spyke    29    

54

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

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

13.03.2024    12304    vasilev2015    22    

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