Автоматическое обновление и резервное копирование баз 1С

Случилось так, что взял я на поддержку порядка пятидесяти не типовых баз данных 1С, но с одинаковой конфигурацией. А базы эти расположены в разных городах, в разных часовых поясах, да на разных серверах. И чтобы сделать обновление, приходилось тратить много часов на то, чтобы слезно попросить пользователей выйти из базы, сделать резервную копию и накатить новую конфигурацию. Долго сказка сказывается, да не быстро дело делается. Решил я этот процесс автоматизировать…

Выковал я из стали BAT-файл, да вооружил им Шедулер серверный. А файл тот был следующего содержания:

@ECHO OFF
CLS

SET BASE_NAME=ИмяБазыДанных
SET CONNECT_STR="File=""D:1C_BaseМояБазаДанных"";"
SET USER_NAME=Update
SET USER_PWD=123

SET START_FILE="C:Program Files (x86)1cv828.2.19.90in1cv8.exe"
SET BACKUP_DIR=D:1C_BaseetcBackup
SET CF_DIR=D:1C_BaseetcUpdate
SET LOG_DIR=D:1C_BaseetcUpdateLog

SET UNLOCK_CODE=КодРазрешения

SET CF_FILE=%CF_DIR%1Cv8.cf
SET LOG_FILE=%LOG_DIR%\%BASE_NAME%_%date:~6,4%-%date:~3,2%-%date:~0,2%.log
SET DUMP_FILE=%BACKUP_DIR%\%BASE_NAME%_%date:~6,4%-%date:~3,2%-%date:~0,2%.dt

IF NOT EXIST %CF_FILE% EXIT

ECHO --- Start the update %DATE% %TIME% ---
ECHO --- Start the update %DATE% %TIME% --- >> %LOG_FILE%
ECHO.
ECHO. >> %LOG_FILE%

ECHO --- Completion of the inactive terminal sessions ---
ECHO --- Completion of the inactive terminal sessions --- >> %LOG_FILE%
tskill *1cv8* /a /v
@ECHO.
@ECHO. >> %LOG_FILE%

ECHO --- Shutdown users ---
ECHO --- Shutdown users --- >> %LOG_FILE%
START "" /wait %START_FILE% ENTERPRISE /IBConnectionString%CONNECT_STR% /N%USER_NAME% /P%USER_PWD% /WA- /DisableStartupMessages /CЗавершитьРаботуПользователей /Out%LOG_FILE% -NoTruncate
ECHO.
ECHO. >> %LOG_FILE%

IF EXIST %DUMP_FILE% GOTO NO_BACKUP

ECHO --- Creating a backup ---
ECHO --- Creating a backup --- >> %LOG_FILE%
ECHO Backup file: %DUMP_FILE%
ECHO Backup file: %DUMP_FILE% >> %LOG_FILE%
START "" /wait %START_FILE% DESIGNER /IBConnectionString%CONNECT_STR% /N%USER_NAME% /P%USER_PWD% /WA- /UC%UNLOCK_CODE% /DumpIB%DUMP_FILE% /Out%LOG_FILE% -NoTruncate
ECHO.
ECHO. >> %LOG_FILE%

:NO_BACKUP

ECHO --- Configuration update ---
ECHO --- Configuration update --- >> %LOG_FILE%
ECHO Update file: %CF_FILE%
ECHO Update file: %CF_FILE% >> %LOG_FILE%
START "" /wait %START_FILE% DESIGNER /IBConnectionString%CONNECT_STR% /N%USER_NAME% /P%USER_PWD% /WA- /UC%UNLOCK_CODE% /LoadCfg%CF_FILE% -WarningsAsErrors /Out%LOG_FILE% -NoTruncate
ECHO.
ECHO. >> %LOG_FILE%

ECHO --- Information base update ---
ECHO --- Information base update --- >> %LOG_FILE%
START "" /wait %START_FILE% DESIGNER /IBConnectionString%CONNECT_STR% /N%USER_NAME% /P%USER_PWD% /WA- /UC%UNLOCK_CODE% /UpdateDBCfg -WarningsAsErrors /Out%LOG_FILE% -NoTruncate
ECHO.
ECHO. >> %LOG_FILE%

