Skip to content

alm494/norm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

norm

Что делает эта утилита

  • Перезаписывает файлы технологического журнала 1С: Предприятие в измененном формате;
  • Событие ТЖ целиком укладывает в одну строку, байты CRLF ставятся только в конце события;
  • Тексты всех полей Sql, Context, Txt и т.д. (всего на данный момент 11 полей) строго и безусловно заключаются в двойные кавычки. Полный список обрабатываемых полей можно получить, запустив утилиту без аргументов;
  • Внутри текстов удаляются все переводы строк (CR, LF) и табы. Двойные кавычки и дважды двойные экранирующие внутри текста превращаются в одинарные. Благодаря этому и предыдущему пункту вы сможете значительно упростить регулярные выражения и ускорить их обработку для надежного извлечения полного текста события;
  • Из имен временных таблиц в запросах SQL удаляются числа - это может понадобится для группировки по тексту для поиска долгих запросов.

Важные особенности

  • утилита написана для GNU/Linux, но работает и в WSL (тестировалась под WSL Ubuntu);
  • предназначена для обработки больших объемов ТЖ (сотни ГБ, возможно терабайты), поэтому переписывает существующие файлы с сохранением их размера и места; дополнительное место на диске не требуется (при отключении CoW);
  • написана c использованием многопоточной обработки на C, без сторонних библиотек и регулярных выражений, поэтому теоретически выигрывает по скорости у bash-скриптов написанных с использованием perl и grep, но на практике космических скоростей конечно не будет: бутылочным горлышком станет скорость ваших дисков. 100% загрузку CPU вы вряд ли увидите, механические HDD и вовсе уравняют любые методы обработки;
  • не имеет значения, обрабатываете ли вы один большой файл или множество мелких - утилита разбивает весь объём на порции данных, по умолчанию 50 МБ, но можно задать свой размер.
  • ввиду необходимости сохранения размера файлов при многопоточной обработке и в связи с возможным отсутствием каких-либо кавычек в исходном ТЖ утилита производит сокращение наименований полей на 2 символа, например Sql= превращается в S=. Возможная недостача размера компенсируется с помощью дополнительных запятых после поля. Полный список полей и их новое сокращенное наименование можно получить, запустив утилиту без аргументов.

Как скомпилировать

Настройте Makefile для применения правильных флагов компиляции для целевой машины

make prod

Использование и параметры командной строки

Использование: norm -i <строка> [-r] [-j <число>] [-b <число>]

Параметры:
   -i 'rphost_8508'    Искать файлы ТЖ в указанной папке. Обязательный параметр.
   -r                  Искать файлы ТЖ рекурсивно.
   -j 4                Обработка в 4 потока, по умолчанию используются все
                       доступные ядра.
   -b 200              Размер порции данных для обработки в Mб, по умолчанию 50

Демонcтрация ТЖ: было/стало

Было

