
Автоматизация
Пайплайн — для цепочки шагов, хук — для одной команды.
Два способа не повторять одни и те же шаги руками:
- Пайплайны — цепочка шагов, которую запускают явно: подготовить базу, загрузить конфигурацию, прогнать тесты. Собирается в визуальном редакторе.
- Хуки команд — шаги, которые выполняются сами вокруг любой команды расширения: до неё, после неё или при ошибке.
При включённом Docker команды расширения внутри цепочек и хуков выполняются в контейнере, как и при обычном запуске. Командные строки блоков shell и шаги хуков выполняются на хосте: это произвольные команды пользователя (git, npm, oscript), их расширение в контейнер не заворачивает.
Оба живут в группе Автоматизация дерева «1С: Инструменты»: Редактор пайплайнов, сохранённые цепочки, Редактор хуков и команды с заданными хуками. Клик по цепочке открывает её в редакторе, запуск - кнопкой ▶ в строке.
Хранилище - служебные файлы проекта .1cpt/pipelines.json и .1cpt/hooks.json. Файлы - источник истины: их правят и редактором, и руками, схемы подсказывают поля и допустимые команды.
Редакторы устроены одинаково: список сущностей слева с крестиком удаления в строке, панель действий сверху, панель сохранения снизу (Отменить, Сохранить, Ctrl+S). Правки применяются к файлу только при сохранении. Открытый из проводника JSON остаётся JSON: редактор вызывается кнопкой в правом верхнем углу.
Пайплайны
Пайплайн - граф шагов: блоки выполняются по связям, а ветка выбирается по исходу предыдущего блока. Типовое обновление рабочей базы: запретить сеансы, завершить оставшиеся, загрузить конфигурацию, обновить базу, разрешить сеансы; при падении загрузки - собрать отчёт и разрешить сеансы обратно. Загрузка и обновление конфигурации БД - разные шаги: configuration.loadFromSrc и infobase.updateInfobase. Чтобы сделать оба действия одним запуском, шагу загрузки задают параметр updateDb: "options": {"updateDb": true}.
Редактор
Окно редактора: слева палитра действий и каталог команд с поиском; в центре полотно с блоками; справа свойства выделенного блока, а под ними список цепочек со своим прокручиванием. Палитра появляется, когда цепочка выбрана.
- Клик по действию в палитре ставит блок на полотно и цепляет его к предыдущему; блок красится в цвет своей группы команд, поэтому конфигурация, расширения и сеансы различаются на глаз.
- Блок таскается мышью, полотно двигается перетаскиванием пустого места, масштаб - колесом или кнопками в углу.
- Связь тянется от порта справа к любому блоку: зелёный порт - переход при успехе, красный - при ошибке. Условие связи меняется в свойствах блока-приёмника, там же доступен вариант «в любом случае».
- Клавиша Delete удаляет выделенный блок или выделенную связь, Ctrl+D копирует блок вместе с параметрами: один и тот же шаг можно поставить в цепочку несколько раз.
- Панель действий сверху: Запустить, Разложить (блоки по потоку), JSON (тот же файл текстом). Цепочка удаляется крестиком в строке списка слева, блок - кнопкой в свойствах или клавишей Delete. Масштаб - кнопками в правом нижнем углу.
- Правки живут в форме, пока их не сохранили: внизу появляется панель с кнопками Отменить и Сохранить (Ctrl+S тоже работает). Запуск сначала сохраняет цепочку: прогоняется то, что записано в файле.
Во время прогона блоки подсвечиваются: синий - выполняется, зелёный - выполнен, красный - упал. По итогу цепочки приходит один сигнал со звуком - шаги внутри о себе не сообщают (см. сигнал о завершении).
Типовые цепочки
Команда Типовые пайплайны в группе «Служебные файлы», рядом с файлом цепочек, ставит в проект готовые цепочки, поставляемые с расширением: развёртывание базы, обновление рабочей, прогон тестов, сборка поставки, выгрузка в исходники. Выбираются списком, сразу несколько. Дальше это обычные цепочки проекта.
Повторная установка обновляет цепочки шаблонов, даже если их переименовали. Остальные цепочки проекта, включая правленые руками, остаются нетронутыми.
Шаги с расширениями в цепочке идут по всем расширениям проекта: окно выбора в прогоне не открыть, а запомненный ранее выбор может не совпасть с текущим составом.
Виды блоков
| Блок | Что делает |
|---|---|
| Команда расширения | Вызывает команду из каталога с параметрами вызова, как из панели |
| Команда оболочки | Выполняет командную строку в корне проекта, с необязательным ограничением времени |
| Пауза с подтверждением | Спрашивает пользователя, продолжать ли; в запуске от агента завершается ошибкой |
Блок можно выключить: он останется в графе, будет пропущен, а ветка успеха пойдёт дальше. Блок с признаком «ждать все входящие ветки» дождётся всех веток, которые ещё могут сработать; без признака он выполняется по первой пришедшей.
Формат файла
{
"version": 2,
"pipelines": [
{
"id": "before-update",
"name": "Подготовка к обновлению",
"nodes": [
{ "id": "lock", "type": "command", "command": "1c-platform-tools.session.lock", "options": { "lockMessage": "Идёт обновление" }, "x": 60, "y": 60 },
{ "id": "load", "type": "command", "command": "1c-platform-tools.cf.load", "x": 330, "y": 60 },
{ "id": "unlock", "type": "command", "command": "1c-platform-tools.session.unlock", "x": 600, "y": 60 },
{ "id": "report", "type": "shell", "script": "git status --short", "x": 330, "y": 190 }
],
"edges": [
{ "from": "lock", "to": "load" },
{ "from": "load", "to": "unlock" },
{ "from": "load", "to": "report", "on": "error" },
{ "from": "report", "to": "unlock" }
]
}
]
}| Поле | Смысл |
|---|---|
id | Идентификатор для запуска командой и агентом |
name | Название в панели и редакторе |
nodes[].type | command, shell или confirm; без поля - команда расширения |
nodes[].command, nodes[].options | Команда расширения и параметры её вызова |
nodes[].script, nodes[].timeout | Командная строка и ограничение времени в секундах |
nodes[].message | Вопрос для паузы с подтверждением |
nodes[].enabled | false - блок пропускается |
nodes[].timeout | Ограничение времени шага в секундах |
nodes[].retry | Сколько раз повторить упавший шаг перед тем, как считать его ошибкой |
nodes[].join | all - ждать все входящие ветки |
nodes[].x, nodes[].y | Положение на полотне |
edges[].on | success (по умолчанию), error или always |
params | Параметры цепочки: подставляются в шаги записью |
Прогон начинается с блоков без входящих связей и идёт, пока есть готовые блоки. Блок считается упавшим по результату команды; команды, которые исход не возвращают (открытие окон, запуск Предприятия), всегда успешны. Упавший блок без ветки error или always останавливает свою ветку, а обработанное падение не делает прогон успешным: итог остаётся ошибкой.
Перед запуском граф проверяется: пустой граф, отсутствие начального блока, блоки без пути и блоки с незаданным действием. Замечание видно в свойствах цепочки строкой «Цепочка не запустится: …», блоки без пути обведены на полотне, незаполненный блок обведён пунктиром. Незаполненный блок сохраняется вместе с остальными.
Параметры цепочки
В свойствах цепочки задаются параметры строками имя=значение. Запись подставляется в командную строку блока, в вопрос паузы и в параметры вызова команды - одна цепочка работает и на рабочем профиле, и на тестовом:
{
"id": "deploy",
"name": "Развернуть",
"params": { "profile": "test" },
"nodes": [
{ "id": "load", "type": "command", "command": "1c-platform-tools.cf.load", "options": { "settingsFile": "env.{{profile}}.json" } },
{ "id": "tag", "type": "shell", "script": "git tag deploy-{{profile}}" }
],
"edges": [{ "from": "load", "to": "tag" }]
}Неизвестное имя остаётся в тексте как есть: опечатка видна в выводе шага, а не превращается в пустую строку.
Повтор и ограничение времени
У блока есть timeout (секунды) и retry - число повторов упавшего шага. Повтор нужен там, где падение бывает не по вине шага: занятая база, сеть, конкурентная сборка. В отчёте у такого шага видно число попыток.
Отчёт прогона
Кнопка Отчёт в панели действий показывает итог последнего прогона: строка на каждый шаг с исходом, числом попыток и временем, снизу общее время. Отчёт появляется сам по завершении прогона и закрывается крестиком. Полный текст с выводом упавших шагов остаётся в журнале расширения.
Запуск
- Из дерева: кнопка запуска в строке цепочки, группа Автоматизация (клик по названию открывает редактор).
- Из палитры: 1С: Пайплайны: Запустить со списком цепочек.
- Из редактора: кнопка Запустить.
- Агентом: команда
1c-platform-tools.pipelines.runс параметромpipeline(идентификатор или название). - Задачей VS Code: цепочки видны в Tasks: Run Task и описываются в
tasks.jsonтипом1c-pipeline- можно повесить горячую клавишу или включить в составную задачу.
{
"type": "1c-pipeline",
"pipeline": "deploy",
"label": "1С: Развернуть базу"
}Ход прогона виден в панели прогресса, там же его можно отменить: остановка сработает перед следующим блоком.
Блоки выполняются без терминала: в журнал расширения пишется отчёт по шагам, у упавшего - последняя строка вывода. Запуск Предприятия и Конфигуратора шагом цепочки идёт так же, а результат шага означает, удалось ли стартовать. Хуки pre/post/onError отрабатывают в обоих случаях.
Хуки команд
Хуки позволяют выполнять произвольные команды оболочки до и после команд 1C: Platform Tools. Типовой кейс: перед заливкой исходников в ИБ автоматически поправить код, а после (или при ошибке) — вернуть исходники как было.
Хуки настраиваются в файле .1cpt/hooks.json в корне проекта, без привязки к профилю запуска. В отличие от пайплайна, хук не запускают: он срабатывает сам, когда выполняется команда.
Редактор
Редактор открывает .1cpt/hooks.json формой: слева команды с хуками и кнопка + (выбор команды из каталога или вариант «Все команды»), справа три раздела - До команды, После команды, При ошибке. В разделе шаги идут по порядку: командная строка, флаг «продолжать после ошибки», таймаут; шаги двигаются стрелками. Кнопка Проверить выполняет шаги фазы, не запуская саму команду: вывод показывается тут же, под шагами.
Файл создаётся сам при первом открытии редактора. Он также входит в служебные файлы: раздел Служебные файлы → 1cpt: hooks, либо палитра «1С: Служебные файлы: Создать…».
Формат файла хуков
{
"$schema": "https://raw.githubusercontent.com/yellow-hammer/vscode-1c-platform-tools/main/resources/schemas/hooks.schema.json",
"version": 1,
"hooks": {
"1c-platform-tools.cf.load": {
"pre": "node ./tools/rename-interface.js --to evERP",
"post": "git checkout -- src/cf",
"onError": "git checkout -- src/cf"
},
"*": {
"pre": "echo before any command"
}
}
}Ключ хука — VS Code command id вида 1c-platform-tools.<домен>.<действие> либо "*" (срабатывает на все команды).
Подсказки и валидация работают в редакторе благодаря JSON-схеме (
$schemaпроставляется автоматически при создании файла). Схема знает точный список команд расширения: редактор автодополняет command id и подсвечивает опечатки и устаревшие id. Список генерируется из кода при сборке, поэтому остаётся актуальным при добавлении и переименовании команд.
Фазы
| Фаза | Когда выполняется |
|---|---|
pre | до команды; ненулевой код прерывает команду и запускает onError |
post | после успешной команды (код 0) |
onError | при неуспехе: ненулевой pre, ненулевой код команды или исключение |
Значение фазы
Фаза задаётся одним из трёх способов:
- строка — одна команда оболочки;
- массив — последовательность команд;
- объект —
{ "command": string, "continueOnError"?: boolean, "timeout"?: number }.
{
"hooks": {
"1c-platform-tools.cf.load": {
"pre": [
"node ./tools/rename-interface.js --to evERP",
{ "command": "npm run lint", "continueOnError": true, "timeout": 60 }
]
}
}
}continueOnError: true— ненулевой код шага не прерывает выполнение (дляpre— не отменяет команду).timeout— таймаут шага в секундах (по умолчанию 30).
Отслеживание завершения
post и onError выполняются после фактического завершения команды, даже если она идёт в терминале. Такая команда всегда запускается задачей VS Code, независимо от настройки execution.useTasks.