ECHO --- Unlock database ---
ECHO --- Unlock database --- >> %LOG_FILE%
START "" /wait %START_FILE% ENTERPRISE /IBConnectionString%CONNECT_STR% /N%USER_NAME% /P%USER_PWD% /WA- /DisableStartupMessages /CРазрешитьРаботуПользователей /UC%UNLOCK_CODE% /Out%LOG_FILE% -NoTruncate
ECHO.
ECHO. >> %LOG_FILE%

ECHO --- End of update %DATE% %TIME% ---
ECHO --- End of update %DATE% %TIME% --- >> %LOG_FILE%
ECHO.
ECHO. >> %LOG_FILE%

PAUSE

BASE_NAME — Имя базы данных, используется в наименовании лог-файлов и файлов резервных копий.

CONNECT_STR — строка подключения к информационной базе. В случае файлового варианта должна выглядить так «File=»»D:1C_BaseМояБазаДанных»»;» (обратите внимание на двойные кавычки). Для клиент-серверного варината «Srvr=»»ИмяСервера»»;Ref=»»МояБазаДанных»»;».

USER_NAME и USER_PWD — Соответственно логин и пароль пользователя под которым делается обновление. Полные права давать не обязательно, в типовых конфигурациях достаточно права администрирования.

START_FILE — Путь к программе 1С:Предприятие. Следует обратить внимание на то, что нужно обращаться к конкретному релизу (например, «C:Program Files (x86)1cv828.2.19.90in1cv8.exe»), а не к файлу запускатору («C:Program Files (x86)1cv82common1cestart.exe»). Дело в том, что этот файл запускает еще один новый процесс, а сам закрывается. В этом случае BAT-файл не будет дожидаться завершения каждого отдельного действия и запустить несколько версий 1С одновременно.

BACKUP_DIR — Путь для резервных копий. Имена файлов генерируются как ИмяБазыДанных_Год-Месяц-Число.

CF_DIR — Путь к файлу обновления 1Cv8.cf. Если файл в указанной директории есть, то начинается обновление, если нет — работа BAT-файла завершается.

LOG_DIR — Путь где будут храниться лог-файлы. Имена файлов генерируются как Год-Месяц-Число_ИмяБазыДанных.

Прошу прощения за английские слова. Проблема в том, что BAT-файл должен быть в кодировке 866 OEM, а лог программа 1С пишет в 1251 ANSI.

Итак, что делает скрипт.

1. Проверяет наличие файла обновления по указанному пути. Если файла нет, то скрипт завершается.

2. Убивает зависшие процессы: tskill *1cv8* /a /v

3. Завершает работу всех пользователей и блокирует базу для входа.

4. Если в текущую дату еще не делалась резерваная копия, то делает выгрузку данных.

5. Обновляет конфигурацию.

6. Обновляет информационную базы.

7. Разблокирует базу для входа пользователей.

Теперь я просто кладу вечером файл обновления в нужную папку, прихожу утром и, на всякий случай, проверяю логи, дабы убедиться, что все обновилось.