04:20.981000-3937787,DBMSSQL,5,Usr=UPE37895,Sql='INSERT INTO #tt68 WITH(TABLOCK) (_Q_001_F_000TRef, _Q_001_F_000RRef, _Q_001_F_001RRef, _Q_001_F_002RRef, _Q_001_F_003RRef, _Q_001_F_004RRef) SELECT DISTINCT
T2._RecorderTRef,
T2._RecorderRRef,
T2._Fld47751RRef,
T2._Fld47748RRef,
T2._Fld47749RRef,
T2._Fld47750RRef
FROM #tt45 T1 WITH(NOLOCK)
LEFT OUTER JOIN dbo._AccumRg47747 T2
ON ((T2._Fld47751RRef = T1._Q_001_F_000RRef) AND (T2._Fld47748RRef = T1._Q_001_F_001RRef) AND (T2._Fld47749RRef = T1._Q_001_F_002RRef) AND (T2._Fld47750RRef = T1._Q_001_F_003RRef)) AND (T2._Fld2451 = ?)
WHERE T2._Active = 0x01 AND (T2._Fld47752 > ?) AND (T2._RecordKind = ?)
p_0: 0N
p_1: 0N
p_2: 0N
',Context='
ОбщийМодуль.ДлительныеОперации.Модуль : 1052 : ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
	ОбщийМодуль.ДлительныеОперации.Модуль : 1062 : ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
		ОбщийМодуль.ОбщегоНазначения.Модуль : 5176 : Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
			 : 1 : Документы.ЭтапПроизводства2_2.ОбеспечитьПотребностиПроизводстваВПродукцииИПолуфабрикатах(Параметры[0],Параметры[1])
				Документ.ЭтапПроизводства2_2.МодульМенеджера : 2165 : Результат = ОбеспечитьПотребностиПроизводстваВнутриЗамераВремени(Параметры);
					Документ.ЭтапПроизводства2_2.МодульМенеджера : 15815 : СформироватьЭтапыПоПотребностямПроизводства(
						Документ.ЭтапПроизводства2_2.МодульМенеджера : 15909 : СформироватьЭтапы(РезультатРазузлования, ВариантыОбеспечения, РезультатФормирования);
							Документ.ЭтапПроизводства2_2.МодульМенеджера : 15973 : ЗаполнитьОбеспечениеИОтразитьДвиженияПоЭтапам(
								Документ.ЭтапПроизводства2_2.МодульМенеджера : 13292 : ПолучитьДанныеИСформироватьДвиженияВПакетномРежиме(
									Документ.ЭтапПроизводства2_2.МодульМенеджера : 13585 : СформироватьДвиженияВПакетномРежиме(Запрос, ПорядокРегистров, ПартияОбработки, ЭтапыПонизитьСтатус, НеНовыеЭтапы, РассчитыватьИзменения);
										Документ.ЭтапПроизводства2_2.МодульМенеджера : 13786 : ПроведениеСерверУТ.ЗаписатьНаборыЗаписей(ДокументОбъект);
											ОбщийМодуль.ПроведениеСерверУТ.Модуль : 433 : Объект.Движения.Записать();
												РегистрНакопления.ОбеспечениеЗаказов.МодульНабораЗаписей : 102 : ДополнитьМассивЗаказовДляРасчетаСостояний(ДополнительныеСвойства);
													РегистрНакопления.ОбеспечениеЗаказов.МодульНабораЗаписей : 306 : МассивЗаказов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Заказ");'

Стало

04:20.981000-3937787,DBMSSQL,5,Usr=UPE37895,S="INSERT INTO #tt WITH(TABLOCK) (_Q_001_F_000TRef, _Q_001_F_000RRef, _Q_001_F_001RRef, _Q_001_F_002RRef, _Q_001_F_003RRef, _Q_001_F_004RRef) SELECT DISTINCT T2._RecorderTRef, T2._RecorderRRef, T2._Fld47751RRef, T2._Fld47748RRef, T2._Fld47749RRef, T2._Fld47750RRef FROM #tt T1 WITH(NOLOCK) LEFT OUTER JOIN dbo._AccumRg47747 T2 ON ((T2._Fld47751RRef = T1._Q_001_F_000RRef) AND (T2._Fld47748RRef = T1._Q_001_F_001RRef) AND (T2._Fld47749RRef = T1._Q_001_F_002RRef) AND (T2._Fld47750RRef = T1._Q_001_F_003RRef)) AND (T2._Fld2451 = ?) WHERE T2._Active = 0x01 AND (T2._Fld47752 > ?) AND (T2._RecordKind = ?) p_0: 0N p_1: 0N p_2: 0N ",,,,,,,Cntxt="  ОбщийМодуль.ДлительныеОперации.Модуль : 1052 : ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);   ОбщийМодуль.ДлительныеОперации.Модуль : 1062 : ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);    ОбщийМодуль.ОбщегоНазначения.Модуль : 5176 : Выполнить ИмяМетода + '(' + ПараметрыСтрока + ')';      : 1 : Документы.ЭтапПроизводства2_2.ОбеспечитьПотребностиПроизводстваВПродукцииИПолуфабрикатах(Параметры[0],Параметры[1])      Документ.ЭтапПроизводства2_2.МодульМенеджера : 2165 : Результат = ОбеспечитьПотребностиПроизводстваВнутриЗамераВремени(Параметры);       Документ.ЭтапПроизводства2_2.МодульМенеджера : 15815 : СформироватьЭтапыПоПотребностямПроизводства(        Документ.ЭтапПроизводства2_2.МодульМенеджера : 15909 : СформироватьЭтапы(РезультатРазузлования, ВариантыОбеспечения, РезультатФормирования);         Документ.ЭтапПроизводства2_2.МодульМенеджера : 15973 : ЗаполнитьОбеспечениеИОтразитьДвиженияПоЭтапам(          Документ.ЭтапПроизводства2_2.МодульМенеджера : 13292 : ПолучитьДанныеИСформироватьДвиженияВПакетномРежиме(           Документ.ЭтапПроизводства2_2.МодульМенеджера : 13585 : СформироватьДвиженияВПакетномРежиме(Запрос, ПорядокРегистров, ПартияОбработки, ЭтапыПонизитьСтатус, НеНовыеЭтапы, РассчитыватьИзменения);            Документ.ЭтапПроизводства2_2.МодульМенеджера : 13786 : ПроведениеСерверУТ.ЗаписатьНаборыЗаписей(ДокументОбъект);             ОбщийМодуль.ПроведениеСерверУТ.Модуль : 433 : Объект.Движения.Записать();              РегистрНакопления.ОбеспечениеЗаказов.МодульНабораЗаписей : 102 : ДополнитьМассивЗаказовДляРасчетаСостояний(ДополнительныеСвойства);               РегистрНакопления.ОбеспечениеЗаказов.МодульНабораЗаписей : 306 : МассивЗаказов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку('Заказ');",,

About

Нормализатор технологического журнала 1С

Topics

Resources

License

Stars

Watchers

Forks