Мультибазовая очистка Журнала регистрации с автоматическим перемещением архивных данных в указанный каталог

Публикация № 1173966

Администрирование - Администрирование данных 1С - Журнал регистрации

На сервере 1С со временем увеличивается в размерах папка , содержащая журналы регистрации 1С и как следствие может возникнуть проблема свободного пространства на системном жестком диске. Чтобы избежать роста папки, необходимо периодически очищать журнал регистрации 1С.

В конфигураторе 1с в меню «Администрирование/Настройка журнала регистрации» есть возможность очистки журнала, но когда Вы обслуживаете несколько баз, бывает удобно запустить обработку на ночь , чтобы к началу рабочего дня журналы регистрации обслуживаемых баз были почищены.
Предлагаю к рассмотрению многобазовую внешнюю обработку ОчисткаЖурналаРегистрации, которая используется на практике.
Форма обработки выглядит так:

 

Как мы видим, в нашем распоряжении имеется три кнопки и две строки ввода, рассмотрим их.

Нажимаем на кнопку "Выбрать Базы для обработки", на закладке "Список баз" появится таблица, в которой будут отображены колонки База данных, Отметка выбора, Отметка рабочей базы.

В колонке База данных находятся названия всех баз данных обслуживаемого предприятия. 

В колонке Отметка выбора Вам надо поставить галочки напротив тех баз , которые Вы планируете чистить.

Колонка Отметка рабочей базы вспомогательная, в ней для удобства указаны рабочие базы (необходимо поставить соответствующий маркер в описании базы).

Также необходимо заполнить две строки ввода :
"Папка для сохранения информации" удобнее, если эта строка будет заполняться из списка значений , 
"Число, на которое сократить Журнал" заполняется из календаря.

При нажатии на кнопку "Сократить журнал" начнется процесс сокращения Журнала регистрации.

Кнопка "Инструкция" выдаст    инструкцию по эксплуатации обработки.
    
Перейдем непосредственно к коду обработки, я буду давать фрагменты кода с кратким описанием, для программиста, который изучал данную проблему этого описания будет достаточно. 

1. Процедура ЗаполнитьДанныеДляСокращения(Команда)
        Эта процедура вызывает поочередно две процедуры ОчиститьСообщения() и СоздатьСписокБаз().
        
    Код процедуры:

	&НаКлиенте
	Процедура ЗаполнитьДанныеДляСокращения(Команда)

		ОчиститьСообщения();
		СоздатьСписокБаз();

	КонецПроцедуры

2. Процедура ИнструкцияПоЭксплуатации(Команда)
        Кнопка "Инструкция" выводит текстовый файл инструкция по эксплуатации.
        
    Код процедуры:

 

	&НаКлиенте
	Процедура ИнструкцияПоЭксплуатации(Команда)
	
			Инструкция="          Инструкция пользовачеля по очистке Журнала регистрации."+Символы.ПС+" 
					|1. Необходимо обязательно выбрать число по которое будет сокращен журнал и записать каталог в который будет выгружена информация."+Символы.ПС+" 
					|2. Выбираем базы необходимые для обработки, для этого нажимаем кнопку ""ВыбратьБазыДляОбработки"". Из выпавшего списка галочками отмечаем необходимые базы."+Символы.ПС+" 
					|3. Нажимаем кнопку ""СократитьЖурнал""."+Символы.ПС+" 
					|4. Просмотреть копию обрезанного журнала регистрации можно в заранее оговоренной папке.  Для этого зайдем в Конфигуратор , Файл - Поисковик - Открыть.";

		Предупреждение(Инструкция);
	
	КонецПроцедуры

