Skip to content

Feature request: поддержка языка 1С (BSL / Встроенный язык 1С:Предприятие) #2127

Description

@mmkxim-gif

Описание

Сейчас graphify поддерживает 36 языков через tree-sitter грамматики, но среди них нет BSL — встроенного языка платформы 1С:Предприятие (используется в конфигурациях типа УТ, ЗУП, БП и т.д.). Для проектов на 1С код сейчас попадает в граф только как обычный текст (без AST), либо не индексируется вовсе.

Почему это важно

1С — один из самых распространённых языков для учётных систем в России, СНГ и ряде других стран. Конфигурации на 1С часто содержат сотни модулей со сложными связями (общие модули, модули объектов, модули менеджеров, модули форм), и граф вызовов/зависимостей был бы так же полезен, как для Python/Go/Java проектов.

Особенности синтаксиса, критичные для парсера

  • Двуязычность ключевых слов — 1С поддерживает русские и английские варианты одних и тех же конструкций: Процедура/Procedure, КонецПроцедуры/EndProcedure, Функция/Function, КонецФункции/EndFunction, Если/If, Тогда/Then, КонецЕсли/EndIf. Экспорт/Export — модификатор, определяющий видимость процедуры/функции извне модуля (аналог public).
    • Аннотации компиляции — &НаСервере, &НаКлиенте, &НаСервереБезКонтекста перед процедурой определяют контекст выполнения (клиент/сервер). Это критично для построения корректного графа: клиентская процедура может вызывать серверную только через явный вызов, помеченный соответствующей директивой — само наличие такого вызова уже говорит о клиент-серверном взаимодействии.
      • Директивы препроцессора — #Если Сервер Тогда / #КонецЕсли (условная компиляция под разные платформы выполнения), а также #Область / #КонецОбласти — секции, группирующие процедуры логически.

Пример фрагмента (модуль формы, реальный код из конфигурации УТ 11)

	ОбеспечениеВДокументахКлиент.ПроверитьЗапуститьФоновоеЗаданиеРаспределенияЗапасов();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СписокРеализацииТоваровУслугПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	СоответствиеТребованиямГИСМТ.ПриПолученииДанныхНаСервереДокумента(Строки);
КонецПроцедуры

#КонецОбласти#Область ОбработчикиКомандФормы

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.СписокРеализацииТоваровУслуг);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

Обратите внимание на последние две процедуры: Подключаемый_ПродолжитьВыполнениеКомандыНаСервере (клиент, Экспорт) вызывает ВыполнитьКомандуНаСервере (сервер) — типичный паттерн клиент-серверного взаимодействия, который граф должен уметь отразить как calls-связь с пометкой о смене контекста выполнения.

Предлагаемый объём работ (по аналогии с ARCHITECTURE.md → "how to add a language")

  • tree-sitter грамматика для BSL (стоит проверить существующие community-грамматики tree-sitter-bsl, если такие есть)
    • Разбор Экспорт/Export как признака публичного интерфейса модуля (аналог edge EXTRACTED для публичных методов)
      • Учёт &НаСервере/&НаКлиенте/&НаСервереБезКонтекста как метаданных узла — полезно для флага "клиент-серверный вызов" в графе
        • Учёт #Область/#КонецОбласти как смысловой группировки (опционально, но полезно для community detection)
          • Тестовые фикстуры с примерами двуязычного синтаксиса (RU/EN варианты ключевых слов)

Дополнительно

Готов протестировать draft-реализацию на реальном проекте (конфигурация УТ 11) и предоставить фидбек / worked example по образцу worked/{slug}/ из репозитория.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions