Автоматизация анализа файлов технологического журнала

08.09.15

База данных - Технологический журнал

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

Файлы

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

Наименование Скачано Купить файл
Исполняемый файл
.zip 262,12Kb
79 2 500 руб. Купить

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

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

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

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Приложение позволяет выполнять разбор текстовых файлов технологического журнала с расширением *.log на события и запись этих событий в таблицу базы MS SQL.
Состав свойств ориентирован в основном на запросы и исключения.
Обработка файлов производится в многопоточном режиме, что позволяет загружать большие объемы информации за относительно небольшое время.

Для работы приложения необходим установленный NET Framework 2.0.

Для начала использования приложения требуется:
1) создать на сервере MS SQL новую пустую базу
2) заполнить строку соединения с сервером по шаблону:
для windows-авторизации Data Source=MSSQL1;Server=имя сервера;Database=имя базы;Integrated Security=true;
для обычной авторизации  Data Source=MSSQL1;Server=имя сервера;Database=имя базы;Password=Пароль;User ID=Имя пользователя;
3) нажать кнопку "Создать служебную таблицу", которая подключится к серверу и выполнит создание структуры таблицы для событий

Порядок загрузки файлов:
1) указать строку соединения как описано выше;
2) указать каталог, содержащий файлы тех.журнала с расширением *.log, вложенные каталоги обрабатываются рекурсивно;
3) указать число параллельных потоков, в которых программа будет обрабатывать файлы. Диапазон от 1 до 100, но ставить больше 20-30 нет особого смысла, хотя все зависит от конкретной машины, на которой выполняется запуск.
4) нажать кнопку "Заполнить список файлов" - программа найдет все файлы ТЖ в указанном каталоге и отобразит их список;
5) нажать кнопку "Запустить разбор" - программа начнет параллельное чтение файлов, их разбор и запись полученных событий в структурированном виде в базу данных.

Дополнительные вычисляемые данные

Чтобы сделать данные более полезными для анализа были добавлены 2 вычисляемых поля для событий DBMSSQL и SDBL.

Поле "ContextLastRow" - заполняется последней строкой вызываемого контекста. Позволяет сгруппировать строки кода, которые вызываются из разных мест. Без этой информации сложно получить достоверную картину о влиянии некоторых общих процедур и функций, вызываемых из разных участков конфигурации.

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

Чтобы подставить подобный контекст к правильным местам вызова и получить более объекивную картину - требуется выполнить следующий запрос в базе с загруженными данными:

---простановка контекста для DBMSSQL в пределах 50 миллисекунд
SELECT Context, ContextLastRow, DATEADD(ms, - 50, DateTime) as D1, DATEADD(ms, 50, DateTime) as D2, ProcessName, t_clientID, SessionID
INTO #ContextTable
FROM logs
WHERE (EventName = 'Context')

CREATE CLUSTERED INDEX ix_Main ON #ContextTable (ProcessName, t_clientID, SessionID)

SELECT DateTime, EventName, ProcessName, t_clientID, Moment, SessionID, Context, ContextLastRow
INTO #QueriesTable
FROM logs
WHERE (EventName = 'DBMSSQL' AND Context = '' AND ContextLastRow = '')

CREATE CLUSTERED INDEX ix_Main ON #QueriesTable (ProcessName, t_clientID, SessionID)

SELECT DateTime, EventName, ProcessName, t_clientID, Moment, SessionID, Contexts.Context, Contexts.ContextLastRow
INTO #NewData
FROM #QueriesTable AS Queries
OUTER APPLY (SELECT TOP 1 Context, ContextLastRow
				FROM #ContextTable AS A
				WHERE
				(ProcessName = Queries.ProcessName) 
				AND (t_clientID = Queries.t_clientID) 
				AND (SessionID = Queries.SessionID) 
				AND (Queries.DateTime BETWEEN D1 AND D2)) AS Contexts
WHERE NOT Contexts.Context IS NULL AND NOT Contexts.ContextLastRow IS NULL

DROP TABLE #ContextTable
DROP TABLE #QueriesTable