23 Comments

  1. ololoanonim

    Выглядит круто 🙂

    Reply
  2. mmoozzgg

    50 баз = 50 батников?

    Reply
  3. Nicholas

    (2) mmoozzgg, изначально планировал количество батников по количеству серверов. Но в итоге, пришел к мнению, что лучше сделать отдельный батник на каждую базу. Иначе, в случае какой-либо ошибки могут не обновиться все базы. Плюс обновления нескольких баз можно запускать параллельно.

    В общем-то, пути на всех серверах у меня одинаковые, поэтому созданик батника сводится к его копированию и изменению всего двух параметров: BASE_NAME и

    CONNECT_STR, в редких случаях еще меняю версию в START_FILE (в идеале хочу везде обновиться до одной версии).

    Reply
  4. TMV

    (0),

    порядка пятидесяти не типовых баз данных 1С, но с одинаковой конфигурацией

    Не РБД ли?

    Reply
  5. Nicholas

    (4) TMV,

    Не РБД ли?

    Нет

    Reply
  6. chmv

    Идея правтльная

    Reply
  7. Светлый ум

    К этой же теме хорошо было бы дописать удаление старых БекАпов, ибо место не резиновое. Не сталкивались с такой задачей?

    Было бы интересно посмотреть на реализацию.

    Reply
  8. Nicholas

    (7) Светлый ум, при желании и достаточном времени можно и такой задачей заняться.

    Думаю ничего сложно в этом нет. Будет что-то типа (на практике не проверял):

    FORFILES /P «%BACKUP_DIR%» /S /D -1 /C «CMD /C IF @ISDIR==FALSE DEL /F /Q «%BACKUP_DIR%@REALPATH»»

    Теоретически этот код должен удалять все файлы старше одного дня.

    Reply
  9. artbear

    Без обид, но очередной велосипед.

    Батник не дает ту свободу обработки, что дает более мощный скриптовый язык 🙁

    Где обработка ошибок?

    Много еще граблей сломаешь на этом пути 🙁

    Reply
  10. Nicholas

    (9) artbear, не претендую на оригинальность, ничего сложного, ничего особо нового — стандартные механизмы 1С. Но, в данный момент, эти батники меня очень спасают от рутинной работы. Если есть примеры скриптов с более богатым функционалом и обработкой ошибок, подалитесь, пожалуйста.

    Reply
  11. jdo

    (10) да пожалуйста. Мне не жалко. http://infostart.ru/public/138493/ . Этими скриптами я схранял 32 базы. Половина Бухгалтерия, половина Зряплата, всё это выкладывалось на ФТП, а через 62 дня оставляло один: первый за месяц. И всё это с обработкой ошибок.

    Reply
  12. jdo

    (9) artbear, сейчас пишу на JScript-е backUp + updater на основании 1С-кой обработки ОбновлениеКнфигурации. Цель: создать кроссплатформенный скрипт для автоматического архивирования и обновления нескольких 1С информационных баз (ИБ). Разработка приближается к логическому завершению через неделю. Затем тест на реальных ИБ, надеюсь к началу следующего месяца получу не только рабочую версию, но и оттестированную. Приближаясь к завершению я осознал, что скрипт на базе jscript кроссплатформенным не получится из-за отсутствия встроенных возможностей работы с XML. После отладки придется переводить на Perl. Для кроссплатформенности в Linux для замены COM они (1C-ники) разработали RAS/RAC (Remote Administratiorn Server/Remote Administration Client), а вот для конфтгураций на платформе 8.2 они уже этого делать не будут. Хорошо бы для ЗапретитьРаботуПользователей/РазрешитьРаботуПользователей имплантировать соответствующие функции web-сервиса в библиотеку стандартных подсистем (БСП), а не СОМ соединения, типа DenyUsersWork/AllowUsersWork. Но это надо просить 1С-ников тем у кого есть подписка на поддержку (ИТС). 🙁

    Reply
  13. artbear

    (12) ИМХО лучше юзать 1Script, чем Perl 🙂

    ХМЛ есть, работу с процессами поддерживает, ЗИП есть, много чего есть.

    Мы уже много скриптов с автором Андреем (EvilBeaver) понаписали, уже в реальной эксплуатации для нескольких проектов разных команд.

    Reply
  14. DexterMorgan777

    Спасибо, очень помог ваш пример.

    Reply
  15. michawin

    Здравствуйте ! Не обновляется конфигурация базы данных , может ли быть из за платформы 8.3.6.2100, пробывал также на 8.3.5? Не проверяли?( 6-ой пункт). Если «ручками» зайти в конфигуратор и нажать F7 ,то обновляется без проблем.

    Reply
  16. Nicholas

    (15) Нет, у меня сейчас такой же релиз. Работает отлично. Что в лог файле? Когда обновляете по F7, предупреждений никаких нет?

    Reply
  17. michawin

    Да есть одно не критичное предупреждение, из за него? Никак не обойти?

    Reply
  18. Nicholas

    (17) Исправьте его и в следующий раз все будет работать.

    Reply
  19. michawin

    Да, согласен, все сработало , спасибо !

    Reply
  20. Nicholas

    Пожалуйста.

    Reply
  21. Shaldryn

    Автоматическое обновление нетиповой? И как это вы так автоматизировали? Он сам сравнение и объединение делает?

    Reply
  22. TMV

    (21) Shaldryn,»Чукча — не читатель, чукча — писатель».

    порядка пятидесяти не типовых баз данных 1С, но с одинаковой конфигурацией

    Автоматом обновляется N баз с уже подготовленным CF.

    А если интересуетесь

    Автоматическое обновление нетиповой?

    , то вам Сюда, например.

    Reply
  23. Nicholas

    (21) Shaldryn, для обновления типовых есть другие механизмы, попроще. А здесь вы сами подготавливаете конфигурацию обновления, кладете ее в определенную папку, запускаете скрипт и он сам делает все рутинные действия по резервному копированию, обновлению и пр.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *