Как убрать расширение конфигурации из базы без открытия конфигуратора

· 9 мин

Содержание

Удалить расширение конфигурации 1С через командную строку можно одной командой: 1cv8.exe DESIGNER /F"путь к базе" /N"Админ" /P"пароль" /DeleteCfg -Extension ИмяРасширения. Частая ошибка — подставлять в -Extension то, что видно в списке расширений в режиме «1С:Предприятие». Там обычно показан синоним, а команде нужно имя расширения — строка без пробелов, заданная при создании.

Ключ работает в пакетном режиме конфигуратора платформы 8.3, одинаково для Бухгалтерии, ЗУП, УТ и любой другой конфигурации. Нужен только доступ к 1cv8.exe нужной версии и пользователь с правами администратора базы.

Что проверить перед удалением расширения

Пакетный режим не задаёт вопросов. Конфигуратор в интерактиве предупредит, что вместе с расширением пропадут его данные, а командная строка просто выполнит команду. Поэтому всё проверяем заранее.

Права пользователя

Пользователь в /N должен иметь роль с правом «Администрирование» либо «Администрирование расширений конфигурации». Без этого права конфигуратор откажет на этапе входа или на самой операции.

  • 🔑 Если в базе нет ни одного пользователя, /N и /P не указывают.
  • 🔑 Если включена аутентификация Windows и пользователь сопоставлен с учётной записью, под которой запускается скрипт, пароль тоже не нужен.
  • 🔑 Пароли не пишите прямо в bat-файл, который лежит в общей папке. Берите их из переменной окружения, ниже покажу как.

Точное имя расширения

Имя расширения проще всего посмотреть в конфигураторе: Конфигурация → Расширения конфигурации. В списке есть колонки имени и синонима — нужна колонка «Имя».

Если конфигуратор открывать не хочется, имена выведет PowerShell-скрипт из раздела про COM. Он печатает имя, синоним, версию и признак активности каждого расширения.

Резервная копия

Удаление расширения стирает данные его собственных объектов. Если расширение добавляло свои справочники, документы или регистры, их таблицы уйдут вместе с ним. Вернуть их можно только из резервной копии базы.

Минимум — выгрузить само расширение в файл .cfe, чтобы потом загрузить его обратно:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F"D:\Bases\Buh" /N"Admin" /P"%PASS1C%" /DumpCfg "D:\Backup\Dorabotki.cfe" -Extension Dorabotki /Out "D:\Backup\dump.log"

Если у расширения есть свои данные, делайте полную копию: выгрузку .dt (для неё нужен монопольный доступ) или резервную копию средствами СУБД для серверной базы.

Перед запуском команды
Выполнено: 0 / 5

Синтаксис /DeleteCfg для файловой базы

Общая схема команды:

"<путь>\1cv8.exe" DESIGNER /F"<каталог базы>" /N"<пользователь>" /P"<пароль>" /DeleteCfg -Extension <имя> /Out "<лог>"

Рабочий пример для файловой базы в D:\Bases\Buh и расширения Dorabotki:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F"D:\Bases\Buh" /N"Admin" /P"%PASS1C%" /DisableStartupDialogs /DeleteCfg -Extension Dorabotki /Out "D:\Logs\delete_ext.log" -NoTruncate /DumpResult "D:\Logs\delete_ext.res"

Что делает каждый ключ:

КлючНазначение
DESIGNERзапуск конфигуратора, без него команда не сработает
/F"..."каталог файловой базы (где лежит 1Cv8.1CD)
/N, /Pпользователь и пароль базы
/DisableStartupDialogsподавляет стартовые диалоги, чтобы скрипт не завис
/DeleteCfg -Extension <имя>удаляет одно расширение
/DeleteCfg -AllExtensionsудаляет все расширения базы
/Out "..."файл, куда пишутся сообщения конфигуратора
-NoTruncateдописывать в лог, а не перезаписывать его
/DumpResult "..."файл с кодом результата: 0 — успех, иное — ошибка

Путь к 1cv8.exe берите из каталога конкретной версии (...\1cv8\8.3.xx.xxxx\bin\). Через 1cestart.exe пакетный режим тоже запускается, но версию тогда выбирает стартер, и на машине с несколькими платформами это лотерея.

Удаление всех расширений сразу

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F"D:\Bases\Buh" /N"Admin" /P"%PASS1C%" /DeleteCfg -AllExtensions /Out "D:\Logs\delete_all.log"

-AllExtensions уберёт и те расширения, которые ставят обновления конфигурации или сервисы интернет-поддержки. Используйте ключ только на копиях баз и тестовых стендах, где вы точно знаете состав.

