Skip to main content

bslfmt

Детерминированный форматтер структурных отступов BSL. Проект работает как Python-библиотека и CLI; интеграция с MCP 1C будет отдельным потребителем пакета.

Границы

Форматтер приводит отступы и форматирование поддерживаемых операторов. Он сохраняет значимые токены и порядок кода, строк, комментариев и директив. Он не проверяет синтаксис BSL и не компилирует модули. Если структурное форматирование небезопасно, команда завершает работу с диагностикой, не перезаписывая источник.

Стиль форматирования

Стиль один, настроек нет. Он следует стандартам 1С «Тексты модулей» (std456) и «Перенос выражений» (std444) и практике типовых конфигураций.

  • Отступы — табуляцией, по вложенности блоков: процедуры и функции, Если/ИначеЕсли/Иначе, циклы, Попытка/Исключение. Английские и смешанные ключевые слова распознаются.
  • С колонки 0 — Процедура/Функция и их концы, аннотации (&НаСервере…), директивы препроцессора (#Область, #Если…, в том числе внутри процедур), переменные и код модуля вне процедур.
  • Строки продолжения выражений и параметров — не меньше чем +1 отступ к инструкции; более глубокий отступ (выравнивание по скобке или первому операнду) сохраняется. На уровне инструкции остаются строка, начинающаяся с ), и текст запроса сразу после =. Строка после одиночного Возврат — его значение: продолжение (+1), текст запроса — как после =. Строки И/Или многострочного условия — не меньше чем +1 к Если.
  • Многострочные строки: строки | сдвигаются вместе со строкой, где начался литерал; пробелы перед | не входят в значение строки.
  • Комментарии // встают на отступ следующей строки кода; перед строкой, которая закрывает блок (КонецЕсли, Иначе…) или начинается с ), — на уровень глубже. Комментарий в колонке 0 (маркеры доработок //!, //++, закомментированный код) остаётся в колонке 0. Текст комментариев не меняется.
  • Перенос строк: каждая инструкция — на своей строке (А = 1; Б = 2; → две строки); после Тогда, Цикл, Попытка, Иначе, Исключение тело начинается со следующей строки, а КонецЕсли, КонецЦикла, КонецПопытки, Иначе, ИначеЕсли, Исключение стоят отдельной строкой. Пустая инструкция (Цикл;, Иначе;) остаётся при своём слове, комментарий в конце строки — у последней части.
  • Пробелы: вокруг бинарных операторов (=, <>, +, %…), после запятой; без пробелов перед , ; ) и после (. Лишние пробелы внутри строки схлопываются, хвостовые удаляются; выравнивание табами внутри строки заменяется одним пробелом.
  • Пустые строки: не больше одной подряд. Строки из одних пробелов и табов (так их заполняет конфигуратор) не очищаются.
  • Методы расширений с &ИзменениеИКонтроль форматируются как обычный код: платформа не сверяет пробелы и табы в контролируемых строках.
  • Не трогаются: строки и даты, текст комментариев, области #Вставка/#Удаление, регистр букв, порядок кода; длинные выражения не переносятся.

Установка

Нужен Python 3.10+ или uv — он сам скачает Python. Пакет без зависимостей, одинаков для Windows, macOS и Linux.

uv tool install bslfmt        # команда bslfmt в терминале (рекомендуется)
pipx install bslfmt           # то же через pipx
uvx bslfmt Модуль.bsl         # разовый запуск без установки

Установить uv: Windows — winget install astral-sh.uv (или powershell -c "irm https://astral.sh/uv/install.ps1 | iex"); macOS — brew install uv; macOS и Linux — curl -LsSf https://astral.sh/uv/install.sh | sh. Обновление: uv tool upgrade bslfmt (или pipx upgrade bslfmt).

Для агентов и хуков

Форматировать файл на месте — одна команда, модуль через контекст агента не передаётся:

uvx bslfmt -i Модуль.bsl            # отформатировать файл (uv сам поставит пакет)
uvx bslfmt --check Модуль.bsl       # код выхода 1 — файл нужно отформатировать
uvx bslfmt -i -sbc Модуль.bsl       # и удалить комментарии внутри методов

Если пакет установлен (uv tool install bslfmt), то же без uvx. Вывод — UTF-8; сводка на файл: ФАЙЛ: изменён (строк: N) или ФАЙЛ: без изменений.

Установка для разработки

python -m venv .venv
. .venv/bin/activate
python -m pip install -e .
python -m unittest discover -s tests -v

Команда bslfmt появляется в активном окружении.

CI (GitHub Actions) прогоняет тесты на Windows, macOS и Linux и проверяет установленную команду: python tests/cli_smoke.py после pip install ..

CLI

bslfmt Модуль.bsl                        # результат на экран, файл не меняется
bslfmt -i Модуль.bsl Форма.bsl           # отформатировать файлы на месте
bslfmt --check Модуль.bsl Форма.bsl      # только проверить (для CI и хуков)
bslfmt --check --diff Модуль.bsl         # проверить и показать различия
bslfmt Модуль.bsl --output Новый.bsl     # записать результат в новый файл
bslfmt - < Модуль.bsl                    # стандартный ввод
bslfmt -i -sbc Модуль.bsl                # и удалить комментарии внутри методов
bslfmt --help                            # справка по всем режимам

-i переписывает только файлы, которым нужна правка: запись атомарная (временный файл рядом и замена), при отказе форматирования файл не меняется. Сводка на каждый файл: ФАЙЛ: изменён (строк: N) или ФАЙЛ: без изменений. Файл только для чтения не переписывается (ошибка, код 2). -- завершает флаги: bslfmt --check -- -файл.bsl. -sbc, --strip-body-comments (с любым режимом) удаляет строки-комментарии внутри процедур и функций — закомментированный код, маркеры доработок, пояснения. Это же касается строк-комментариев между строками многострочного литерала (//| Поле, в тексте запроса): в значение строки они не входят. Комментарии в конце строки кода, над методами, внутри самого текста строки (|// … — часть запроса: маркеры для СтрЗаменить, разделитель пакета) и в областях #Вставка/#Удаление остаются. Значения строк не меняются — это проверяется при каждом запуске. Без ключа комментарии не удаляются. --check ничего не записывает и перечисляет файлы, которые нужно отформатировать. Несколько файлов — только с -i, --check или --diff; каждый обрабатывается отдельно. --output создаёт новый файл и отказывается перезаписывать существующий.

Ввод и вывод (текст, различия, сводка, ошибки) — UTF-8 на любой ОС; переводы строк и BOM сохраняются как в исходнике.

Коды выхода (худший по всем файлам): 0 — успех (при --check — всё отформатировано); 1 — --check нашёл файлы для форматирования; 2 — ошибка аргументов, чтения или записи, неверная кодировка или отказ форматирования (сообщение в stderr с именем файла и номером строки, если он известен); 3 — внутренняя ошибка форматтера.

Python API

from bslfmt import format_code

formatted = format_code(source)

Для недоверенного ввода есть лимиты: max_chars — длина исходника (по умолчанию 20 000 000 символов), max_depth — вложенность блоков (по умолчанию 100). При превышении — FormatError; None отключает лимит.

formatted = format_code(source, max_chars=1_000_000, max_depth=50)
cleaned = format_code(source, strip_body_comments=True)

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

Поддерживаемые функции и ограничения уточняются по синтетическим тестам в tests/; локальные корпуса и конфигурации в репозиторий не входят.

Лицензия

Apache License 2.0 — см. LICENSE и NOTICE. Проект не аффилирован с ООО «1С».

Metadata

Release files for bslfmt 0.23.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bslfmt 0.23.0
File Size Uploaded
bslfmt-0.23.0.tar.gz 61.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for bslfmt 0.23.0
File Interpreter ABI Platform
bslfmt-0.23.0-py3-none-any.whl Python 3 none any Details

Total release size: 102.6 kB

Release files / bslfmt-0.23.0.tar.gz

Download URL bslfmt-0.23.0.tar.gz
Size 61.5 kB
Tags Source
SHA-256 checksum
How to use checksums
13966c0123adf41fa8016e45a7e5760303310fffec3d68e62576399c6a37537e
BLAKE2b-256 checksum
How to use checksums
fab90fa5cd1ff4c96a7bdd53e12112a8914d289bc6057a123643b634080162c5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / bslfmt-0.23.0-py3-none-any.whl

Download URL bslfmt-0.23.0-py3-none-any.whl
Size 41.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
dc28ddd082480c96a1a8e28b04ab8edb1c0a7ae2ba3baef277715fbbffea0fdb
BLAKE2b-256 checksum
How to use checksums
8b79699903679e64bd46b8db2a903c1db16f2fdba156af6b11b8a431d936da53
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.23.0 This release

2 release files

0.21.0

2 release files

0.20.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page