3. Процедура СканированиеПоСпискуБаз(Команда)    
        В процедуре отрабатывают три защиты: 
            1. Заполнен ли путь к Папке для сохранения информации, без него программа не работает.
            2. Выбрана ли дата на которую необходимо сократить Журнал , без этого программа не работает.
            3. Выбраны ли базы данных для обработки , без них программа не работает.
        Перед выбором обрабатываемых баз вызывается процедура СоздатьМассивСписокБаз(МассивСписокБаз,СчетчикМассива) она создает список выбранных баз в массиве МассивСписокБаз и 
        заполняет переменную СчетчикМассива (для Градусника).
        Если с заполнением параметров все нормально вызывается процедура СканированиеПоСпискуБаз1(МассивСписокБаз,СчетчикМассива) 
        с предварительно созданными параметрами.
   КонецПроцедуры        
    
    Код процедуры:

	&НаКлиенте
	Процедура СканированиеПоСпискуБаз(Команда)
	
		ОчиститьСообщения();
		Если ПутьКПапке="" Тогда
			Сообщить("Заполните путь к Папке для сохранения информации, без него программа не работает");
			Сообщить("Обработка закончена");
			Возврат;
		КонецЕсли;	
		Если ЧислоСокращения=Дата("01.01.0001 0:00:00") Тогда
			Сообщить("Выберите Число на которое сократить Журнал , без него программа не работает");
			Сообщить("Обработка закончена");
			Возврат;
		КонецЕсли;
	
		МассивСписокБаз = Новый Массив;
		СчетчикМассива=0;
		СоздатьМассивСписокБаз(МассивСписокБаз,СчетчикМассива);
		Если СчетчикМассива=0 Тогда
			Сообщить("Выберите базы данных для обработки , без них программа не работает");
			Сообщить("Обработка закончена");
			Возврат;
		КонецЕсли;

		СканированиеПоСпискуБаз1(МассивСписокБаз,СчетчикМассива);

	КонецПроцедуры
	

4. Процедура СканированиеПоСпискуБаз1(МассивСписокБаз,СчетчикМассива)
        В этой процедуре происходит отработка Градусника и сканирование по МассивСписокБаз при этом в цикле вызывается процедура 
        СокращениеЖурналаРегистрации(НазваниеБазы) которая сокращает журнал регистрации очередной базы.
        
    Код процедуры:
  

&НаКлиенте
Процедура СканированиеПоСпискуБаз1(МассивСписокБаз,СчетчикМассива)

	НазваниеБазы="";
	Градусник=Цел(100/(СчетчикМассива+1));                                                         //Высчитываем единицу на градуснике
	ГрадусникДвижение=Градусник;
	Состояние("Подождите пожалуйста, идет обработка базы по заявке ",ГрадусникДвижение);
	Для Каждого ЭлементМассива Из МассивСписокБаз Цикл
			НазваниеБазы=ЭлементМассива;
			СокращениеЖурналаРегистрации(НазваниеБазы);
		    ГрадусникДвижение=ГрадусникДвижение+Градусник;
						
	Состояние("Подождите пожалуйста, идет обработка базы по заявке ",ГрадусникДвижение);

	КонецЦикла;

			Сообщить("Сокращение Журнала Регистрации закончено");

КонецПроцедуры

 5. Процедура СокращениеЖурналаРегистрации(НазваниеБазы)    
        Эта процедура готовит предварительные параметры необходимые для создания COM соединения вызова функции очистки журнала и переноса архивного файла в указанный каталог.
        Для создания строки подключения необходимы параметры:  Сервер, БазаДанных, ПользовательБазы, Пароль.
        Пользователь: желательно создать в конфигураторе технического пользователя например "multiuser" с паролем "********" и правами: 
        -Администрирование, 
        -Запуск внешнего соединения, 
        -Использование дополнительных отчетов и обработок. 
        Далее создаем каталог выгрузки по указанному адресу в реквизите ПутьКПапке, проверяем есть такой каталог или нет, далее саздаем имя файла выгрузки.
        Через COM соединение вызоваем функции очистки журнала регистрации и переноса архивного файла в указанный каталог.
        
    Код процедуры:
 

&НаСервере
Процедура СокращениеЖурналаРегистрации(НазваниеБазы)
					
	        Сообщить("Начата обработка базы "+НазваниеБазы);
			