Как удалить расширение на сервере 1С

В клиент-серверной базе вместо /F указывают /S"сервер\имя базы". Имя базы — то, под которым она зарегистрирована в кластере, а не имя базы данных в SQL.

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /S"srv1c\buh_prod" /N"Admin" /P"%PASS1C%" /DisableStartupDialogs /DeleteCfg -Extension Dorabotki /Out "D:\Logs\buh_prod.log" /DumpResult "D:\Logs\buh_prod.res"

Если агент сервера слушает нестандартный порт, его пишут через двоеточие: /S"srv1c:2541\buh_prod". Порт по умолчанию — 1540, его указывать не нужно.

Версия платформы на клиенте

Версия 1cv8.exe, из которого вы запускаете команду, должна совпадать с версией сервера 1С. Иначе конфигуратор не подключится к базе. На сервере приложений это обычно не проблема, а вот на рабочей станции администратора часто стоит другая сборка.

Пользователи в базе

Открытые сеансы продолжат работать с тем набором расширений, с которым стартовали. Изменения увидят после переподключения. Поэтому удаление лучше делать в окно обслуживания:

  1. Предупредите пользователей и назначьте время.
  2. Включите блокировку начала сеансов в свойствах базы в консоли кластера и задайте код разрешения.
  3. Запустите команду, добавив /UC <код разрешения>, чтобы конфигуратор прошёл через блокировку.
  4. Снимите блокировку после проверки.

Если для блокировки вы завершаете активные сеансы в консоли кластера, у пользователей оборвётся работа и пропадут несохранённые документы. Делайте это только после предупреждения и в нерабочее время.

Пример с кодом разрешения:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /S"srv1c\buh_prod" /N"Admin" /P"%PASS1C%" /UC 7731 /DeleteCfg -Extension Dorabotki /Out "D:\Logs\buh_prod.log"

Bat-файл для удаления расширения в нескольких базах

Типичная задача: расширение раскатали на двадцать баз, а теперь его нужно убрать везде. Список баз кладём в текстовый файл, по строке на базу:

srv1c\buh_ooo_alfa
srv1c\buh_ooo_beta
srv1c\zup_holding

Скрипт проходит по списку, пишет отдельный лог на каждую базу и печатает итог:

@echo off
setlocal EnableDelayedExpansion

set "V8=C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe"
set "EXT=Dorabotki"
set "USR=Admin"
set "LIST=C:\1c-scripts\bases.txt"
set "LOG=C:\1c-scripts\logs"

if "%PASS1C%"=="" (
  echo Не задана переменная PASS1C
  exit /b 1
)
if not exist "%LOG%" mkdir "%LOG%"

for /f "usebackq delims=" %%B in ("%LIST%") do (
  set "BASE=%%B"
  set "SAFE=!BASE:\=_!"
  set "RES="
  start "" /wait "%V8%" DESIGNER /S"%%B" /N"%USR%" /P"%PASS1C%" /DisableStartupDialogs /DeleteCfg -Extension %EXT% /Out "%LOG%\!SAFE!.log" /DumpResult "%LOG%\!SAFE!.res"
  if exist "%LOG%\!SAFE!.res" set /p RES=<"%LOG%\!SAFE!.res"
  if "!RES!"=="0" (
    echo OK    %%B
  ) else (
    echo ERROR %%B - смотрите %LOG%\!SAFE!.log
  )
)
endlocal

Пояснения к скрипту:

  • 🧩 start "" /wait гарантирует, что следующая база не начнётся, пока не закончилась предыдущая. Параллельный запуск двадцати конфигураторов на одном сервере — плохая идея.
  • 🧩 !BASE:\=_! превращает srv1c\buh_ooo_alfa в имя файла srv1c_buh_ooo_alfa.
  • 🧩 set "RES=" перед каждой итерацией сбрасывает код прошлой базы, иначе упавшая база может показаться успешной.
  • 🧩 Пароль берётся из переменной PASS1C. Задайте её в сеансе перед запуском: set PASS1C=....

Сохраняйте bat-файл в кодировке OEM 866, если в нём есть кириллица (имена расширений, сообщения). В UTF-8 без chcp 65001 командная строка превратит русские буквы в мусор, и -Extension получит не то имя.

Запуск по расписанию

Скрипт можно повесить на планировщик Windows. Задачу запускайте от учётной записи, у которой есть доступ к каталогу логов, и с флагом «Выполнять с наивысшими правами», если логи пишутся в системный каталог. Переменную с паролем в этом случае задайте на уровне учётной записи, а не в сеансе.

Лог и код результата: как понять, что расширение удалено

