В процессе автоматизации задач CI/CD, регулярных сборок или создания вспомогательных внешних обработок разработчики часто сталкиваются с необходимостью выгрузить последнюю версию конфигурации из хранилища в виде файла .cf. Платформа 1С:Предприятие не предоставляет отдельной автономной утилиты для прямого обращения к хранилищу: выгрузка файла конфигурации возможна только через запуск Конфигуратора в пакетном режиме, для которого в обязательном порядке требуется указать существующую информационную базу.
Заводить для таких задач постоянную базу данных вручную через диалог запуска неудобно, а хранить чистый шаблон файла 1Cv8.1CD в макете двоичных данных не всегда практично из-за привязки к конкретной версии формата и раздувания размера внешней обработки. Разберем, как решить эту задачу чисто и надежно с помощью стандартных механизмов платформы.
Проанализируем ключевые моменты взаимодействия с хранилищем конфигурации через командную строку:
DESIGNER требует указания параметра подключения к базе (файлового ключа /F или клиент-серверного /S). Без этого Конфигуратор не запустится.ibases.v8i), временную базу можно создать на диске в «скрытом» режиме, не регистрируя ее в общем перечне.Для создания новой информационной базы платформа предоставляет специальный режим запуска — параметр CREATEINFOBASE. Разберем синтаксис этой команды для командной строки:
"C:\Program Files\1cv8\8.3.24.1667\bin\1cv8.exe" CREATEINFOBASE File="C:\Temp\TempIB"; /Out "C:\Temp\create.log"
Рассмотрим подробнее используемые параметры:
CREATEINFOBASE — служебный режим запуска исполняемого файла 1cv8.exe, инициирующий генерацию новой базы.File="C:\Temp\TempIB"; — строка соединения с базой. Каталог должен быть предварительно создан и быть пустым (в нем не должно находиться файла 1Cv8.1CD)./AddInList: Если мы опускаем ключ /AddInList, платформа создает базу исключительно в файловой системе, не добавляя строку о ней в окно запуска 1С. Это именно то поведение, которое необходимо для временной служебной базы./Out — перенаправление вывода информационных сообщений и ошибок процесса в текстовый лог-файл, что критически важно для фоновых сценариев.После того как пустая файловая база создана, выполним пакетный запуск Конфигуратора для получения актуального слепка конфигурации из хранилища. Запуск выполняется в режиме DESIGNER со следующими параметрами:
"C:\Program Files\1cv8\8.3.24.1667\bin\1cv8.exe" DESIGNER /F "C:\Temp\TempIB" /DisableStartupMessages /ConfigurationRepositoryF "tcp://server/repo" /ConfigurationRepositoryN "User" /ConfigurationRepositoryP "Password" /ConfigurationRepositoryDumpCfg "C:\Temp\dump.cf" -v -1 /Out "C:\Temp\dump.log" /DumpResult "C:\Temp\result.txt"
Выясним назначение ключевых параметров выгрузки:
/ConfigurationRepositoryF — путь к хранилищу конфигурации. Это может быть сетевой каталог или адрес службы сервера хранилища конфигурации (по протоколу TCP или HTTP)./ConfigurationRepositoryN и /ConfigurationRepositoryP — учетная запись и пароль пользователя хранилища. У пользователя должны быть права на чтение конфигурации./ConfigurationRepositoryDumpCfg — прямое указание пути, куда требуется сохранить результирующий файл .cf. Дополнительный ключ -v -1 явно указывает Конфигуратору выгрузить самую последнюю (актуальную) версию хранилища./DisableStartupMessages — подавляет отображение модальных окон при старте, чтобы выполнение сценария не зависло в неинтерактивном режиме./DumpResult — указывает путь к файлу, в который платформа запишет код завершения операции (0 — успешно, иное число — ошибка).Объединим все шаги в единый алгоритм, который можно встроить в кнопку внешней обработки или регламентное задание. Для синхронного запуска внешних процессов платформы используем функцию ЗапуститьПриложение:
// Определим пути и параметры
ПутьКПлатформе = """" + КаталогПрограммы() + "1cv8.exe""";
КаталогВременнойБазы = ПолучитьИмяВременногоФайла();
СоздатьКаталог(КаталогВременнойБазы);
ФайлКонфигурации = "C:\Deploy\LatestConfiguration.cf";
АдресХранилища = "tcp://storage-server/repo_main";
ИмяПользователя = "DevBot";
ПарольПользователя = "StrongPassword123";
КодВозврата = 0;
// Шаг 1. Создание пустой файловой базы
СтрокаСоздания = СтрШаблон("%1 CREATEINFOBASE File=""%2"";", ПутьКПлатформе, КаталогВременнойБазы);
ЗапуститьПриложение(СтрокаСоздания, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
ВызватьИсключение СтрШаблон("Не удалось создать временную базу. Код ошибки: %1", КодВозврата);
КонецЕсли;
// Шаг 2. Выгрузка последней версии из хранилища
СтрокаВыгрузки = СтрШаблон(
"%1 DESIGNER /F ""%2"" /DisableStartupMessages /ConfigurationRepositoryF ""%3"" /ConfigurationRepositoryN ""%4"" /ConfigurationRepositoryP ""%5"" /ConfigurationRepositoryDumpCfg ""%6"" -v -1",
ПутьКПлатформе,
КаталогВременнойБазы,
АдресХранилища,
ИмяПользователя,
ПарольПользователя,
ФайлКонфигурации
);
ЗапуститьПриложение(СтрокаВыгрузки, , Истина, КодВозврата);
// Шаг 3. Удаление временной базы
УдалитьФайлы(КаталогВременнойБазы);
Если КодВозврата = 0 Тогда
Сообщить("Выгрузка конфигурации из хранилища успешно завершена.");
Иначе
ВызватьИсключение СтрШаблон("Ошибка при выгрузке конфигурации из хранилища. Код ошибки: %1", КодВозврата);
КонецЕсли;
Посмотрим на важные нюансы работы этого кода:
ПолучитьИмяВременногоФайла() гарантирует уникальность пути во временной директории ОС, что исключает конфликты при параллельном запуске нескольких экземпляров скрипта.ЗапуститьПриложение установлен в Истина: процедура ожидает фактического завершения создания базы и выгрузки файлов перед переходом к следующей строке.