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

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

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

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

Способ 1. Программное управление расширениями через COM-соединение (внешнее соединение)

Этот способ является классическим и наиболее гибким, когда необходимо выполнить установку «на лету» непосредственно из кода вашей административной обработки. Мы подключаемся к удаленной базе данных через COM-соединение, обращаемся к менеджеру расширений удаленной базы и загружаем файл.

Разберем по шагам логику работы скрипта. Основная сложность, с которой сталкиваются разработчики, — это попытка напрямую присвоить имя создаваемому расширению через свойство Name (Имя). Платформа выдает ошибку: «Поле объекта недоступно для записи (Name)». Выясним причину: имя расширения, его уникальный идентификатор (UUID) и версия зашиты внутри самого двоичного файла .cfe. Мы не можем задать имя «вручную» до загрузки данных. Сначала необходимо записать двоичные данные файла в контейнер расширения, после чего платформа сама извлечет имя и заполнит его.

Рассмотрим пример кода для реализации этой задачи:


Процедура УстановитьРасширениеВУдаленнуюБазу()
    
    // Шаг 1. Инициализируем COM-соединение с целевой базой данных
    Соединитель = Новый COMОбъект("V83.COMConnector");
    
    // Формируем строку подключения (для файлового или клиент-серверного варианта)
    СтрокаПодключения = "File=""C:\Bases\TargetBase"";Usr=""Администратор"";Pwd=""ПарольАдмина"";";
    // Для серверной базы: "Srvr=""ServerName"";Ref=""BaseName"";Usr=""Администратор"";Pwd=""Пароль"";"
    
    Попытка
        БазаПриемник = Соединитель.Connect(СтрокаПодключения);
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось подключиться к базе: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // Шаг 2. Читаем файл расширения .cfe на стороне источника
    ПутьКФайлуCFE = "C:\Extensions\MyFeature.cfe";
    ФайлНаДиске = Новый Файл(ПутьКФайлуCFE);
    Если Не ФайлНаДиске.Существует() Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл расширения не найден по указанному пути!");
        Возврат;
    КонецЕсли;
    
    ДвоичныеДанныеCFE = Новый ДвоичныеДанные(ПутьКФайлуCFE);
    
    // Шаг 3. Передаем двоичные данные через COM-границу
    // Для этого преобразуем их в COMSafeArray или передаем через временное хранилище,
    // но самый надежный способ для внешнего соединения — передача двоичных данных напрямую,
    // так как платформа умеет маршалить объект ДвоичныеДанные.
    
    Попытка
        // Создаем новое расширение в удаленной базе
        НовоеРасширение = БазаПриемник.РасширенияКонфигурации.Создать();
        
        // КРИТИЧЕСКИ ВАЖНО: Записываем двоичные данные в расширение.
        // Именно в этот момент заполняются свойства Name, Синоним и др.
        НовоеРасширение.Записать(ДвоичныеДанныеCFE);
        
        // Шаг 4. Настраиваем свойства расширения, которые ДОСТУПНЫ для записи
        НовоеРасширение.Активно = Истина;
        НовоеРасширение.БезопасныйРежим = Ложь; // Отключаем, если расширению требуются повышенные привилегии
        НовоеРасширение.ЗащитаОтОпасныхДействий = Ложь; // Отключаем предупреждения безопасности при выполнении кода
        
        // Фиксируем изменения в удаленной базе
        НовоеРасширение.Записать();
        
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Расширение успешно установлено и активировано!");
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при установке расширения: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Важное ограничение безопасности: Обратите внимание, что программное отключение безопасного режима (БезопасныйРежим = Ложь) или защиты от опасных действий возможно только в том случае, если сама вызывающая обработка и сеанс COM-соединения запущены с административными правами. Пользователь, под которым выполняется COM-подключение, должен обладать административной ролью Администрирование расширений конфигурации или полными правами.

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

Если по каким-то причинам использование COM-соединения невозможно (например, базы работают в среде Linux, где COM-технология не поддерживается на уровне операционной системы), мы можем использовать пакетный запуск Конфигуратора через командную строку. Этот метод надежен и часто применяется в скриптах автоматизации (PowerShell, Bash, Python) или вызывается из 1С с помощью метода ЗапуститьПриложение().

Для загрузки и активации расширения нам понадобятся два последовательных шага в командной строке:

  1. Загрузка файла расширения в базу данных:

    Используется параметр /LoadCfg с обязательным указанием ключа -Extension для работы с конкретным расширением.

    Пример команды: 1cv8.exe DESIGNER /F "C:\Bases\TargetBase" /N "Admin" /P "Password" /LoadCfg "C:\Ext\MyExt.cfe" -Extension "ИмяРасширения"
  2. Обновление конфигурации базы данных для этого расширения:

    После загрузки изменений их необходимо применить к физической структуре базы данных (СУБД). Для этого используется ключ /UpdateDBCfg.

    Пример команды: 1cv8.exe DESIGNER /F "C:\Bases\TargetBase" /N "Admin" /P "Password" /UpdateDBCfg -Extension "ИмяРасширения"

Проанализируем эти параметры. Если расширения с указанным именем еще не существует в базе, команда /LoadCfg автоматически создаст пустой контейнер с этим именем и загрузит туда метаданные. Если расширение уже существовало, оно будет обновлено.

Способ 3. Использование режима агента (Agent Mode)

Начиная с версии платформы 8.3.14, разработчикам доступен современный и производительный инструмент — Режим агента конфигуратора (параметр запуска /AgentMode). Этот режим позволяет запустить Конфигуратор как фоновую службу (SSH-сервер), которая принимает команды в формате JSON или через специальную консоль CLI.

Для работы с расширениями в режиме агента используются следующие CLI-команды:

Этот способ является стандартом для построения современных CI/CD-процессов (непрерывной интеграции и доставки), поскольку он работает значительно быстрее классического открытия Конфигуратора и позволяет получать структурированные JSON-ответы о результатах выполнения операций.

Интеграция с Библиотекой стандартных подсистем (БСП)

Просто установить расширение на уровне платформы 1С часто бывает недостаточно, если целевая конфигурация построена на базе БСП (а это практически все типовые решения: ERP, УТ, КА, БП, ЗУП). БСП жестко контролирует состав расширений для обеспечения безопасности, ведения журналов регистрации, разграничения прав доступа и корректной работы механизмов обновления.

Если установить расширение «втихую» на уровне платформы, то при запуске пользователи могут столкнуться со следующими проблемами:

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

  1. Запустить сеанс предприятия под учетной записью администратора с параметром запуска: /C ЗапуститьОбновлениеИнформационнойБазы.
  2. Или вызвать этот механизм программно в коде сразу после установки расширения (если вы выполняете это внутри сеанса удаленного подключения):
    
    // Код выполняется в контексте целевой базы данных
    Попытка
        УстановитьПривилегированныйРежим(Истина);
        Справочники.ВерсииРасширений.ЗаполнитьВерсииРасширений();
        Константы.ПараметрыРаботыПрограммы.СоздатьМенеджерЗначения().УстановитьПрогрессОбновления(Неопределено);
        ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы();
    Исключение
        ЗаписьЖурналаРегистрации("ОбновлениеБСП", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
    

Безопасность данных при удалении и отключении расширений

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

Здесь важно четко разделять два действия:

Таким образом, автоматизация управления расширениями — это мощный инструмент администратора, требующий понимания механизмов платформы, соблюдения прав доступа и учета особенностей интеграции с БСП.

← На главную