У пакетного режима два источника правды.

Файл /DumpResult. Одна строка с числом. 0 — команда выполнена, любое другое значение — ошибка. Именно его удобно проверять скриптом.

Файл /Out. Сообщения конфигуратора текстом. Пустой лог при коде 0 — нормальная ситуация. При ошибке там будет причина.

Диагностика: выберите симптом

Контрольная проверка

Код 0 говорит, что команда отработала. Убедиться, что расширения нет, можно двумя способами:

  1. Открыть конфигуратор → Конфигурация → Расширения конфигурации и проверить список.
  2. Запустить PowerShell-скрипт из следующего раздела в режиме вывода списка.

Для пачки баз второй вариант быстрее: скрипт пройдёт по всем базам и покажет, где расширение осталось.

PowerShell и COM-соединение как альтернатива конфигуратору

Пакетный конфигуратор — штатный путь, но не единственный. Через COM-соединение можно удалить или отключить расширение средствами встроенного языка: у объекта РасширениеКонфигурации есть метод Удалить() и свойство Активно.

Подготовка COM-коннектора

На машине, где работает скрипт, должен быть зарегистрирован comcntr.dll той же версии, что сервер 1С. Регистрация из командной строки, запущенной от имени администратора:

regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\comcntr.dll"

Разрядность PowerShell и платформы должна совпадать. 64-битный PowerShell не увидит 32-битный коннектор, и наоборот. Для 32-битной платформы запускайте PowerShell из C:\Windows\SysWOW64\WindowsPowerShell\v1.0\.

Список расширений базы

$connector = New-Object -ComObject "V83.COMConnector"
$conn = $connector.Connect('Srvr="srv1c";Ref="buh_prod";Usr="Admin";Pwd="' + $env:PASS1C + '";')

$exts = $conn.ConfigurationExtensions.Get()
for ($i = 0; $i -lt $exts.Count(); $i++) {
    $e = $exts.Get($i)
    "{0}`t{1}`t{2}`tактивно: {3}" -f $e.Name, $e.Synonym, $e.Version, $e.Active
}

Для файловой базы строка подключения другая: File="D:\Bases\Buh";Usr="Admin";Pwd="...";.

Удаление по имени

$target = "Dorabotki"
$exts = $conn.ConfigurationExtensions.Get()
$found = $false
for ($i = 0; $i -lt $exts.Count(); $i++) {
    $e = $exts.Get($i)
    if ($e.Name -eq $target) {
        $e.Delete()
        $found = $true
        "Удалено: $target"
    }
}
if (-not $found) { "Расширение $target не найдено" }

Отключить, а не удалять

Если не уверены, что расширение больше не понадобится, его можно выключить. Данные останутся, код перестанет применяться у новых сеансов:

$e.Active = $false
$e.Write()

Какой способ выбрать

СпособКогда подходитОграничения
1cv8.exe DESIGNER /DeleteCfgразовое удаление, скрипты обслуживаниянет вывода списка расширений в удобном виде
bat-цикл по списку базодно расширение на много базследите за кодировкой и версией платформы
PowerShell + COMнужен список, проверка, отключениерегистрация comcntr.dll, совпадение разрядности
ibcmdавтономный сервер, базы без кластеранабор команд смотрите в ibcmd help, он отличается от конфигуратора

COM-соединение занимает лицензию и создаёт сеанс в базе. Не оставляйте $conn висеть в долгоживущих скриптах: после работы присвойте переменной $null и вызовите сборку мусора.

Частые вопросы

Можно ли вернуть удалённое расширение?
Да, если сохранили его в .cfe. Загрузите файл командой /LoadCfg "файл.cfe" -Extension Имя, затем выполните /UpdateDBCfg -Extension Имя. Данные собственных объектов расширения вернёт только резервная копия базы.
Нужно ли перезапускать сервер 1С после удаления?
Нет. Достаточно, чтобы пользователи перезашли в программу: расширения подключаются при старте сеанса.
Можно ли запускать удаление с рабочей станции, а не с сервера?
Да. Для серверной базы нужна та же версия платформы, что у сервера 1С, и сетевой доступ к агенту. Для файловой — доступ на запись к каталогу базы.
Что станет с отчётами и печатными формами, которые добавляло расширение?
Они пропадут из меню и команд у пользователей после перезахода. Если на них были настроены рассылки или варианты отчётов, эти настройки перестанут работать.
Можно ли удалить расширение, если в базе работают люди?
Технически команда часто проходит, но открытые сеансы будут работать со старым набором до перезахода. Для расширений со своими данными делайте это только в окно обслуживания.