Skip to content

Автоматизация

Пайплайн — для цепочки шагов, хук — для одной команды.

Два способа не повторять одни и те же шаги руками:

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

При включённом 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 тоже работает). Запуск сначала сохраняет цепочку: прогоняется то, что записано в файле.

Во время прогона блоки подсвечиваются: синий - выполняется, зелёный - выполнен, красный - упал. По итогу цепочки приходит один сигнал со звуком - шаги внутри о себе не сообщают (см. сигнал о завершении).

Типовые цепочки

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

Повторная установка обновляет цепочки шаблонов, даже если их переименовали. Остальные цепочки проекта, включая правленые руками, остаются нетронутыми.

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

Виды блоков

БлокЧто делает
Команда расширенияВызывает команду из каталога с параметрами вызова, как из панели
Команда оболочкиВыполняет командную строку в корне проекта, с необязательным ограничением времени
Пауза с подтверждениемСпрашивает пользователя, продолжать ли; в запуске от агента завершается ошибкой

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

Формат файла

json
{
    "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[].typecommand, shell или confirm; без поля - команда расширения
nodes[].command, nodes[].optionsКоманда расширения и параметры её вызова
nodes[].script, nodes[].timeoutКомандная строка и ограничение времени в секундах
nodes[].messageВопрос для паузы с подтверждением
nodes[].enabledfalse - блок пропускается
nodes[].timeoutОграничение времени шага в секундах
nodes[].retryСколько раз повторить упавший шаг перед тем, как считать его ошибкой
nodes[].joinall - ждать все входящие ветки
nodes[].x, nodes[].yПоложение на полотне
edges[].onsuccess (по умолчанию), error или always
paramsПараметры цепочки: подставляются в шаги записью

Прогон начинается с блоков без входящих связей и идёт, пока есть готовые блоки. Блок считается упавшим по результату команды; команды, которые исход не возвращают (открытие окон, запуск Предприятия), всегда успешны. Упавший блок без ветки error или always останавливает свою ветку, а обработанное падение не делает прогон успешным: итог остаётся ошибкой.

Перед запуском граф проверяется: пустой граф, отсутствие начального блока, блоки без пути и блоки с незаданным действием. Замечание видно в свойствах цепочки строкой «Цепочка не запустится: …», блоки без пути обведены на полотне, незаполненный блок обведён пунктиром. Незаполненный блок сохраняется вместе с остальными.

Параметры цепочки

В свойствах цепочки задаются параметры строками имя=значение. Запись подставляется в командную строку блока, в вопрос паузы и в параметры вызова команды - одна цепочка работает и на рабочем профиле, и на тестовом:

json
{
    "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 - можно повесить горячую клавишу или включить в составную задачу.
jsonc
{
  "type": "1c-pipeline",
  "pipeline": "deploy",
  "label": "1С: Развернуть базу"
}

Ход прогона виден в панели прогресса, там же его можно отменить: остановка сработает перед следующим блоком.

Блоки выполняются без терминала: в журнал расширения пишется отчёт по шагам, у упавшего - последняя строка вывода. Запуск Предприятия и Конфигуратора шагом цепочки идёт так же, а результат шага означает, удалось ли стартовать. Хуки pre/post/onError отрабатывают в обоих случаях.

Хуки команд

Хуки позволяют выполнять произвольные команды оболочки до и после команд 1C: Platform Tools. Типовой кейс: перед заливкой исходников в ИБ автоматически поправить код, а после (или при ошибке) — вернуть исходники как было.

Хуки настраиваются в файле .1cpt/hooks.json в корне проекта, без привязки к профилю запуска. В отличие от пайплайна, хук не запускают: он срабатывает сам, когда выполняется команда.

Редактор

Редактор открывает .1cpt/hooks.json формой: слева команды с хуками и кнопка + (выбор команды из каталога или вариант «Все команды»), справа три раздела - До команды, После команды, При ошибке. В разделе шаги идут по порядку: командная строка, флаг «продолжать после ошибки», таймаут; шаги двигаются стрелками. Кнопка Проверить выполняет шаги фазы, не запуская саму команду: вывод показывается тут же, под шагами.

Файл создаётся сам при первом открытии редактора. Он также входит в служебные файлы: раздел Служебные файлы1cpt: hooks, либо палитра «1С: Служебные файлы: Создать…».

Формат файла хуков

jsonc
{
  "$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 }.
jsonc
{
  "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.

Распространяется по лицензии MIT.