При переходе с устаревших редакций программ 1С (например, ЗУП 2.5) на современные (ЗУП 3.1) системные администраторы и разработчики часто сталкиваются с проблемой автоматизации. В старых версиях было достаточно восстановить базу из SQL-бэкапа и запустить обработку. В новых конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), встроен интеллектуальный механизм защиты от дублирования регламентных заданий. При изменении строки соединения (имени сервера или имени базы) система блокирует работу и выводит интерактивное окно с вопросом: "Информационная база перемещена или является копией?".
Для автоматических скриптов это окно становится непреодолимым препятствием, так как оно ожидает реакции пользователя. В этой статье мы подробно разберем, как программно подавить это уведомление и полностью автоматизировать процесс подготовки копии базы для пользователей.
Разберем ситуацию: современная платформа 1С сохраняет параметры своего местоположения (строку соединения) во внутренних настройках базы данных. При каждом запуске код БСП сравнивает текущую строку соединения с сохраненной. Если они не совпадают, система считает, что базу скопировали, и блокирует выполнение критически важных операций: отправку почты, синхронизацию данных, выполнение регламентных заданий. Это сделано для того, чтобы база-копия случайно не начала рассылать реальные расчетные листки сотрудникам или не выгрузила данные в боевой банк-клиент.
Проанализируем наиболее эффективный способ, предложенный в обсуждении. Для обхода интерактивных диалогов при запуске клиентского приложения можно использовать специальный ключ /C, который передает параметры в процедуру ПриНачалеРаботыСистемы. В конфигурациях на БСП предусмотрены системные параметры, позволяющие отключить проверки.
Рассмотрим пример строки запуска, которая позволяет запустить базу, игнорируя проверку на копийность, и сразу выполнить внешнюю обработку для настройки заголовка системы:
"C:\Program Files\1cv83\8.3.x.x\bin\1cv8.exe" ENTERPRISE /S"ServerSQL:1541\ZUP_Copy" /N"Admin" /P"Password" /C "ОтключитьЛогикуНачалаРаботыСистемы" /Execute "C:\Scripts\UpdateCaption.epf"
Разберем по шагам используемые ключи:
ENTERPRISE — запуск системы в пользовательском режиме./S — путь к информационной базе на сервере./N и /P — имя пользователя и пароль с административными правами./C "ОтключитьЛогикуНачалаРаботыСистемы" — ключевой параметр. Он сообщает коду БСП, что стандартные проверки при запуске (включая проверку перемещения базы) выполнять не нужно./Execute — путь к внешней обработке, которая выполнит необходимые действия (например, смену заголовка).Если нам нужно не просто "проскочить" запуск, а полностью перевести базу в режим работы с новым местоположением без участия пользователя, мы можем вызвать методы БСП внутри внешней обработки. Рассмотрим пример кода, который следует разместить в модуле обработки, запускаемой через /Execute.
Выясним причину, по которой база продолжает считать себя копией. Она хранит признак перемещения в системных настройках. Чтобы программно подтвердить системе, что "база перемещена", используем следующий код:
// В модуле обработки при открытии или в процедуре, вызываемой из скрипта
Процедура СброситьПризнакКопии() Экспорт
// Используем методы БСП для установки параметров работы
// Параметр "ИнформационнаяБазаПеремещена" в значении Ложь
// говорит системе, что текущее местоположение является легитимным.
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда
Метод = ОбщегоНазначения.ОбщийМодуль("ОбщегоНазначения");
Метод.УстановитьПараметрРаботыСистемы("ИнформационнаяБазаПеремещена", Ложь);
КонецЕсли;
// После этого можно изменить заголовок системы
УстановитьЗаголовокСистемы("КОПИЯ ЗУП от " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"));
// Завершаем работу системы после выполнения действий
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Посмотрим на ситуацию с другой стороны. Если мы не хотим запускать визуальный интерфейс 1cv8.exe, мы можем использовать V83.COMConnector. Этот метод хорош тем, что при COM-соединении не срабатывают обработчики ПриНачалеРаботыСистемы, которые вызывают диалоговые окна. Это позволяет нам "тихо" изменить настройки базы сразу после ее восстановления из SQL.
Пример скрипта на языке VBScript или внутри другой базы 1С для настройки копии:
Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаСоединения = "Srvr='ServerSQL';Ref='ZUP_Copy';Usr='Admin';Pwd='Password';";
Соединение = Коннектор.Connect(СтрокаСоединения);
// Вызываем метод сброса блокировки напрямую через соединение
// Обратите внимание: заголовок через COM менять нет смысла (он меняет GUI)
// Но мы можем записать значение в константу или параметр БСП
Соединение.ОбщегоНазначения.УстановитьПараметрРаботыСистемы("ИнформационнаяБазаПеремещена", Ложь);
// Дополнительно можно отключить регламентные задания, чтобы они не запустились
Соединение.РегламентныеЗаданияСервер.УстановитьБлокировкуРегламентныхЗаданий(Истина);
Соединение = Неопределено;
Проанализируем вариант, когда нам нужно подготовить базу еще до первого подключения платформы. Информация о том, что база "перемещена", хранится в таблице параметров (обычно это _CommonSettings или _SystemSettings). Однако структура этих таблиц в 1С является объектной (хранилище значений), и прямая правка SQL-запросами крайне не рекомендуется, так как может повредить целостность данных.
Вместо этого, правильнее использовать скрипт, который после RESTORE DATABASE на SQL-сервере выполнит установку блокировки регламентных заданий на уровне параметров консоли кластера. Это можно сделать через администрирование параметров базы в консоли 1С (параметр ScheduledJobsDeny).
Разберем важный нюанс, который часто упускают. При автоматическом создании копии ЗУП 3.1 крайне важно гарантировать, что база не начнет выполнять рассылки. Даже если вы использовали ключ /C "ОтключитьЛогикуНачалаРаботыСистемы", при следующем обычном заходе пользователя база снова может спросить о перемещении.
Рекомендуемый алгоритм автоматизации:
_ScheduledJobs или установки флага блокировки в параметрах базы в кластере 1С./C "ОтключитьЛогикуНачалаРаботыСистемы" и выполнение обработки, которая:
УстановитьПараметрРаботыСистемы("ИнформационнаяБазаПеремещена", Ложь).В обсуждении упоминался файл DoNotCopy.txt. Проясним ситуацию: этот механизм действительно существует в платформе 1С. Если в каталоге с файловой базой или в определенных системных папках серверной базы создать пустой файл с таким именем, платформа может проигнорировать проверку смены местоположения. Однако для серверных баз (SQL) этот метод считается недокументированным и нестабильным. Использование параметров командной строки БСП является официальным и рекомендуемым способом решения задачи.
Таким образом, мы рассмотрели несколько способов обхода блокировки. Наиболее надежным для ЗУП 3.1 остается использование ключа /C в сочетании с программным вызовом методов ОбщегоНазначения БСП.