К сожалению, 1С дает информацию о транзакции в строковом виде, поэтому на разбор этой строки в дату и метку транзакции потребуется время.
Рассмотрим вариант извлечения этой информации из SQL-базы, куда события журнала регистрации были записаны с помощью этого инструмента.
Какие ограничения стоит учесть при выборке данных:
1) Нужно отсечь отмененные транзакции, а информация об отмене транзакции есть только в последней записи. Т.е., если в рамках одной отмененной транзакции в ЖР было записано 5 строк, то в 4 из них будет признак "Транзакция зафиксирована", а в последней строке уже "Транзакция отменена".
2) Нужно отсечь длинные транзакции, в рамках которых были перепроведены несколько документов. В этом случае нужна другая методика подсчета времени, которую мы здесь не рассматриваем.
Учитывая эти ограничения, запрос получается сложным:
SELECT
DateTime AS [DateTime],
DATEDIFF (SECOND,TransactionStartTime,DateTime) as [DIFF],
Users.Name as [UserName],
Metadata.Name as [MetadataName],
DataStructure as [Data]
FROM Events
INNER JOIN Metadata ON Events.MetadataID = Metadata.Code
INNER JOIN Users ON Events.UserName = Users.Code
Where
DataStructure like '{"R",%}'
AND EventID IN (SELECT Code FROM EventsType WHERE (Name = '_$Data$_.Post') AND (InfobaseCode = 1))
AND TransactionStatus = 'U'
AND DateTime >= '20130401'
AND DateTime <= '20130415'
AND Events.InfobaseCode = 1
AND NOT TransactionMark IN (SELECT TransactionMark FROM
(SELECT TransactionMark, SUM(1) AS Count
FROM Events
WHERE (EventID IN (SELECT Code
FROM EventsType
WHERE Name = '_$Data$_.Post'
AND InfobaseCode = 1))
AND DateTime >= '20130401'
AND DateTime <= '20130415'
AND InfobaseCode = 1
GROUP BY TransactionMark) AS T
WHERE (Count > 1))
AND NOT TransactionMark IN (SELECT TransactionMark
FROM Events
WHERE TransactionStatus = 'R'
AND DateTime >= '20130401'
AND DateTime <= '20130415'
AND Events.InfobaseCode = 1)
ORDER BY DateTime desc
Выполняться он будет достаточно долго, поэтому лучше заблаговременно создать для него 2 индекса, которые предлагает MS SQL Server:
CREATE NONCLUSTERED INDEX [Missing Index 2] ON [dbo].[Events]
(
[InfobaseCode] ASC,
[EventID] ASC,
[DateTime] ASC
)
INCLUDE ( [TransactionMark],
[DataStructure])
GO
CREATE NONCLUSTERED INDEX [Missing Index 1] ON [dbo].[Events]
(
[InfobaseCode] ASC,
[TransactionStatus] ASC,
[DateTime] ASC
)
INCLUDE ( [TransactionMark])
Для удобства во вложении небольшая обработка, которая автоматизирует формирование и выполнение запроса:
Порядок работы:
1) Указать строку соединения: например, Driver={SQL Server};Server=SRV1007;Database=Eventlog;
2) Нажать "Обновить список ИБ" и выбрать из списку нужную информационую базу.
3) Указать период и нажать "Получить таблицу длительности проведения документов".
P.S. - Для преобразования строкового идентификатора в ссылку использован кусок кода из этой разработки - Анализ и редактирование файлов журнала регистрации 1С 8.1/8.2 - ELF/LOG/LGF/LGP (Антон Ширяев)