При массовом обновлении информационных баз 1С (особенно в серверном варианте) системные администраторы и программисты часто сталкиваются с тем, что процесс прерывается модальным окном "Подтверждение легальности получения обновления". Это окно требует интерактивного нажатия кнопки "Да", что делает невозможным полную автоматизацию процесса через планировщик задач или скрипты. В этой статье мы разберем, почему это происходит и какими способами можно программно подтвердить легальность, не открывая программу вручную.
В конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), механизм обновления включает в себя проверку правомерности использования программного продукта. Для файловых баз передача параметра /C "ВыполнитьОбновлениеИЗавершитьРаботу" часто срабатывает корректно, так как весь процесс происходит в рамках одного сеанса. Однако в серверных базах 1С разделяет клиентский сеанс и фоновые задания на сервере. Если признак легальности не установлен в базе данных, сервер блокирует выполнение кода обновления до тех пор, пока пользователь не подтвердит свои права в интерфейсе.
Проанализируем самый надежный и профессиональный метод — использование внешней обработки, которая программно устанавливает флаг легальности перед запуском самого обновления. Этот метод хорош тем, что он не требует изменения основной конфигурации (что важно для типовых решений) и работает непосредственно через командную строку.
Создадим внешнюю обработку (например, ConfirmLegality.epf), в модуле объекта которой пропишем следующий код:
Процедура ПередЗаписью(Отказ)
// Для конфигураций на базе БСП вызываем служебный метод
Попытка
ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений();
Сообщить("Легальность успешно подтверждена.");
Исключение
Сообщить("Ошибка при подтверждении: " + ОписаниеОшибки());
КонецПопытки;
// Завершаем работу системы, чтобы скрипт обновления мог продолжить работу
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Теперь мы можем вызвать эту обработку из командной строки перед основным этапом обновления:
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" ENTERPRISE /S "Server\BaseName" /N "Admin" /P "Password" /Execute "C:\Scripts\ConfirmLegality.epf" /DisableStartupMessages
Рассмотрим ситуацию, когда вы пишете собственный "обновлятор" на языке Python. Мы можем подключиться к базе через COM-объект и вызвать необходимые процедуры. Важно помнить, что в серверной базе простого вызова метода может быть недостаточно — нужно убедиться, что изменения зафиксированы.
Пример реализации на Python с использованием библиотеки win32com.client:
import win32com.client
def confirm_1c_legality(connection_string):
connector = win32com.client.Dispatch("V83.COMConnector")
try:
# Подключаемся к базе
base = connector.Connect(connection_string)
# Вызываем метод подтверждения легальности из БСП
base.ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()
print("Подтверждение записано успешно")
except Exception as e:
print(f"Произошла ошибка: {e}")
# Пример строки подключения для серверной базы
conn_str = 'Srvr="ServerName";Ref="BaseName";Usr="Admin";Pwd="Pass";'
confirm_1c_legality(conn_str)
Выясним причину, почему иногда этот код "как будто не срабатывает": в некоторых релизах БСП подтверждение привязано к конкретной версии конфигурации. Если вы вызываете этот код после того, как конфигурация уже была обновлена в Конфигураторе, но до первого запуска в режиме Предприятия, это наиболее эффективный момент.
Посмотрим на менее известный, но встроенный в современные платформы 1С функционал. В последних версиях платформы 8.3 реализована поддержка ключа командной строки, который автоматически подтверждает легальность. Попробуем дополнить вашу стандартную строку запуска следующим образом:
START /B /WAIT "" "8.3.20.2184\bin\1cv8.exe" Enterprise /S "ID сервера\НазваниеИБ" /N "Admin" /P "Pass" /ConfirmUpdateLegality /DisableStartupMessages /C "ВыполнитьОбновлениеИЗавершитьРаботу"
Важно: Данный ключ работает не во всех версиях БСП, поэтому если он не дает эффекта, вернитесь к Решению 1, предварительно выполнив очистку кэша 1С.
Разберем "костыльный", но иногда спасительный метод, если другие программные способы недоступны по соображениям безопасности или прав доступа. Этот метод заключается в перехвате активного окна 1С и программной отправке нажатия клавиши Space (Пробел) или Enter.
Создадим скрипт PowerShell:
$wshell = New-Object -ComObject WScript.Shell
# Ждем запуска программы и появления окна (время подбирается экспериментально)
Start-Sleep -Seconds 40
# Активируем окно по заголовку
$wshell.AppActivate('1С:Предприятие')
Start-Sleep -Seconds 2
# Посылаем Пробел для установки галочки и TAB для перехода к кнопке ОК
$wshell.SendKeys(" ")
Start-Sleep -Seconds 1
$wshell.SendKeys("{TAB}")
Start-Sleep -Seconds 1
$wshell.SendKeys("{ENTER}")
Мы крайне не рекомендуем использовать этот метод в промышленной эксплуатации, так как любое всплывающее уведомление (например, от антивируса или системное сообщение) может увести фокус с окна 1С, и скрипт не сработает или нажмет кнопки в другом приложении.
Для стабильной автоматизации обновления большого количества серверных баз 1С:
ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений()./Execute./DisableStartupDialogs и /DisableStartupMessages, чтобы минимизировать появление лишних диалогов.Такой подход позволит вам полностью исключить ручное вмешательство в процесс обновления и обеспечит надежную работу.