Резервное копирование файловой базы 1C Предприятие

Posted by

База Альфа которую нужно бекапироватьЧто ни день на работе то все новые и новые задачи я ставлю самому себе, к чему это я? А вот недавно столкнулся с тем, что на терминальном сервере присутствует развернутая конфигурация: АльфаАвто Автосалон+Автосервис+Автозапчасти. Редакция 4.1 (4.1.01.22) с использованием 1С:Предприятие 8.2 (8.2.19.80). Что примечательно, а то что мне если честно без разницы оно и в африке , вот только база данных не SQLная, а файловая. Вследствие этого нет автоматизированных средств по резервному копированию, так как в SQL‘ной, а точнее Microsoft SQL Server. Ну раз так то придется набросать небольшой скрипт, как у меня лучше всего получается это старый добрый bat-файл и все это дело запускать будет стандартный «Планировщик заданий». Итак, что я имею: терминальный сервер развернутый по заметке + установленная на нем (файловая). Ставлю продвинутый текстовый редактор (notepad++) и начинаю. План таков:

  • Завершить все COMсессии к терминальному серверу, если этого не сделать, что в файлах журнала скрипта будет вот такая вот ошибка и скрипт не отработает:

Ошибка исключительной блокировки информационной базы.

Активны сеансы:

компьютер: PC2-K, пользователь: Иванов Иван, сеанс: 828, начат: 31.05.2016 в 19:55:16, приложение: COM-соединение

Команда Net session показывает кто обратился к файловой базе без подключения к терминальному серверу, т. е. COM-соединение.

  • Завершить все RDPсессии к терминальному серверу.
  • Заполучить у программиста административные учетные данные для возможности формирования выгрузки информационной базы.

Итого скрипт для осуществления резервного копирования файловой базы 1С 8.2 следующий:

echo off

setlocal

rem Убиваю процесс 1cv8.exe

taskkill /F /IM 1cv8s.exe /T

taskkill /F /IM 1cv8.exe /T

rem убиваю лог от предыдущего запуска скрипта

del C:\BackupBD\backup1.log

echo "закрываем принудительно все соединения с сервером"

net session /delete /y

rem закрываем конкретное соединение с сервером

rem net sessions \\IP /DELETE /Y

rem logoff TS session ALL

rem Останавливаю службу терминального сервера

net stop termservice /y

rem Получаю список всех терминальный сессии после исполнения предшествующей команды переведенных в статус Disconnected

query session >session.txt

for /f "skip=2 tokens=2,3,4" %%i in (session.txt) DO if '%%j' == 'Disc' logoff %%i

del session.txt

rem Формирую переменную с полным именованием текущей даты и времени

set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%

rem Подключаюсь в 1с в режиме конфигуратора к необходимой базе

rem "Делаю выгрузку базы данных в специальный формат с расширением dt"

"C:\Program Files (x86)\1cv82\8.2.19.80\bin\1cv8.exe" DESIGNER /fc:<путь_до_файловой_базы> /N <административная_учетная_запись> /P <пароль_от_административной_учетной_записи> /DisableStartupMessage /DumpIB "C:\BackupBD\<файловая_база>_%datetimef%.dt" /OUT "C:\BackupBD\backup1.log" -NoTruncate

echo %datetimef% >> c:\backupbd\backup1.log

rem Запускаю службу терминального сервера

net start termservice /y

rem Выхожу из скрипта

endlocal

На заметку: Административная учетная запись в не должна в именовании содержать пробелы, к примеру как у меня было: Ollo A, т. к. я не смог экранировать символ пробела кавычками, а потому лучше будет переименовать в aollo.

На заметку: В один момент времени может быть запущен только один скрипт, а это значит что если Вам нужно бекапировать несколько файловых баз, то следует создать несколько заданий и опытным путем определить время в течении которого каждая база бекапируется, а же потом с учетом этого промежутка времени и запаса (к примеру +20%) заложить на непредвиденные ситуации.

Формат полученного файла бекапа: BazaAlfa_2016_06_21_6_35_10.dt

Ну а далее настраиваю через планировщик заданий на своем терминальном сервере (в моем случая я использую проверенную ось: Windows Enterpise) задание на запуск данного скрипта в то время которое необходимо мне, останавливаться на том как создать задание я не буду это просто да и к тому же я уже писал об этом на своем блоге. По итогу могу сказать следующее: вот такое вот задание у меня лично отрабатывает на «Ура», в планах прикрутить к скрипту возможность уведомления на почту о статусе завершения, работы, ошибках, а вообще уже давно пора переходить с моей стороны на более продвинутые возможности использования командных файлов, а именно PowerShell. Об этом я тоже как нибудь поведу читателям своего блога. На этом я прощаюсь и до новых встреч, с уважением автор блога — ekzorchik.