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

09.01.20

База данных - Журнал регистрации

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Мультибазовая очистка Журнала регистрации с автоматически перемещением архивных данных в указанный каталог:
.rar 13,89Kb
19
19 Скачать (1 SM) Купить за 1 850 руб.

В конфигураторе 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. Затем запустить службу агента сервера.    

См. также

Журнал регистрации Мониторинг Системный администратор Программист Бизнес-аналитик Руководитель проекта Платформа 1С v8.3 Платные (руб)

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

9000 руб.

28.08.2019    33922    22    21    

74

Журнал регистрации Системный администратор Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Конфигурация LogiCH эффективно решает проблему хранения и анализа записей журналов регистрации. Разработка использует столбцовую СУБД ClickHouse, одну из самых быстрых Big Data OLAP СУБД. Любой анализ журнала можно выполнить в одном отчете, в котором доступны все возможности СКД с учетом ограничений RLS. Количество подключаемых баз не ограничено и не влияет на скорость построения анализа.

5000 руб.

28.11.2018    20728    16    6    

41

Журнал регистрации Программист Россия Бесплатно (free)

В материале рассматривается сравнение двух инструментов для работы с журналом регистрации 1С: утилиты ibcmd и платформы Vector. Описаны их функциональные возможности, тестирование производительности и практическое применение для преобразования логов в формат JSON.

вчера в 15:30    487    user1913000    7    

14

Журнал регистрации Тестирование QA Программист Бесплатно (free)

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

21.10.2024    2778    leemuar    8    

22

Инструменты администратора БД Журнал регистрации Системный администратор Платформа 1С v8.3 1С:Управление торговлей 11 Абонемент ($m)

Внешняя обработка для регламентного сокращения журнала регистрации для конфигураций на базе БСП и платформы 8.3.20+

1 стартмани

29.12.2023    2154    31    dima_gsv    3    

13

Журнал регистрации Мониторинг Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

19.11.2023    1433    5    AlexSTAL    0    

8

Мониторинг Журнал регистрации Технологический журнал Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

13.11.2023    4713    9    AlexSTAL    0    

47

Журнал регистрации Инструменты администратора БД Мониторинг Мессенджеры и боты Системный администратор Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Абонемент ($m)

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

3 стартмани

26.09.2023    2824    19    doom2good    16    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Vladimir-R 168 26.12.19 13:06 Сейчас в теме
Забыл саму обработку "для ленивых" прикрутить.
2. bryantsev.yury 38 26.12.19 15:20 Сейчас в теме
3. German_Tagil 43 27.12.19 05:54 Сейчас в теме
И где ? Мда самое интересное и не увидел .....
4. Zwe3do4et 20.11.23 00:26 Сейчас в теме
5. bryantsev.yury 38 20.11.23 06:14 Сейчас в теме
(4) Должно подойти, попробуй на тестовой базе.
Оставьте свое сообщение