Как программно применить обновления к информационной базе 1С?

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

Автоматизация обслуживания множества информационных баз 1С — задача, с которой рано или поздно сталкивается любой системный администратор или ведущий разработчик крупной компании. Использование сторонних утилит вроде «Обновлятора» оправдано не всегда, особенно если требуется встроить процесс обновления в собственную экосистему на .NET (C#) или Python. В этой статье мы подробно разберем, как реализовать программное завершение обновления базы данных после того, как конфигурация уже была «накатана» через командную строку.

Процесс обновления 1С состоит из двух этапов: обновление метаданных в конфигураторе (через ключ /UpdateDBCfg) и выполнение обработок обновления непосредственно в режиме предприятия. Именно на втором этапе возникают основные сложности: необходимость подтверждения «легальности получения обновления» и запуск процедур обновления информационной базы (ИБ). Разберем, как решить эти задачи программно.

Вызов процедур обновления через COM-коннектор

После того как мы применили файл обновления (.cf или .cfu) к базе через командную строку, нам необходимо заставить систему выполнить внутренние процедуры обработки данных. Посмотрим на код, который позволяет сделать это через COM-соединение. Важно учитывать, что методы различаются в зависимости от поколения конфигурации.

Для современных конфигураций на базе БСП (Бухгалтерия предприятия 3.0, ЗУП 3.1, ERP) алгоритм выглядит следующим образом:


// Подключаемся к базе
var connectString = @"File='C:\DB\Trade';Usr='Admin';Pwd='123';";
var connectorType = Type.GetTypeFromProgID("V83.COMConnector");
dynamic connectorInst = Activator.CreateInstance(connectorType);
dynamic connection = connectorInst.Connect(connectString);

// Запускаем обновление ИБ
connection.ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы();

// Подтверждаем легальность получения обновлений программно
connection.ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений();

Если же вы работаете со старыми конфигурациями (БП 2.0, ЗУП 2.5), процедура инициируется через создание обработки:


connection.Обработки.ОбновлениеИнформационнойБазы.Создать().ВыполнитьОбновление();

Обход окна подтверждения легальности обновления

Часто при программном запуске база «зависает» на модальном окне с требованием подтвердить легальность обновления. Проанализируем ситуацию: это окно вызывается на стороне клиента. Чтобы избежать его появления без правки кода самой конфигурации, мы можем использовать параметры запуска командной строки.

Рассмотрим пример формирования строки запуска, который позволяет обойти интерактивные проверки за счет ключа -server и параметра РазрешитьРаботуПользователей:

Параметры командной строки:

  1. ENTERPRISE — запуск в режиме предприятия.
  2. /CРазрешитьРаботуПользователей — специальный параметр, который многие типовые конфигурации считывают для подавления блокирующих окон при обновлении.
  3. -server — ключ, имитирующий работу в серверном режиме, что заставляет код 1С игнорировать некоторые клиентские вызовы (например, #Если Клиент Тогда).

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


ОбновлениеИнформационнойБазыСлужебный.УстановитьЗапускОбновленияИнформационнойБазы(Истина);
ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы();
ОбновлениеИнформационнойБазыСлужебный.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений();

Проблема «исчезающих» прав администратора

Выясним причину одной из самых неприятных ошибок: после успешного обновления администратор теряет доступ к базе (ошибка «Нарушение прав доступа»). В типовых конфигурациях это часто связано с механизмом Профилей групп доступа. При обновлении справочника Пользователи БСП может перезаписать роли пользователя в соответствии с его профилем, и если прямые роли были назначены в конфигураторе вручную, они будут стерты.

Чтобы восстановить права через тот же COM-коннектор, используем объект ПользователиИнформационнойБазы. Разберем пример восстановления ролей ПолныеПрава и АдминистраторСистемы:


var userIB = connection.ПользователиИнформационнойБазы.НайтиПоИмени("Администратор");
userIB.Роли.Добавить(connection.Метаданные.Роли.ПолныеПрава);
userIB.Роли.Добавить(connection.Метаданные.Роли.АдминистраторСистемы);
userIB.Записать();

Важный совет: Чтобы избежать этой проблемы в будущем, лучше программно добавлять пользователя в соответствующую Группу доступа («Администраторы»), а не назначать роли напрямую. Тогда механизм БСП сам корректно обновит состав ролей при следующем запуске.

Блокировка соединений и регламентных заданий

Проанализируем еще один важный аспект — монопольный доступ. Перед началом обновления необходимо выгнать всех пользователей и остановить фоновые задачи. Рассмотрим, как это сделать программно через параметры администрирования кластера:


// Настройка параметров блокировки (БСП)
var paramsAdmin = connection.АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера();
paramsAdmin.ТипПодключения = "COM";

var lockSettings = connection.АдминистрированиеКластераКлиентСервер.СвойстваБлокировкиСеансовИРегламентныхЗаданий();
lockSettings.БлокировкаСеансов = Истина;
lockSettings.БлокировкаРегламентныхЗаданий = Истина;
lockSettings.КодРазрешения = "UpdatePassword123"; // Код для входа во время блокировки

connection.АдминистрированиеКластераCOMКлиентСервер.УстановитьБлокировкуСеансовИЗаданийИнформационнойБазы(clusterParams, dbParams, lockSettings);

После завершения всех процедур обновления ВыполнитьОбновлениеИнформационнойБазы, не забудьте снять блокировку, установив свойства БлокировкаСеансов и БлокировкаРегламентныхЗаданий в значение Ложь.

Особенности работы на разных ОС

Посмотрим на ограничения: использование COMConnector (объекта V83.COMConnector) возможно только в среде Windows. Если ваш сервер 1С работает под управлением Linux, использование COM-объектов из внешнего приложения на C# станет невозможным.

В этом случае рассмотрим альтернативу: использование утилиты RAC (Remote Administration Client). Она позволяет управлять блокировками и сессиями через консоль или TCP-запросы, что является кроссплатформенным решением. Однако само «финализирование» обновления ИБ (вызов процедур 1С) все равно придется выполнять либо через запуск тонкого/толстого клиента с параметрами, либо через HTTP-сервисы, если они заранее опубликованы в базе.

Резюме по шагам для полной автоматизации

  1. Завершение сеансов: программно устанавливаем блокировку через АдминистрированиеКластера.
  2. Обновление конфигурации: запускаем 1cv8.exe с параметрами DESIGNER /UpdateDBCfg.
  3. Подключение по COM: заходим в базу под администратором с использованием КодРазрешения (UC).
  4. Выполнение процедур: вызываем ВыполнитьОбновлениеИнформационнойБазы() и подтверждаем легальность.
  5. Проверка прав: при необходимости восстанавливаем роли ПользователюИБ.
  6. Снятие блокировки: возвращаем базу в общий доступ.

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

← На главную