UPDATE T SET T.Context = OT.Context, T.ContextLastRow = OT.ContextLastRow
FROM [logs] T
INNER JOIN
	(SELECT DateTime, EventName, ProcessName, t_clientID, Moment, SessionID, Context, ContextLastRow
		FROM #NewData) OT
ON
    T.[DateTime] = OT.[DateTime]
	AND T.Moment = OT.Moment
	AND T.EventName = OT.EventName
	AND T.ProcessName = OT.ProcessName
	AND T.t_clientID = OT.t_clientID
	AND T.SessionID = OT.SessionID

DROP TABLE #NewData

 

Поле "TablesList" - заполняется физическими таблицами, участвующими в запросе, в порядке их следования. Это позволяет группировать однотипные по структуре запросы и получать более точную информацию о том, какие именно таблицы наиболее часто или долго участвуют в запросах. Без подобного поля группировка невозможна из-за случайных имен временных таблиц, разного количества параметров, разных псевдонимов и т.д.

Несколько примеров выборки данных

Получить список контекстов кода, выполнение запросов по которым заняло наибольшее время:

SELECT SUM([Duration]) [Общая длительность], AVG([Duration]) [Среднее], SUM(1) [Количество],
      Min(DateTime) [Начало], Max(DateTime) [Окочнание], [ContextLastRow]
FROM [dbo].[logs]
where NOT [ContextLastRow] = '' AND EventName='DBMSSQL' 
GROUP BY [ContextLastRow]
ORDER BY SUM([Duration]) DESC

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

 

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

SELECT SUM([Duration]) [Общая длительность], AVG([Duration]) [Среднее], SUM(1) [Количество], 
      Min(DateTime) [Начало], Max(DateTime) [Окончание], TablesList, ProcessName
FROM [dbo].[logs]
where NOT tableslist = '' AND EventName='DBMSSQL' 
GROUP BY TablesList, ProcessName
ORDER BY SUM([Duration]) DESC

 

Исходные коды

Актуальная версия всегда доступна на github - https://github.com/alekseybochkov/tj_loader/

Для работы с исходными кодами требуется Visual Studio 2015 с поддержкой Visual Basic (кстати версия Visual Studio 2015 Community Edition бесплатна!).

Опубликовано по лицензии GNU GPL - https://ru.wikipedia.org/wiki/GNU_General_Public_License

 

UPD 18.02.2012
* добавлена возможность выполнения произвольных запросов к базе с событиями непосредственно из приложения;
* добавлена возможность выгрузки результатов запроса в Excel (проверялось только на русской версии Excel 2010);
* добавлена возможность просмотра структурированного плана запроса MS SQL и его выгрузка в Excel

UPD 08.03.2012
* добавлена галка "Очистить таблицу в СУБД перед загрузкой данных"
* при закрытии приложения происходит сохранение настроек в файле setting.ini. При запуске приложение считывает настройки из файла и использует их.

UPD 21.03.2015
* добавлена загрузка из тех.журналов 8.3 (увеличена точность времени события).
* добавлены исходники для Visual Studio 2013 на vb.net.

UPD 20.07.2015
* добавлено дополнительное вычисляемое поле "TablesList" для событий DBMSSQL, которое заполняется перечнем физических таблиц, участвующих в запросе. Это позволяет группировать однотипные по структуре запросы и получать более ценную информацию о проблемных местах. Без этого группировка невозможна из-за случайных имен временных таблиц, разного количества параметров, разных псевдонимов и т.д.

UPD 08.09.2015
* добавлено дополнительное вычисляемое поле "ContextLastRow"

Вступайте в нашу телеграмм-группу Инфостарт

технологический журнал администрирование производительность

См. также

HighLoad оптимизация Инструментарий разработчика Технологический журнал Разработчик 1С 8.3 Россия Абонемент ($m)

Скрипт tj_baseline.py собрал акт замеров из технологического журнала: 7 повторов до и 7 после замены запросов в цикле на «Нано-УТ 2.0». Справка на 150 строк ускорилась с 817,0 до 145,0 мс, проверка доступности с 301,3 до 2,2 мс. При 120 и 300 вызовах в день и ставке 800 руб. выгода 9353 руб. в год по журналу, 4939 руб. по секундомеру без журнала. В архивах скрипт, тесты, журналы опыта, образец приложения к договору и калькулятор.

7 стартмани

27.10.2026    299    Ninel_S    0    

1

HighLoad оптимизация Администрирование СУБД Технологический журнал Системный администратор Разработчик 1С 8.3 Абонемент ($m)

Проверила на стенде совет «сортируйте строки перед записью»: 1С 8.3.27 на PostgreSQL, учебная «Нано-УТ», 20 потоков и по 2000 документов на каждый способ записи движений. Взаимоблокировки дают построчный захват (99 % ошибок) и повышение разделяемой блокировки до исключительной (95 %, сортировка не помогает); одна блокировка на весь набор работает без сортировки. Плюс механика PostgreSQL, дерево ожиданий через pg_blocking_pids, TDEADLOCK в журнале и единицы порога TLOCK в logcfg.xml. В архиве стенд, выгрузка конфигурации и журналы прогона.

5 стартмани

22.10.2026    429    Ninel_S    10    

1

Журнал регистрации Инструменты администратора БД Технологический журнал Мониторинг Системный администратор Разработчик 1С 8.3 1С 8.5 1С:Управление торговлей 11 Абонемент ($m)

Расширение для любой конфигурации на БСП: замеры, ошибки, задания, обмены, блокировки, диски, сеансы и техжурнал в одном окне, с уведомлениями в Telegram и на почту.

3 стартмани

19.10.2026    499    6    windsurf    0    

3

HighLoad оптимизация Технологический журнал Сервера Запросы Системный администратор Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)

