bslfmt
Детерминированный форматтер структурных отступов BSL. Проект работает как Python-библиотека и CLI; интеграция с MCP 1C будет отдельным потребителем пакета.
Границы
Форматтер приводит отступы и форматирование поддерживаемых операторов. Он сохраняет значимые токены и порядок кода, строк, комментариев и директив. Он не проверяет синтаксис BSL и не компилирует модули. Если структурное форматирование небезопасно, команда завершает работу с диагностикой, не перезаписывая источник.
Стиль форматирования
Стиль один, настроек нет. Он следует стандартам 1С «Тексты модулей» (std456) и «Перенос выражений» (std444) и практике типовых конфигураций.
- Отступы — табуляцией, по вложенности блоков: процедуры и функции,
Если/ИначеЕсли/Иначе, циклы,Попытка/Исключение. Английские и смешанные ключевые слова распознаются. - С колонки 0 —
Процедура/Функцияи их концы, аннотации (&НаСервере…), директивы препроцессора (#Область,#Если…, в том числе внутри процедур), переменные и код модуля вне процедур. - Строки продолжения выражений и параметров — не меньше чем +1 отступ к
инструкции; более глубокий отступ (выравнивание по скобке или первому
операнду) сохраняется. На уровне инструкции остаются строка, начинающаяся
с
), и текст запроса сразу после=. СтрокиИ/Илимногострочного условия — не меньше чем +1 кЕсли. - Многострочные строки: строки
|сдвигаются вместе со строкой, где начался литерал; пробелы перед|не входят в значение строки. - Комментарии
//встают на отступ следующей строки кода. Комментарий в колонке 0 (маркеры доработок//!,//++, закомментированный код) остаётся в колонке 0. Текст комментариев не меняется. - Пробелы: вокруг бинарных операторов (
=,<>,+,%…), после запятой; без пробелов перед,;)и после(. Лишние пробелы внутри строки схлопываются, хвостовые удаляются; выравнивание табами внутри строки заменяется одним пробелом. - Пустые строки: не больше одной подряд. Строки из одних пробелов и табов (так их заполняет конфигуратор) не очищаются.
- Методы расширений с
&ИзменениеИКонтрольформатируются как обычный код: платформа не сверяет пробелы и табы в контролируемых строках. - Не трогаются: строки и даты, текст комментариев, области
#Вставка/#Удаление, регистр букв, порядок и перенос кода (длинные строки не переносятся).
Установка
Нужен 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С».
Release files for bslfmt 0.20.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| bslfmt-0.20.1.tar.gz | 51.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bslfmt-0.20.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 85.9 kB
Release files / bslfmt-0.20.1.tar.gz
| Download URL | bslfmt-0.20.1.tar.gz |
|---|---|
| Size | 51.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b418d12ec450f5d863ef9a2e103460590eb4a626b1b56d66b20cc3d56dfb16a9
|
|
BLAKE2b-256 checksum How to use checksums |
5317729a302b72b1f5d4267408d9a7a2f3cc868abfdda6da226e5c8b8071589d
|
| 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 26, 2026.
Transparency logRelease files / bslfmt-0.20.1-py3-none-any.whl
| Download URL | bslfmt-0.20.1-py3-none-any.whl |
|---|---|
| Size | 34.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9c0bb81aa2cf1abe9bd0620fd6e7f03d6e0fd48386e054bfd665fea856207092
|
|
BLAKE2b-256 checksum How to use checksums |
e3d1eac7a79a004ef21fd8f69145b4e8aaa35718393ea346c65e88df5047fc0a
|
| 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 26, 2026.
Transparency log