Резервное копирование информационных баз 1С 8.2 (консольное приложение на DELPHI, Клиент-Сервер)

05.02.14

База данных - Архивирование (backup)

Программа производит блокировку входа пользователей, отключает всех от базы, выгружает базу в .dt средствами 1с.
После окончания выгрузки снимает блокировку. В архиве имеются исходники.

Скачать файлы

Наименование Файл Версия Размер
backup.7z
.7z 55,38Kb
35
.7z 55,38Kb 35 Скачать

 

Запускать можно без параметров тогда программа возьмет с файла "cfg.ini" раздел "default" если его нету то выйдет.

В  файле "cfg.ini" можно прописать несколько разделов и передавать их названия в качестве параметров.

Пример  файла "cfg.ini" :

[default]
DumpPath=C:\
ServerName=uppserver
InfoBaseName=test
ClasterPortNumber=1541
InfoBasesAdminName=admin
InfoBasesAdminPass=123
ClasterAdminName=
ClasterAdminPass=
LockPermissionCode=1234

[upp]
DumpPath=C:\
ServerName=server2
InfoBaseName=upp
ClasterPortNumber=1541
InfoBasesAdminName=admin
InfoBasesAdminPass=123
ClasterAdminName=
ClasterAdminPass=
LockPermissionCode=123455

Листинг кода на Delphi 7:

program backup;

//Не будем светить окном
//{$APPTYPE CONSOLE}

uses
Windows,
SysUtils,
Variants,
ComObj,
Registry,
inifiles,
ActiveX;

type
TdataZap = record
DumpPath : string;
ServerName : string;
InfoBaseName : string;
ClasterPortNumber : string;
InfoBasesAdminName : string;
InfoBasesAdminPass : string;
ClasterAdminName : string;
ClasterAdminPass : string;
LockPermissionCode : string;
end;

//Найдем путь до 1с (результат функции, пример: 'C:\Program Files\1cv82\8.2.19.76\bin\1cv8.exe')
function Path1C:string;
var reg : TRegistry;
begin
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CLASSES_ROOT;
reg.OpenKey('\CLSID\{5CD98F13-1050-4b43-84F2-33AD97CFC287}\LocalServer32\', false);
result:=reg.ReadString('');
reg.CloseKey;
reg.Free;
end;

//выполнить запуск с ожиданием завершения процесса
function ExecAndWait(const FileName,
Params: ShortString;
const WinState: Word): boolean; export;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: ShortString;
begin
{ Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x }
CmdLine := '"' + Filename + '" ' + Params;
FillChar(StartInfo, SizeOf(StartInfo), #0);
with StartInfo do
begin
cb := SizeOf(StartInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WinState;
end;
Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
{ Ожидаем завершения приложения }
if Result then
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
{ Free the Handles }
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;

procedure Zapusk(dataR:TdataZap);
var
bin1c,LockMessageText,FullPathName,sDate1,sDate2:string;
FindInfoBase:boolean;
ComConnector,ServerAgent,Clasters,WorkingProcesses,
connecttoworkprocess,InfoBases,InfoBase,Connections:Variant;
lK,lW,lB,lC: LongWord;
begin
bin1c := Path1C; //прочитаем путь до 1с из реестра

LockMessageText := 'База закрыта на БЭКАП';
FindInfoBase:=false;
DateTimeToString(sDate1, 'yyyy-mm-dd', now());
DateTimeToString(sDate2, 'HH-NN', now());
FullPathName:=dataR.DumpPath+sdate1+'_'+sdate2+'_'+dataR.InfoBaseName+'.dt';

ComConnector :=UnAssigned;
ComConnector := CreateOLEObject('V82.ComConnector');
ServerAgent := ComConnector.ConnectAgent(dataR.ServerName);
//Получим массив кластеров сервера
Clasters := ServerAgent.GetClusters;
for lK := 0 to VarArrayHighBound(Clasters, 1) do
//проверка на нужный порт кластера(если больше одного)
If Clasters[lK].MainPort = dataR.ClasterPortNumber Then
begin
ServerAgent.Authenticate(Clasters[lK],dataR.ClasterAdminName,dataR.ClasterAdminPass);
//Получим список рабочих процессов
WorkingProcesses := ServerAgent.GetWorkingProcesses(Clasters[lK]);
for lW := 0 to VarArrayHighBound(WorkingProcesses, 1) do
If WorkingProcesses[lW].Running = 1 Then
begin
connecttoworkprocess := ComConnector.ConnectWorkingProcess('tcp://'+WorkingProcesses[lW].HostName + ':' + inttostr(WorkingProcesses[lW].MainPort));
connecttoworkprocess.AuthenticateAdmin(dataR.ClasterAdminName, dataR.ClasterAdminPass);
connecttoworkprocess.AddAuthentication(dataR.InfoBasesAdminName, dataR.InfoBasesAdminPass);
If Not FindInfoBase Then
begin
InfoBases := connecttoworkprocess.GetInfoBases;
for lB := 0 to VarArrayHighBound(InfoBases, 1) do
if LowerCase(InfoBases[lB].Name) = LowerCase(dataR.InfoBaseName) then
begin
InfoBase:=InfoBases[lB];
FindInfoBase:=true;
end;
end;
end;
end;

//Заблокируем базу
if FindInfoBase then
begin
InfoBase.ConnectDenied := True;
InfoBase.ScheduledJobsDenied := True;
InfoBase.DeniedFrom := now();
InfoBase.DeniedTo :=now()+300/86400; //Блокировка на 5 минут
InfoBase.DeniedMessage := 'Блокировка базы';
InfoBase.PermissionCode := dataR.LockPermissionCode;
connecttoworkprocess.UpdateInfoBase (InfoBase);
end;

//Отключим все соединения с базой
if FindInfoBase then
begin
Connections := connecttoworkprocess.GetInfoBaseConnections(InfoBase);
for lC := 0 to VarArrayHighBound(Connections, 1) do
If Connections[lC].AppId <> 'SrvrConsole' Then connecttoworkprocess.Disconnect(Connections[lC]);
//Запускаем архивацию с ожиданием выполнения
ExecAndWait( bin1c,
' CONFIG /S' + dataR.ServerName + '\' + dataR.InfoBaseName +
' /N' + dataR.InfoBasesAdminName + ' /P' + dataR.InfoBasesAdminPass +
' /UC' + dataR.LockPermissionCode + ' /DisableStartupMessages /DumpIB' +'"'+ FullPathName+'"', SW_SHOWNORMAL);
end;

//разблокируем базу
if FindInfoBase then
begin
InfoBase.ConnectDenied := False;
InfoBase.ScheduledJobsDenied := False;
connecttoworkprocess.UpdateInfoBase (InfoBase);
end;

end;

procedure Zagruzka(paramStrP,paramstr: string);
var dataR:TdataZap;
Ini: Tinifile;
begin
Ini := TiniFile.Create(extractfilepath(ParamStrP)+'cfg.ini');
dataR.DumpPath := Ini.ReadString(paramstr,'DumpPath','-');
dataR.ServerName := Ini.ReadString(paramstr,'ServerName','-');
dataR.InfoBaseName := Ini.ReadString(paramstr,'InfoBaseName','-');
dataR.ClasterPortNumber := Ini.ReadString(paramstr,'ClasterPortNumber','-');
dataR.InfoBasesAdminName := Ini.ReadString(paramstr,'InfoBasesAdminName','-');
dataR.InfoBasesAdminPass := Ini.ReadString(paramstr,'InfoBasesAdminPass','-');
dataR.ClasterAdminName := Ini.ReadString(paramstr,'ClasterAdminName','-');
dataR.ClasterAdminPass := Ini.ReadString(paramstr,'ClasterAdminPass','-');
dataR.LockPermissionCode := Ini.ReadString(paramstr,'LockPermissionCode','-');
Ini.Free;
if NOT(dataR.ServerName='-') then Zapusk(dataR);
end;

begin
CoInitialize(nil);
if ParamCount>0 then
Zagruzka(ParamStr(0),ParamStr(1))
else
Zagruzka(ParamStr(0),'default');
CoUnInitialize;
end.

 

См. также

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

19200 руб.

15.05.2017    42525    10    24    

38

BackUPv8 - система резервного копирования баз 1С

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Автоматическое создание копий файловых и серверных информационных баз 1С Предприятие 8 и размещение копий в облаке Яндекс.Диск, локальном или сетевом ресурсе.

1200 руб.

03.09.2014    14733    13    6    

18

Резервное копирование журнала транзакций, наконец-то!

Архивирование (backup) Администрирование СУБД Россия Бесплатно (free)

Постараюсь объяснить, зачем нужно резервное копирование именно журнала транзакций, а не только базы данных, и почему я словно сбросил груз, настроив его - как, покажу, естественно. Кстати, будут скрипты T-SQL (с подробными комментариями) - отличный способ сделать администрирование базы более уютным.

04.12.2023    5887    n_mezentsev    15    

25

Резервное копирование и восстановление 1С баз на PostgreSQL в Windows с помощью pgAdmin, bat-файлов и планировщика

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данной инструкции будет описано, как с помощью pgAdmin, bat-файлов и планировщика заданий Windows организовать резервное копирование, восстановление и хранение копий баз данных.

07.10.2022    19845    sapervodichka    36    

142

Архивирование базы в dt и дамп postgres

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Захотелось клиентам выгрузку архива баз, и выгрузку в дт, готовые скрипты с сети не заработали. Может, кому-то поможет. Релиз 8.3.18.1741.

1 стартмани

25.08.2022    4721    2    Gnom-Gluck    6    

6

Утилита копирования баз данных 1С

Архивирование (backup) Платформа 1С v8.3 Абонемент ($m)

Небольшая утилита для копирования файловых баз данных 1С.

1 стартмани

02.06.2022    4237    3    Giblarium    12    

5
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ksvd 05.02.14 13:21 Сейчас в теме
Работает. Спасибо. Для себя узнал - что можно искать путь к 1cv8.exe по CLSID.

2. Astafan 05.02.14 21:19 Сейчас в теме
Как во-время, сейчас стоит задача запуска резервного копирования баз в формате DT. Ознакомлюсь с возможностями.
3. zqzq 23 06.02.14 08:54 Сейчас в теме
Вообще-то сама 1С в документации рекомендует для клиент-сервера копии делать через СУБД. Тогда и выгонять никого не надо и проблем меньше. dt* это для загрузки в файловую и обратно, а не для резервного копирования.
4. TrinitronOTV 14 06.02.14 09:52 Сейчас в теме
а я просто копирую папку базы в файловом варианте, наверное этого достаточно...
5. dock 44 12.02.14 08:11 Сейчас в теме
нда... конечно информация полезная - автоматическая выгрузка в .dt
но практическое применение... под сомнением.
1) при sql-версии все прекрасно выгружается средствами СУБД.
2) при файловом варианте достаточно копировать папку (опять таки, есть средства БЕЗ отключения пользователей)...
6. Astafan 28.03.14 10:26 Сейчас в теме
(5) dock,
Это идеальный вариант, когда на небольшом предприятии выходит из строя сервер и можно быстро восстановить базу на любом мощном рабочем компьютере не разворачивая SQL.
7. ressurect83 06.02.15 20:48 Сейчас в теме
Не стартует, выдало ошибку EOleSysError in module backup.exe at 00014B4D
Не допустимая строка с указанием класса.
Оставьте свое сообщение