Составной отчет формировался 15 минут. Вместо перебора разделов одна команда rac показала, что сеанс занят запросом к СУБД, а временный техжурнал с порогом 20 секунд за один прогон назвал виновника: один SQL на 240 секунд и точную строку модуля. В статье четыре разные картины «висит» и как их различить: идет запрос в СУБД, клиент ждет невидимое модальное окно, зомби-вызов после закрытого клиента, зависшее фоновое задание. Пример logcfg.xml, разбор события DBMSSQL с полем Context, замер пакета запросов по временным таблицам, регламентное задание, которое «выполнено», а данные стоят, и шпаргалка по диагностике.

16.10.2026    1109    Konstmax13    6    

2

Технологический журнал Сервера EDT Обновление 1С Системный администратор Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)

Конфигуратор и агент EDT тихо вылетают на 0 % «Обработки структуры базы данных», EDT пишет «Потеряно соединение с агентом конфигуратора», а модель проекта при этом чистая. Разбор двух аварий на большой серверной базе БП КОРП: какие факты снимать (журнал Windows, техжурнал нужной версии, хвост лога процесса), почему инкрементальная выгрузка EDT ломается после сбоев, как довести обновление пакетно через /UpdateDBCfg -Server, как опознать свои rphost среди нескольких кластеров и снять агент EDT, который сам поднимается и держит базу. Протокол одного дня по минутам и порядок диагностики из восьми шагов.

15.10.2026    487    Konstmax13    0    

0

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

В этой статье рассматривается только первый этап диагностики производительности: как получить длительный SQL-запрос из технологического журнала, связать его с прикладным кодом 1С и точно локализовать место выполнения. Причины длительности и оптимизация самого запроса разбираются уже после локализации.

21.09.2026    1387    markbraer    1    

5

Технологический журнал Системный администратор Разработчик 1С 8.3 Бесплатно (free)

База ERP, 400 пользователей, сервер загружен, 1С подвисает, доступа к SQL Server нет. Оптимизировать можно бесконечно, вопрос в том, с чего начать. ЦУП это платная лицензия и отдельная стройка, а технологический журнал встроен в платформу, включается одним файлом и на боевой базе в рабочее время не вызвал ни одной жалобы от пользователей. Разбираю, что он собой представляет, где лежит настройка, как читается строка события и что означает каждое из одиннадцати событий, которые я видел в журналах боевой ERP. Плюс рабочий logcfg.xml, три ловушки, на которых отчёт получается красивым и неверным, и шесть находок за один прогон.

07.09.2026    2455    nedomolkov.ivan    0    

3

Технологический журнал Системный администратор Разработчик 1С 8.3 Абонемент ($m)

Обработка включает технологический журнал, читает его и отвечает на 13 вопросов человеческим языком: кто блокирует базу, какой запрос к СУБД самый тяжёлый, какой код суммарно грузит СУБД больше всех, какой вызов съедает память. Настройка идёт галочками с человеческими формулировками, logcfg.xml обработка пишет сама, права администратора для этого обычно не нужны. Отдельная кнопка сводит журнал в один markdown-файл: на боевой ERP 288 МБ и 2 055 229 строк ужались в 17 459 знаков, файл кладётся в чат с нейросетью и разбирается за минуту. Имена баз и пользователей в нём заменены псевдонимами. Без внешних компонент, к СУБД обращений нет.

10 стартмани

07.09.2026    1492    6    nedomolkov.ivan    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. aspirator23 343 15.02.12 07:36 Сейчас в теме
Ценная вещь. Жалко что к ней не приложена обработка для чтений журнала из MS SQL
Кроме того не все сидят на 8.2.14-15
3. Aleksey.Bochkov 3713 15.02.12 13:53 Сейчас в теме
(1) aspirator23, думаю, что можно в это же приложение добавить просмотр загруженных событий с отбором по виду события и сортировкой по длительности.
(2) stal76, похожая, но не совсем. Отличия в том, что мое приложение может загружать любые события с любым составом свойств(но сохраняются, конечно, только те свойства, которые есть в структуре таблицы) в многопоточном режиме, а хранимая процедура squad'a заточена чисто на запросы, грузит в один поток + файлы читаются при каждом обращении.
2. stal76 389 15.02.12 09:27 Сейчас в теме
4. Новиков 292 16.02.12 10:14 Сейчас в теме
Плюсую! Нужная весчь!
5. Zas1402 21.02.12 10:26 Сейчас в теме
(4) Новиков,
так точно полезная вечь.
6. пользователь 21.02.12 13:57
Сообщение было скрыто модератором.
...
7. Babuin 24.02.12 10:58 Сейчас в теме
хм, у меня падает при загрузке логов rphosta почему то
8. Aleksey.Bochkov 3713 24.02.12 11:29 Сейчас в теме
(7) с какой ошибкой падает? Если ругается на нехватку памяти, то уменьшите число одновременных потоков.
9. Babuin 24.02.12 12:01 Сейчас в теме
(8) нет с памятью все ок, запускал с разными потоками (от 1 до 20)
Какие то логи грузит, на каких то падает