//Используются встроенные функции и процедуры которые чистят и копируют Журнал регистрации по дате. 
//Вычищается дата на одну меньше выбранной , архивный файл помещается в каталог выгрузки, выбранный ранее.

			Сервер=СерверПолучить();
			БазаДанных=НазваниеБазы;
			ПользовательБазы = "multiuser";
			Пароль = "********";
			
//Заполняем строку подключения*************************************************************************
				
	СтрокаПодключения =  "srvr='" + СокрЛП(Сервер)+ "'; ref='" + СокрЛП(БазаДанных)+ "'; usr='" + СокрЛП(ПользовательБазы)+ "'; pwd='" + СокрЛП(Пароль) + "';";

                V83COMConnector= Новый COMОбъект("V83.COMConnector");                        //Создаем Новый COMОбъект
			Попытка	
				COMСоединение = V83COMConnector.Connect(СтрокаПодключения);                  //Получаем COMСоединение
			  Исключение
    			Сообщить("Проблемы при подключении: " + ОписаниеОшибки());
    			Возврат;
			КонецПопытки;	

//Формируем имя каталога выгрузки и файла выгрузки База+Дата в нужном виде ****************************
	КаталогВыгрузки =ПутьКПапке+"\";                                                         //Устанавливается в каждом случае
	
	КаталогНаДиске = Новый Файл(КаталогВыгрузки);                                            //На сервере создаем каталог выгрузки
	Если КаталогНаДиске.Существует() Тогда                                                   //ПРОВЕРЯЕМ СУЩЕСТВУЕТ ОН ИЛИ НЕТ
		    Сообщить("Каталог выгрузки :"+КаталогВыгрузки);
    	Иначе
        	СоздатьКаталог(КаталогВыгрузки);                                                 //Если нет создаем новый каталог
			Сообщить("Каталог выгрузки :"+КаталогВыгрузки);
    КонецЕсли;
	
	
//Создаем имя файла выгрузки состоящее из преобразованного имени этой базы и преобразовыванной даты	
    ИмяЭтойБазы=СтрокаСоединенияИнформационнойБазы();
	ИмяЭтойБазы=Сред(ИмяЭтойБазы,(Найти(ИмяЭтойБазы,"R")+5),(СтрДлина(ИмяЭтойБазы)-Найти(ИмяЭтойБазы,"R")-6));

	Дата=ТекущаяДата();
	НазваниеФайла=БазаДанных+Лев(ЧислоСокращения,10);
	ДлинаНазвания=СтрДлина(НазваниеФайла);
	НазваниеФайла1="";
	Буква="";
	СчетчикБукв=1;
	Пока СчетчикБукв <= ДлинаНазвания Цикл                                                 //Из названия файла убираем все знаки препинания заменяем их на_
			Буква=Сред(НазваниеФайла,СчетчикБукв,1);
		Если Буква=" " ИЛИ Буква=":" ИЛИ Буква="." Тогда
				НазваниеФайла1=НазваниеФайла1+"_";
			Иначе
			    НазваниеФайла1=НазваниеФайла1+Буква;
	    КонецЕсли;
	    СчетчикБукв=СчетчикБукв+1;
	КонецЦикла;
	НазваниеФайла1=НазваниеФайла1+".lgd";                                                   //Добавляем расширение
	ИмяФайлаКопииЖурнала=КаталогВыгрузки+НазваниеФайла1;
	
//Задаем параметры для функций очистки журнала регистрации	
    Фильтр = Новый Структура("ДатаОкончания");                                              //Фильтр по дате
    Фильтр.ДатаОкончания = ЧислоСокращения;                                                 //Помещаем дату в фильтр
	
	БезопасныйРежим=Ложь;
	
	Если ВРег(ИмяЭтойБазы)=ВРег(БазаДанных) Тогда	
			//Для этой базы
			
			Попытка	
				СкопироватьЖурналРегистрации(,ИмяФайлаКопииЖурнала, Фильтр);                 //Копируем Журнал регистрации
			  Исключение
    			Сообщить("Проблемы при Копировании: " + ОписаниеОшибки());
				Возврат;
			КонецПопытки;		
			Попытка	
				ОчиститьЖурналРегистрации(Фильтр);                                          //Вычищаем Журнал регистрации
			  Исключение
    			Сообщить("Проблемы при Очистке: " + ОписаниеОшибки());
				Возврат;
			КонецПопытки;		
		Иначе
			//Для другой базы
			
//Метод запуска встроенной обработки "ПроцедураОчисткиЖурналаРегистрации" из справочника "Дополнительные обработки и отчеты" через COMСоединение
//1. Получаем двоичный код обработки.
	ИмяОбъекта="ПроцедураОчисткиЖурналаРегистрации";
    ДвоичныеДанныеОбработки =COMСоединение.Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяОбъекта).ХранилищеОбработки.Получить();
//2. Помещаем его во временное хранилище.
	АдресВоВременномХранилище = COMСоединение.ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки);                    
//3. Получаем адрес обработки во временном хранилище.	
	АдресОбработки = COMСоединение.ВнешниеОбработки.Подключить(АдресВоВременномХранилище,, БезопасныйРежим);
//4. Создаем обработку.
	Обработка = COMСоединение.ВнешниеОбработки.Создать(АдресОбработки, Ложь); 
//5. Запускаем обработку.
	Обработка.ОчисткаЖурналаРегистрации(ИмяФайлаКопииЖурнала, ЧислоСокращения);	   
	
	КонецЕсли;
			
			Сообщить("Закончена обработка базы "+НазваниеБазы);
			
КонецПроцедуры

6. В каждой конфигурации в справочнике "Дополнительные отчеты и обработки" должна быть установлена обработка с экспортной пороцедурой в мобуле объекта
ФункцияОчисткиЖурналаРегистрации
        
    Код процедуры:
    

Процедура ОчисткаЖурналаРегистрации(ИмяФайлаКопииЖурнала, ЧислоСокращения) Экспорт
	    Фильтр = Новый Структура("ДатаОкончания");                                      //Фильтр по дате
    	Фильтр.ДатаОкончания = ЧислоСокращения;                                         //Помещаем дату в фильтр

			Попытка	
				СкопироватьЖурналРегистрации(,ИмяФайлаКопииЖурнала, Фильтр);            //Копируем Журнал регистрации
			  Исключение
    			Сообщить("Проблемы при Копировании: " + ОписаниеОшибки());
				Возврат;
			КонецПопытки;		
			Попытка	
				ОчиститьЖурналРегистрации(Фильтр);                                      //Вычищаем Журнал регистрации
			  Исключение
    			Сообщить("Проблемы при Очистке: " + ОписаниеОшибки());
				Возврат;
			КонецПопытки;		


КонецПроцедуры

Вспомогательные Прцедуры и функции:    
-----------------------------------    
7. Процедура СписокВыбораПутьКАрхиву()
        Содержит варианты выбора пути к архиву, можно сделать просто окно ввода, но во избежание ошибок лучше заводить варианты программно.

    Код процедуры:
 

&НаКлиенте
Процедура СписокВыбораПутьКАрхиву()
     Список1= " ";		 
	 Элементы.ПутьКПапке.СписокВыбора.Очистить();
	 Список1= "\\172.20.105.201\nas\Backup_1c_logs";                      //Для 1 предприятия
	 Элементы.ПутьКПапке.СписокВыбора.Добавить(Список1);
	 Список1= "\\172.20.107.201\nas\Backup_1c_logs";                      //Для 2 предприятия
	 Элементы.ПутьКПапке.СписокВыбора.Добавить(Список1);
	 Список1= "\\172.20.109.201\nas\Backup_1c_logs";                      //Для 3 предприятия
	 Элементы.ПутьКПапке.СписокВыбора.Добавить(Список1);
	 Список1= "\\172.20.115.201\nas\Backup_1c_logs";                      //Для 4 предприятия
	 Элементы.ПутьКПапке.СписокВыбора.Добавить(Список1);
	 Список1= "\\172.20.106.201\nas\Backup_1c_logs";                      //Для 5 предприятия
	 Элементы.ПутьКПапке.СписокВыбора.Добавить(Список1);
