Что ни день на работе то все новые и новые задачи я ставлю самому себе, к чему это я? А вот недавно столкнулся с тем, что на терминальном сервере присутствует развернутая 1С конфигурация: АльфаАвто Автосалон+Автосервис+Автозапчасти. Редакция 4.1 (4.1.01.22) с использованием 1С:Предприятие 8.2 (8.2.19.80). Что примечательно, а то что мне если честно без разницы 1С оно и в африке 1С, вот только база данных не SQL‘ная, а файловая. Вследствие этого нет автоматизированных средств по резервному копированию, так как в SQL‘ной, а точнее Microsoft SQL Server. Ну раз так то придется набросать небольшой скрипт, как у меня лучше всего получается это старый добрый bat-файл и все это дело запускать будет стандартный «Планировщик заданий». Итак, что я имею: терминальный сервер развернутый по заметке + установленная на нем 1С (файловая). Ставлю продвинутый текстовый редактор (notepad++) и начинаю. План таков:
- Завершить все COM–сессии к терминальному серверу, если этого не сделать, что в файлах журнала скрипта будет вот такая вот ошибка и скрипт не отработает:
Ошибка исключительной блокировки информационной базы.
Активны сеансы:
компьютер: PC2-K, пользователь: Иванов Иван, сеанс: 828, начат: 31.05.2016 в 19:55:16, приложение: COM-соединение
Команда Net session показывает кто обратился к файловой базе без подключения к терминальному серверу, т. е. COM-соединение.
- Завершить все RDP–сессии к терминальному серверу.
- Заполучить у программиста 1С административные учетные данные для возможности формирования выгрузки информационной базы.
Итого скрипт для осуществления резервного копирования файловой базы 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
На заметку: Административная учетная запись в 1С не должна в именовании содержать пробелы, к примеру как у меня было: Ollo A, т. к. я не смог экранировать символ пробела кавычками, а потому лучше будет переименовать в aollo.
На заметку: В один момент времени может быть запущен только один скрипт, а это значит что если Вам нужно бекапировать несколько файловых баз, то следует создать несколько заданий и опытным путем определить время в течении которого каждая база бекапируется, а же потом с учетом этого промежутка времени и запаса (к примеру +20%) заложить на непредвиденные ситуации.
Формат полученного файла бекапа: BazaAlfa_2016_06_21_6_35_10.dt
Ну а далее настраиваю через планировщик заданий на своем терминальном сервере (в моем случая я использую проверенную ось: Windows Server 2008 R2 Enterpise) задание на запуск данного скрипта в то время которое необходимо мне, останавливаться на том как создать задание я не буду это просто да и к тому же я уже писал об этом на своем блоге. По итогу могу сказать следующее: вот такое вот задание у меня лично отрабатывает на «Ура», в планах прикрутить к скрипту возможность уведомления на почту о статусе завершения, работы, ошибках, а вообще уже давно пора переходить с моей стороны на более продвинутые возможности использования командных файлов, а именно PowerShell. Об этом я тоже как нибудь поведу читателям своего блога. На этом я прощаюсь и до новых встреч, с уважением автор блога — ekzorchik.