framework ругается
System.ArgumentOutOfRangeException: Value of '14' is not valid for 'Value'. 'Value' should be between 'minimum' and 'maximum'.
Parameter name: Value
at System.Windows.Forms.ProgressBar.set_Value(Int32 value)
at TechJournalLoader.Form1.Timer1_Tick(Object sender, EventArgs e)
at System.Windows.Forms.Timer.OnTick(EventArgs e)
at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
10. Aleksey.Bochkov 3713 24.02.12 12:57 Сейчас в теме
(9) поправил. Скачай программу заново и попробуй еще раз.
11. Babuin 24.02.12 13:18 Сейчас в теме
попробовал, на фрейм не ругается, но все равно падает.
Если грузить по одному файлу то нормально. Если все прогрузить по одному и потом опять скопом то тоже проходит.
Еще бы добавить функцию очищать таблицу, и сохранять путь подключения к базе было бы вообще супер!
12. Aleksey.Bochkov 3713 24.02.12 13:23 Сейчас в теме
(11) а можешь прислать файлы, при загрузке которых происходит падение и сценарий воспроизведения?
ок, сохранение и опциональную очистку таблицы на выходных сделаю.
13. Babuin 24.02.12 13:49 Сейчас в теме
(12) к сожалению не могу, ладно буду грузить по одному.
14. NOVOPRO 14.03.12 04:19 Сейчас в теме
У меня такаяже ошибка
от framework
System.ArgumentOutOfRangeException: Value of '14' is not valid for 'Value'. 'Value' should be between 'minimum' and 'maximum'.
Parameter name: Value
at System.Windows.Forms.ProgressBar.set_Value(Int32 value)
at TechJournalLoader.Form1.Timer1_Tick(Object sender, EventArgs e)
at System.Windows.Forms.Timer.OnTick(EventArgs e)
at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
15. GreenFox 28.03.12 00:16 Сейчас в теме
Вещь конечно интересная - надо разбираться. Подобные обработки в области оптимизации интересовали раньше скорее как развлечение, но сейчас "припекло" и приходиться собирать все , что только можно найти в данной области. КИП пока что недоступен по цене, поэтому пользуемся тем что есть.
16. igor_gk 49 20.07.17 14:43 Сейчас в теме
Что за "текстовых файлов технологического журнала с расширением *.log" ?
17. Andreynikus 1438 26.09.18 12:39 Сейчас в теме
Хорошая вещь! А из 1С можно строить запросы к таблице с данными ТЖ, например через конструктор запросов? Или только прямые запросы к таблицам СУБД?
18. user626776_zhiglin 26.10.18 11:10 Сейчас в теме
Собрал логи ТЖ с настройкой
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<dump create="false"/>
<log location="f:\logs_duration" history="168">
<event>
<ne property="name" value=""/>
</event>
<property name="all"/>
</log>
</config>

Процесс загрузки логов завершился, но в таблице в SQL ничего не появилось.
Платформа 1С:Предприятие 8.3 (8.3.10.2650)
19. uncle_Vasya 17.09.21 14:44 Сейчас в теме
Здравствуйте!
Купил эту штуку, она вываливается с ошибкой: см. вложение. Если автор публикации отзовётся, могу предоставить расширенные данные сигнатуры ошибки.
При этом, уже после вывода сообщения о крэше, утилитка продолжает что-то там, якобы, писать в СУБД (атака мертвецов, хехе), но SQL-таблица остаётся пустая. Вряд ли это может быть ошибкой манипуляции с SQL-сервером, ведь таблицу "logs" утилита создаёт вообще на ура.

Может быть, мне требуется какую-то из dll-ек прописать в службы компонентов или по-другому как-то обозначить для ОС её безопасность?
Наш админ, достаточно квалифицированный, пожимает плечами только.
Прикрепленные файлы:
Для отправки сообщения требуется регистрация/авторизация