//Выводим в поле ввода вероятное значение	 
	 Действие = Элементы.ПутьКПапке.СписокВыбора.Получить(0).Значение;
	 
 КонецПроцедуры	
	

8. Процедура СоздатьСписокБаз()
        Создает список всех баз для выбора, для визуального облегчения выбора можно занести "РабочаяБаза", тогда в списке рабочие базы будут помечены этим словом.
        
    Код процедуры:
 

&НаСервере
Процедура СоздатьСписокБаз()
//Процедура создает список баз и выставляет галочки у рабочих баз*************************************	
СписокБаз.Очистить();                                                         //Очищаем таблицу БазыСервера
Сервер=СерверПолучить();                                                      //Через функцию СерверПолучить() получаем адрес сервера
///////	
    Попытка
        COMСоединитель = Новый COMОбъект("V83.COMConnector");                 //V83.COMConnector создаем объект для подсоединения
      Исключение
		Сообщить("Ошибка создания "+ОписаниеОшибки());
		Возврат;
    КонецПопытки;
	
    Попытка	
        СоединениеСАгентом  = COMСоединитель.ConnectAgent("tcp://"+Сервер);   //Создаем соединение с агентом
	  Исключение	
		Если СтрНайти(Сервер, ":") > 1 Тогда
			Сообщить(" Проверьте номер порта. " + ОписаниеОшибки());
			Сообщить("Хост+Порт "+Сервер);
		  Иначе	
			Сообщить("Ошибка создания агента сервера. " + ОписаниеОшибки());
		КонецЕсли;	
		Возврат;
	КонецПопытки;
	
    КластерыСерверов = СоединениеСАгентом.GetClusters().Выгрузить();         //Выгружаем кластеры серверов
	СоединениеСАгентом.Authenticate(КластерыСерверов[0], "", "");
	Если КластерыСерверов.Количество() > 0 Тогда                             //Если кластеры серверов существуют то выгружаем базы
         Базы = СоединениеСАгентом.GetInfoBases(КластерыСерверов[0]).Выгрузить();
	 КонецЕсли;
	 
	КОМИмяБазы=""; 
	Индекс = Базы.ВГраница();
	ИндексМассива=0;
	Пока Индекс >= 0 Цикл 
		 КОМИмяБазы=Базы[ИндексМассива];
		
		 	СтрСписокБаз=СписокБаз.Добавить();
		 	СтрСписокБаз.БазаДанных = КОМИмяБазы.Name;
		 Если КОМИмяБазы.Descr="БазаРНГ" Тогда
		    	СтрСписокБаз.ОтметкаРабочейБазы ="Рабочая база";
			Иначе
				СтрСписокБаз.ОтметкаРабочейБазы ="";
		 КонецЕсли;	
		 ИндексМассива=ИндексМассива+1;
         Индекс = Индекс - 1;  
	 КонецЦикла;

 КонецПроцедуры
 

9. Функция СерверПолучить()
        Адрес сервера.

    Код процедуры:

&НаСервере
Функция СерверПолучить()
	ИБ			= СтрокаСоединенияИнформационнойБазы();
	П1 			= Сред(ИБ, 7, 32);
	СерверПорт 	= Лев(П1, СтрНайти(П1, "Ref")-3);
	СерверБазы= СерверПорт;
	
	ДвоеточиеПоложение = СтрНайти(СерверПорт, ":");
	Если ДвоеточиеПоложение=0 Тогда
		Сервер = СерверПорт;
	Иначе
		Сервер = Лев(СерверПорт, ДвоеточиеПоложение-1)+":"+СтрЗаменить((Число(Сред(СерверПорт, ДвоеточиеПоложение+1, 4)) -1), Символы.НПП, "");
	КонецЕсли;	
	Сервер = Сервер;	
	Возврат Сервер;
	
КонецФункции

10. Функция ПолучитьПользователя()
        Получаем имя пльзователя.

    Код процедуры:
 

Функция ПолучитьПользователя()
	Возврат (ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
КонецФункции

11. Процедура СоздатьМассивСписокБаз(МассивСписокБаз,СчетчикМассива)        

    Код процедуры:
 

&НаСервере
Процедура СоздатьМассивСписокБаз(МассивСписокБаз,СчетчикМассива)

	ТЗ1  = РеквизитФормыВЗначение("СписокБаз",Тип("ТаблицаЗначений"));
	
	Для Каждого Строка Из ТЗ1 Цикл
		Если  Строка.ОтметкаВыбора=Истина Тогда
			МассивСписокБаз.Добавить(Строка.БазаДанных);
	    	СчетчикМассива=СчетчикМассива+1;
	    КонецЕсли;
	КонецЦикла;
КонецПроцедуры

После сокращения журнала регистрации размер файла журнала регистрации не изменяется. Чтобы он изменился, необходимо остановить агент сервера и выполнить команду vacuum. Затем запустить службу агента сервера.    

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

Наименование Файл Версия Размер
Мультибазовая очистка Журнала регистрации с автоматически перемещением архивных данных в указанный каталог:

.rar 13,89Kb
5
.rar 13,89Kb 5 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Балабас 164 26.12.19 13:06 Сейчас в теме
Забыл саму обработку "для ленивых" прикрутить.
2. bryantsev.yury 31 26.12.19 15:20 Сейчас в теме
3. German_Tagil 26 27.12.19 05:54 Сейчас в теме
И где ? Мда самое интересное и не увидел .....
Оставьте свое сообщение

См. также

Повышение качества разработок и онлайн контроль ошибок Промо

Журнал регистрации v8 Абонемент ($m)

Анализ ошибок и сбор ошибок журнала регистраций из десятков и сотен баз в одном месте.

09.03.2018    26919    DitriX    48    

Как отправить ошибки из журнала регистрации на почту?

Журнал регистрации v8 УПП1 Абонемент ($m)

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

1 стартмани

06.02.2019    9191    wowik    0    

Мониторинг журнала регистрации при помощи Powershell

Сервисные утилиты Журнал регистрации v8 Абонемент ($m)

Работа с журналом регистрации в формате SQLite внешними средствами на примере мониторинга изменений в конфигурации базы данных.

1 стартмани

12.07.2018    13103    user768334    7    

Журнал регистрации 1С (sql lite) в web app

Журнал регистрации v8 1cv8.cf Абонемент ($m)

Данная публикация рассматривает построение компонентного решения работы журнала регистрации в стороннем приложении(web app). Встала задача миграции sql lite жр во внешнюю базу. Данное решение было создано: 1. для хранения жр за весь период 2. для ускорения работы с жр 3. для ускорения сервера предприятия, так как именно он (а точнее рагент) пытается записать данные в жр sql lite(фактически файл на диске), после увеличения размера файла более 10 гб, поступали жалобы по вопросу быстродействия 1с (и не только ради этого) Данная публикация может быть полезной администраторам, программистам, оптимизаторам.

1 стартмани

09.07.2018    9763    dmarenin    8    

Перенос журналов регистрации при изменении сервера приложения 1С (клиент-серверный вариант)

Журнал регистрации v8 1cv8.cf Россия Абонемент ($m)

Описание расположения журналов регистрации информационных баз 1С при клиент-серверном варианте работы с 1С:Предприятие 8. Пример переноса журналов регистрации информационной базы 1С с платформы 1С:8.2 на платформу 1С:8.3

15.08.2017    23899    OlegAl    2