Замер длительности проведения документов по журналу регистрации без изменения конфигурации

В журнале регистрации 1С есть интересная колонка — "Транзакция", которая содержит момент начала транзакции и ее идентификатор. Используя эти данные, можно вычислить статистику времени проведения документов за промежуток времени.

К сожалению, 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 (Антон Ширяев)

5 Comments

  1. squad

    Лучше будет добавить первой строчкой в запрос:

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    Reply
  2. KroVladS

    (0)

    <Зануда_Мод>

    Было похожее, с меньшим функционалом, ещё и допиливать перед запуском пришлось, но всё таки добавьте в аналоги

    </Зануда_Мод>

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

    У вас с этим проблем нет?

    Reply
  3. y22-k

    {Форма.Форма.Форма(208)}: Ошибка при вызове метода контекста (Open)

    АДО.Open(ТекстЗапроса);

    по причине:

    Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Недопустимое имя объекта «dbo.Infobases».

    Из за чего такое может быть?

    В поле сервер и имя базы ввел название сервера SQL и базы данных

    Reply
  4. php5

    (3) Та же проблема…

    Reply
  5. zzz_natali

    А почему было не начать с простенького: просто соорудить вьювер журнала регистрации из базы SQL со всякими фильтрами/отборами и проч?

    Спасибо.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *