К сожалению, 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 (Антон Ширяев)
Лучше будет добавить первой строчкой в запрос:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
(0)
похожее , с меньшим функционалом, ещё и допиливать перед запуском пришлось, но всё таки добавьте в аналоги
<Зануда_Мод>
Было
</Зануда_Мод>
так вот, другая обработка не устроила по функционалу из-за того что время не соответствовало действительному времени ожидания отвисания 1с пользователем, за счёт времени обработки подписок ПередПроведением и ПослеПроведения, которые почему то не учитывались, возможно из-за того что происходят не в транзакции, хотя могу ошибаться.
У вас с этим проблем нет?
{Форма.Форма.Форма(208)}: Ошибка при вызове метода контекста (Open)
АДО.Open(ТекстЗапроса);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Недопустимое имя объекта «dbo.Infobases».
Из за чего такое может быть?
В поле сервер и имя базы ввел название сервера SQL и базы данных
(3) Та же проблема…
А почему было не начать с простенького: просто соорудить вьювер журнала регистрации из базы SQL со всякими фильтрами/отборами и проч?
Спасибо.