Как автоматически подтвердить легальность обновления 1С в серверной базе через командную строку

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При массовом обновлении информационных баз 1С (особенно в серверном варианте) системные администраторы и программисты часто сталкиваются с тем, что процесс прерывается модальным окном "Подтверждение легальности получения обновления". Это окно требует интерактивного нажатия кнопки "Да", что делает невозможным полную автоматизацию процесса через планировщик задач или скрипты. В этой статье мы разберем, почему это происходит и какими способами можно программно подтвердить легальность, не открывая программу вручную.

Причина возникновения окна подтверждения

В конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), механизм обновления включает в себя проверку правомерности использования программного продукта. Для файловых баз передача параметра /C "ВыполнитьОбновлениеИЗавершитьРаботу" часто срабатывает корректно, так как весь процесс происходит в рамках одного сеанса. Однако в серверных базах 1С разделяет клиентский сеанс и фоновые задания на сервере. Если признак легальности не установлен в базе данных, сервер блокирует выполнение кода обновления до тех пор, пока пользователь не подтвердит свои права в интерфейсе.

Решение 1: Использование внешней обработки (.epf)

Проанализируем самый надежный и профессиональный метод — использование внешней обработки, которая программно устанавливает флаг легальности перед запуском самого обновления. Этот метод хорош тем, что он не требует изменения основной конфигурации (что важно для типовых решений) и работает непосредственно через командную строку.

Создадим внешнюю обработку (например, 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

Решение 2: Использование COM-соединения (через Python или VBS)

Рассмотрим ситуацию, когда вы пишете собственный "обновлятор" на языке 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)

Выясним причину, почему иногда этот код "как будто не срабатывает": в некоторых релизах БСП подтверждение привязано к конкретной версии конфигурации. Если вы вызываете этот код после того, как конфигурация уже была обновлена в Конфигураторе, но до первого запуска в режиме Предприятия, это наиболее эффективный момент.

Решение 3: Параметр запуска /ConfirmUpdateLegality

Посмотрим на менее известный, но встроенный в современные платформы 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С.

Решение 4: Эмуляция нажатия клавиш через PowerShell

Разберем "костыльный", но иногда спасительный метод, если другие программные способы недоступны по соображениям безопасности или прав доступа. Этот метод заключается в перехвате активного окна 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С:

  1. Используйте метод ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений().
  2. Внедряйте этот вызов либо через COM-соединение в вашем скрипте на Python/C#, либо через внешнюю обработку, запускаемую с ключом /Execute.
  3. Всегда используйте параметры /DisableStartupDialogs и /DisableStartupMessages, чтобы минимизировать появление лишних диалогов.

Такой подход позволит вам полностью исключить ручное вмешательство в процесс обновления и обеспечит надежную работу.

← На главную