gifts2017

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

Опубликовал Алексей Бочков (Aleksey.Bochkov) в раздел Программирование - Практика программирования

В журнале регистрации 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 (Антон Ширяев)

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Получение длительности проведения документов из ЖР
.epf 11,54Kb
14.04.13
39
.epf 11,54Kb 39 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Марат Биккин (squad) 19.04.13 09:31
Лучше будет добавить первой строчкой в запрос:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
2. Vladimir K (KroVladS) 02.07.13 18:00
(0)
<Зануда_Мод>
Было похожее, с меньшим функционалом, ещё и допиливать перед запуском пришлось, но всё таки добавьте в аналоги
</Зануда_Мод>

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

У вас с этим проблем нет?
3. Ярослав Юнка (y22-k) 09.09.13 12:25
{Форма.Форма.Форма(208)}: Ошибка при вызове метода контекста (Open)
АДО.Open(ТекстЗапроса);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Недопустимое имя объекта "dbo.Infobases".

Из за чего такое может быть?
В поле сервер и имя базы ввел название сервера SQL и базы данных
4. Александр Плюшкин (php5) 23.03.16 10:40
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа