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