Сокращение журнала регистрации в 1С:Предприятие версии 8.3
Для многих тема данной статьи является «избитой», однако для меня при попытке вникнуть в суть изложенной ниже проблемы нашлось много нюансов, которые я постараюсь раскрыть для заинтересованных. |
Как известно, работа с журналом регистрации в 1С:Предприятие версии 8.3 существенно отличается от того, что было в предыдущих версиях. А именно, по какой-то причине разработчики убрали возможность настройки автоматического разделения журнала по периодам, из-за чего хранящий данные записи файл может разрастаться до огромных размеров (в одной известной мне организации размер журнала регистрации достиг 150 гигабайт, из-за чего исчерпалось место на системном диске и существенно снизилась производительность работы с данной базой в кластере 1С).
В 1С:Предприятие версии 8.2 в режиме конфигуратора имелась возможность разделения файла журнала регистрации по периодам (пункт меню Администрирование -> Настройка журнала регистрации
):
И при такой настройке в папке данной базы в кластере 1С мы имели список усечённых файлов регистрации, которые мы могли перемещать и хранить в другом месте:
В режиме конфигуратора 1С:Предприятия версии 8.3 мы имеем возможность только ручного сокращения журнала регистрации по определённую дату с сохранением удаляемых записей в обозначенный нами файл. Согласитесь – это не слишком удобно:
В интернете находится много решений, чтобы автоматизировать этот процесс. Я остановился на способе с применением внешних обработок (изложенный в статье по ссылке, указанной в самом конце моей заметки):
Нам предлагалось воспользоваться внешними обработками:
- РаботаСЖурналомРегистрации83.epf — позволяющей из программы 1С сокращать журнал до даты, копировать его в указанное место и восстанавливать из файла;
- СократитьЖурналРегистрацииПериод.epf — позволяющей автоматически из командной строки обрезать файл журнала регистрации до указанного периода (День / Неделя / Месяц / Год).
Но, как оказалось, те внешние обработки имели существенный недостаток. При попытке загрузить, например, обработку РаботаСЖурналомРегистрации83.epf
в базу 1С:Предприятие версии 8.3 появлялась следующая ошибка:
Обработка не подключена Невозможно подключить дополнительную обработку из файла. Возможно, она не подходит для этой версии программы.
При нажатии на кнопку Подробнее...
:
Обработка не подключена Невозможно подключить дополнительную обработку из файла. Возможно, она не подходит для этой версии программы. Техническая информация: Метод объекта не обнаружен (СведенияОВнешнейОбработке)
Как оказалось в той внешней обработке не была обозначена функция СведенияОВнешнейОбработке
. Сам я не являюсь программистом 1С, но мне удалось добиться, чтобы эта обработка установилась и выполняла своё предназначение.
Предлагаю вам скачать исправленные внешние обработки:
- РаботаСЖурналомРегистрации83.epf — скачайть (размер – 8.45 кб; формат – epf);
- СократитьЖурналРегистрацииПериод.epf — скачать (размер – 7.34 кб; формат – epf).
Для исправления ошибок первоначальных файлов внешних обработок необходимо было в режиме конфигуратора открыть их (пункт меню Файл -> Открыть
) и в модуле объекта (пункт меню Действия -> Открыть модуль объекта
):
Прописать недостающую функцию СведенияОВнешнейОбработке()
:
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = 'Работа с журналом регистрации 8.3'")); ПараметрыРегистрации.Вставить("Версия", "1.0"); ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); ПараметрыРегистрации.Вставить("Информация", НСтр("ru = 'Работа с журналом регистрации 8.3'")); ТаблицаКоманд = ПолучитьТаблицуКоманд(); ДобавитьКоманду(ТаблицаКоманд, НСтр("ru = 'Работа с журналом регистрации 8.3'"), "РаботаСЖурналомРегистрации83", "ОткрытиеФормы", Истина, ""); ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды; КонецФункции Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор; КонецПроцедуры
После сохранения данной внешней обработки, её следует подключить в необходимые базы. Делается это следующим образом. В режиме 1С:Предприятие, в меню Администрирование -> Печатные формы, отчеты и обработки
(в примере используется интерфейс «Такси»):
Проследите, чтобы была установлена галочка напротив Дополнительные отчеты и обработки
и загрузите нашу внешнюю обработку, нажав “Дополнительные отчеты и обработки”:
В открывшемся окне нажмите “Создать” и выберите необходимую внешнюю обработку:
После её загрузки настройте пункт меню, где она будет отображаться (я выбираю пункт “Администрирование”), и определите пользователей в колонке “Быстрый доступ”, которым будет разрешено запускать данную обработку:
Я сделал возможным доступ к данной внешней обработке пользователю “администратор”:
После выполнения данных настроек нажмите “Записать и закрыть”:
Теперь, перейдите в пункт меню, который вы обозначили (в примере – “Администрирование”, подменю “Поддержка и обслуживание -> Дополнительные обработки по администрированию”):
И запустите установленную внешнюю обработку:
В окне запущенной таким образом внешней обработки РаботаСЖурналомРегистрации83.epf
вы можете увидеть весь функционал по работе с журналом регистрации:
Для примера, я скопировал и сократил журнал регистрации одной из баз в файл backup.lgd:
Операция занимает некоторое время, зависящее от производительности сервера и от объёма обрабатываемой информации из файла регистрации. После завершения работы внешней обработки (внизу вы увидите соответствующее информационное сообщение):
В папке, которую вы указали в строке “Скопировать в файл” вы увидите скопированный журнал регистрации:
Проверяем, что реальный файл журнала регистрации обрезан. Идём в меню Администрирование -> Поддержка и обслуживание -> Журнал регистрации
и проконтролируем, что записей старше даты, по которую мы обрезали журнал регистрации, в нём не имеется:
Выше мы рассмотрели способ ручной обработки журнала регистрации 1С:Предприятие версии 8.3. Теперь изучим алгоритм автоматического сокращения журнала регистрации из командной строки.
В предыдущей версии данной статьи мной был описан довольно туманный способ с использованием внешней обработки СократитьЖурналРегистрацииПериод.epf
. Теперь приведу полностью рабочий алгоритм автоматического (по расписанию) выполнения сокращения журнала регистрации в 1с версии 8.3:
Предлагаю небольшой скрипт, написанный на PowerShell (взят отсюда):
#
# backup & shrink 1c logs
#
param (
[string]$1cexe = "C:\Program Files (x86)\1cv8\8.3.7.1860\bin\1cv8.exe",
[string]$1cbase = "server:port\basename",
[string]$1cuser = "user",
[string]$1cupassword = "passwd",
[string]$1coperlog = "E:\scripts\log\1cshrink.log",
[string]$1cdaysoflogstore = N
,
[string]$1clogsarchive = "E:\scripts\journal\",
[string]$1clogfilename = $env:COMPUTERNAME.ToLower() + "-1clog-" + ($1cbase.split("\"))[1] + "-" + (get-date).Date.ToString("yyyyMMdd") + ".elf"
)
$1clog = $1clogsarchive + $1clogfilename
cmd /c "`"`"$1cexe`" CONFIG `/s$1cbase `/N`"$1cuser`" `/P`"$1cupassword`" `/Out$1coperlog `/ReduceEventLogSize $((get-date).Date.AddDays(-$1cdaysoflogstore).ToString("yyyy-MM-dd")) -saveAs`"$1clog`"`""
где:
- C:\Program Files (x86)\1cv8\8.3.7.1860\bin\1cv8.exe — путь до необходимой вам версии 1с;
- server:port — сервер 1С и порт (если кластер работает на отличном от 1541);
- basename — имя базы данных;
- user — имя пользователя с полными правами на указанную базу;
- passwd — пароль указанного пользователя;
- E:\scripts\log\1cshrink.log — путь до файла лога выполняемой операции;
- N — количество дней, по которым необходимо оставить данные в журнале (неделя – 7);
- E:\scripts\journal\ — путь до обрезаемой и сохраняемой части файла регистрации в формате .elf;
- в переменную $1clogfilename — заносится автоматически формируемое имя файла для обрезаемой и сохраняемой части файла регистрации в формате .elf (его вид – computer-1clog-basename-date.elf);
- $1clog — путь и автоматически сформированное имя файла для обрезаемой и сохраняемой части файла регистрации в формате .elf;
- следующей командой производится непосредственно обрезание и сохранение части файла регистрации.
P.S. вы можете так же скачать данный скрипт (размер – 804 байта; формат – PS1) и, изменив его под свои нужды, использовать в своих целях.
Сохраните данный скрипт с необходимыми вам изменениями в файл с расширением .ps1
. Для того, чтобы у вас была возможность исполнять данные файлы-скрипты на сервере, проделайте от имени администратора следующее: Win+R -> powershell -> ввод
. В открывшемся окне наберите команду Set-ExecutionPolicy RemoteSigned
, подразумевающую, что теперь вы можете запускать локальные не подписанные скрипты PowerShell, и подтвердите своё намерение, напечатав Y
.
В результате отработки данного PowerShell скрипта в папке E:\scripts\journal\
вы получите файл с обрезанными данными из файла регистрации 1С вида computer-1clog-basename-date.elf
, в папке E:\scripts\log\
вы получите файл-лог 1cshrink.log
с результатами работы скрипта:
Сокращение журнала регистрации успешно завершено Сокращенные записи скопированы в файл E:\scripts\journal\computer-1clog-basename-20170215.elf
Создайте теперь cmd файл и поместите туда следующие строки:
@echo off powershell -file "E:\scripts\clearJR.ps1"
который осуществит вызов указанного скрипта (пропишите свои пути!). На основе данного cmd файла теперь можно создать задачу, которая будет выполняться в необходимое для вас время.
Как вы уже заметили, при сокращении журнала регистрации любым из описанных выше способов, высвобождающееся место не возвращается системе. Журнал регистрации хранится в файле 1Cv8.lgd и представляет собой базу данных формата sqlite. Чтобы уменьшить его размер, необходимо остановить службу агента соответствующего кластера, выполнить команду sqlite3 с ключом vacuum
, а затем снова запустить службу агента кластера 1С.
Sqlite3 можно скачать с официального сайта: www.sqlite.org. Вам необходим zip архивы из секции Precompiled Binaries for Windows:
- sqlite-dll-win32-x86-3170000.zip — 32-х битная библиотека, если вы планируете запускать sqlite3 на х86 windows платформе;
- sqlite-dll-win64-x64-3170000.zip — 64-х битная библиотека, если вы планируете запускать sqlite3 на х64 windows платформе;
- sqlite-tools-win32-x86-3170000.zip — непосредственно средство sqlite3 для командной строки.
Цифры 3170000 в названиях архивов будут меняться разработчиками. Эти – означают последнюю на момент написания статьи версию – 3.17.0.
Разархивируйте библиотеку необходимой вам разрядности и положите в одну папку вместе с файлом sqlite3.exe из третьего архива. У вас должно получится что-то вроде этого:
e:\scripts\journal\sqlite>dir Содержимое папки e:\scripts\journal\sqlite 13.02.2017 08:45 5 293 sqlite3.def 13.02.2017 08:45 1 716 224 sqlite3.dll 13.02.2017 23:27 701 952 sqlite3.exe 3 файлов 2 423 469 байт
Выполните последовательность команд (создайте cmd файл):
@echo off sc stop "1С:Предприятие 8.3 Агент Сервера" ping -n 30 -w 2000 localhost > NUL rem basename e:\scripts\journal\sqlite\sqlite3.exe "C:\Program Files\1cv8\srvinfo\reg_1541\cdf40893-c3a4-4665-8c64-ba6f6cde503c\1Cv8Log\1Cv8.lgd" vacuum sc start "1С:Предприятие 8.3 Агент Сервера"
где:
- 1С:Предприятие 8.3 Агент Сервера — наименование службы агента необходимого кластера 1С (не забудьте про один момент, что если ваша служба, как и у меня, написана русскими буквами, файл cmd надо сохранять в кодировке OEM 866);
- ping -n 30 -w 2000 localhost > null – команда, дающая вам 30-тисекундную задержку для того, чтобы подождать полного завершения работы 1С;
- e:\scripts\journal\sqlite\ — папка с разархивированной утилитой sqlite3.exe и библиотекой dll необходимой разрядности;
- C:\Program Files\1cv8\srvinfo\reg_1541\cdf40893-c3a4-4665-8c64-ba6f6cde503c\1Cv8Log\ — полный путь до журнала регистрации необходимой базы 1С подлежащего уменьшению.
Но основе данного cmd файла вы можете так же создать задачу и выполнять её по расписанию, или же объединить данные команды с предыдущими. Всё на ваше усмотрение.
На этом задачу по описанию процесса сокращения файла регистрации считаю завершённой.
_______________
По мотивам этой статьи.
Спасибо за информацию, многое для себя почерпнул. Часто приходится копаться в Предприятии по работе)
Спасибо, помогло.
Классная статься, очень помогла!
Как тебя отблагодарить за данную статью?