В современной практике администрирования и разработки на платформе «1С:Предприятие 8.3» часто возникает задача автоматизации обслуживания сотен или даже тысяч информационных баз. Ручная установка и обновление расширений конфигурации (файлов .cfe) в каждую базу через Конфигуратор отнимает много времени и повышает риск человеческой ошибки. Разработчики часто создают специальные административные обработки, которые по списку баз выполняют различные регламентные действия: создание резервных копий, обновление конфигураций, управление пользователями и, конечно, установку расширений.
В данной статье мы подробно разберем, как программно подключиться к удаленной информационной базе и загрузить в нее расширение, проанализируем возникающие ошибки (например, недоступность свойства Name для записи), изучим альтернативные методы автоматизации через командную строку и режим агента, а также рассмотрим важные нюансы интеграции с Библиотекой стандартных подсистем (БСП) и вопросы безопасности данных.
Этот способ является классическим и наиболее гибким, когда необходимо выполнить установку «на лету» непосредственно из кода вашей административной обработки. Мы подключаемся к удаленной базе данных через 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-подключение, должен обладать административной ролью Администрирование расширений конфигурации или полными правами.
Если по каким-то причинам использование COM-соединения невозможно (например, базы работают в среде Linux, где COM-технология не поддерживается на уровне операционной системы), мы можем использовать пакетный запуск Конфигуратора через командную строку. Этот метод надежен и часто применяется в скриптах автоматизации (PowerShell, Bash, Python) или вызывается из 1С с помощью метода ЗапуститьПриложение().
Для загрузки и активации расширения нам понадобятся два последовательных шага в командной строке:
Используется параметр /LoadCfg с обязательным указанием ключа -Extension для работы с конкретным расширением.
1cv8.exe DESIGNER /F "C:\Bases\TargetBase" /N "Admin" /P "Password" /LoadCfg "C:\Ext\MyExt.cfe" -Extension "ИмяРасширения"
После загрузки изменений их необходимо применить к физической структуре базы данных (СУБД). Для этого используется ключ /UpdateDBCfg.
1cv8.exe DESIGNER /F "C:\Bases\TargetBase" /N "Admin" /P "Password" /UpdateDBCfg -Extension "ИмяРасширения"
Проанализируем эти параметры. Если расширения с указанным именем еще не существует в базе, команда /LoadCfg автоматически создаст пустой контейнер с этим именем и загрузит туда метаданные. Если расширение уже существовало, оно будет обновлено.
Начиная с версии платформы 8.3.14, разработчикам доступен современный и производительный инструмент — Режим агента конфигуратора (параметр запуска /AgentMode). Этот режим позволяет запустить Конфигуратор как фоновую службу (SSH-сервер), которая принимает команды в формате JSON или через специальную консоль CLI.
Для работы с расширениями в режиме агента используются следующие CLI-команды:
config extensions create --extension="ИмяРасширения" — создание нового пустого контейнера под расширение;config extensions load --extension="ИмяРасширения" --file="C:\Ext\MyExt.cfe" — загрузка метаданных из файла;config extensions properties set --extension="ИмяРасширения" --active=true --safe-mode=false — программное управление свойствами активности и безопасности;config db update --extension="ИмяРасширения" — применение изменений расширения к базе данных.Этот способ является стандартом для построения современных CI/CD-процессов (непрерывной интеграции и доставки), поскольку он работает значительно быстрее классического открытия Конфигуратора и позволяет получать структурированные JSON-ответы о результатах выполнения операций.
Просто установить расширение на уровне платформы 1С часто бывает недостаточно, если целевая конфигурация построена на базе БСП (а это практически все типовые решения: ERP, УТ, КА, БП, ЗУП). БСП жестко контролирует состав расширений для обеспечения безопасности, ведения журналов регистрации, разграничения прав доступа и корректной работы механизмов обновления.
Если установить расширение «втихую» на уровне платформы, то при запуске пользователи могут столкнуться со следующими проблемами:
Для того чтобы БСП корректно распознала новое расширение, после его программной установки необходимо инициировать процедуру обновления метаданных БСП. Выполнить это можно следующими способами:
/C ЗапуститьОбновлениеИнформационнойБазы.
// Код выполняется в контексте целевой базы данных
Попытка
УстановитьПривилегированныйРежим(Истина);
Справочники.ВерсииРасширений.ЗаполнитьВерсииРасширений();
Константы.ПараметрыРаботыПрограммы.СоздатьМенеджерЗначения().УстановитьПрогрессОбновления(Неопределено);
ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы();
Исключение
ЗаписьЖурналаРегистрации("ОбновлениеБСП", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Рассмотрим ситуацию, когда установленное расширение содержит собственные объекты метаданных (например, новые справочники, документы или регистры сведений), в которых пользователи уже начали вести учет.
Здесь важно четко разделять два действия:
Активно = Ложь или снятие флажка в интерфейсе):
В этом случае данные физически остаются в таблицах СУБД. Объекты метаданных становятся невидимыми для пользователей и прикладного кода, но физического удаления таблиц не происходит. При обратном включении активности все данные снова станут доступны без потерь.
Если вы вызываете метод Удалить() или используете команду удаления, платформа 1С инициирует реструктуризацию базы данных. Все таблицы СУБД, принадлежащие объектам этого расширения, будут безвозвратно удалены вместе со всей накопленной информацией. При интерактивном удалении платформа выдаст предупреждение, но при программном удалении через COM-соединение или командную строку этот процесс пройдет молча и автоматически. Будьте крайне осторожны при написании скриптов удаления!
Таким образом, автоматизация управления расширениями — это мощный инструмент администратора, требующий понимания механизмов платформы, соблюдения прав доступа и учета особенностей интеграции с БСП.