При настройке автоматического восстановления информационных баз через планировщик задач системные администраторы часто сталкиваются с неприятной особенностью: загрузка данных через командную строку выполняется успешно, но при первом старте базы пользователь видит диалоговое окно с вопросом о том, была ли база перемещена или это копия. Это окно полностью блокирует фоновые процессы и регламентные задания, требуя ручного вмешательства. Разберем, почему возникает такое поведение и как полностью автоматизировать процесс без лишних интерактивных вопросов.
Проанализируем механику работы типовых конфигураций (например, «1С:Зарплата и Управление Персоналом»). Данное окно формируется не платформой «1С:Предприятие», а подсистемой «Блокировка работы с внешними ресурсами», входящей в состав «1С:Библиотеки стандартных подсистем» (БСП).
Основное назначение подсистемы — исключить дублирование запросов к внешним системам (рассылка расчетных листков, отправка отчетов, синхронизация с банками и другими базами данных) из тестовых стендов или копий баз. Механизм контролирует уникальность расположения базы с помощью двух ключевых сущностей:
DoNotCopy.txt, который размещается непосредственно в каталоге файловой информационной базы и содержит ее уникальный строковый идентификатор (GUID).ПараметрыБлокировкиРаботыСВнешнимиРесурсами, где хранится служебная структура с исходной строкой соединения и признаками блокировки.Когда вы выполняете пакетную загрузку базы данных командой /RestoreIB, таблицы базы данных перезаписываются информацией из архива .dt. Однако архив не сохраняет внешний файл DoNotCopy.txt. При первом запуске система обнаруживает несоответствие сохраненного идентификатора расположению базы и блокирует выполнение заданий, ожидая решения администратора.
Рассмотрим наиболее надежный и универсальный метод. Мы можем сразу после загрузки базы вызвать сеанс «1С:Предприятие» в пакетном режиме с ключом /Execute, указав внешнюю обработку. Обработка программно вызовет методы БСП, подтвердит статус базы и корректно закроет сеанс.
Создадим внешнюю обработку (файл .epf). В модуле обработки или в обработчике формы при открытии напишем следующий код:
Процедура ПриОткрытии()
// Снимаем блокировку работы с внешними ресурсами средствами БСП
БлокировкаРаботыСВнешнимиРесурсами.РазрешитьРаботуСВнешнимиРесурсами();
// Завершаем сеанс без лишних вопросов
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
В некоторых редакциях БСП вызов метода может производиться через общий модуль регламентных заданий:
РегламентныеЗаданияСервер.РазблокироватьРаботуСВнешнимиРесурсами();
ЗавершитьРаботуСистемы(Ложь);
Теперь объединим это в сценарии командной строки или пакетном файле .bat / .cmd:
rem 1. Загружаем базу из файла выгрузки
"C:\Program Files\1cv8\common\1cestart.exe" DESIGN /F "C:\DB1C\ZUP" /RestoreIB "C:\DB1C\zup.dt" /N "Backup" /P "Backup"
rem 2. Запускаем обработку для подтверждения перемещения базы
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "C:\DB1C\ZUP" /N "Backup" /P "Backup" /Execute "C:\Scripts\UnlockResources.epf"
Посмотрим на альтернативное решение без отображения графического интерфейса. Мы можем обратиться к базе через V83.COMConnector. Так как сеанс COM-соединения не инициирует интерактивные диалоги клиента, предупреждающее окно не появится вовсе, а встроенный код позволит актуализировать параметры.
Разберем пример скрипта на VBScript или PowerShell, выполняющего подключение и вызов метода:
$connector = New-Object -ComObject "V83.COMConnector"
$connection = $connector.Connect("File=""C:\DB1C\ZUP"";Usr=""Backup"";Pwd=""Backup"";")
$connection.БлокировкаРаботыСВнешнимиРесурсами.РазрешитьРаботуСВнешнимиРесурсами()
Данный метод автоматически запишет обновленный путь к базе в константу и пересоздаст служебный файл DoNotCopy.txt с актуальным идентификатором.
Разберем более простой вариант для файловых информационных баз. Если задача состоит в регулярном обновлении тестовой базы из рабочей копии, можно сохранить исходный файл DoNotCopy.txt перед загрузкой и вернуть его на место:
/RestoreIB сохраняем файл DoNotCopy.txt из рабочего каталога в резервную папку..dt в целевую базу.DoNotCopy.txt обратно в каталог базы C:\DB1C\ZUP.Если идентификатор внутри файла совпадает с данными, которые хранятся в константах загруженной базы, механизм БСП считает базу оригинальной и диалог не выводится.
Обратим внимание на архитектурное ограничение: фирма «1С» не рекомендует применять связку выгрузки и загрузки .dt для регулярного резервного копирования рабочих баз. Формат .dt предназначен для переноса данных между разными СУБД или подготовки демонстрационных баз.
Для надежного автоматического копирования файловых баз гораздо эффективнее и быстрее копировать основной файл базы данных 1Cv8.1CD (предварительно завершив сеансы пользователей) вместе со служебным файлом DoNotCopy.txt. При таком подходе целостность базы не нарушается, а вопрос о перемещении базы не возникнет вовсе.