highlightjs-1c-bsl

Keyword patcher for highlight.js — restores hljs-keyword, hljs-literal and hljs-meta on BSL tokens the official 1c grammar misses.  ·  GitHub  ·  npm  ·  README RU  ·  androman.pro

hljs ≥ 10.0.0 case-insensitive RU + EN no dependencies MIT
npm install highlightjs-1c-bsl
// запрос с виртуальной таблицей
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ОстаткиИОбороты.Номенклатура КАК Номенклатура,
|    ОстаткиИОбороты.Номенклатура.Наименование КАК НоменклатураНаименование,
|    ОстаткиИОбороты.КоличествоКонечныйОстаток КАК Остаток
|ИЗ
|    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
|        &НачалоПериода, &КонецПериода, Авто, Движения,
|        Склад = &Склад) КАК ОстаткиИОбороты
|ГДЕ
|    ОстаткиИОбороты.КоличествоКонечныйОстаток <> 0";

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода",  КонецДня(ТекущаяДата()));
Запрос.УстановитьПараметр("Склад",         Склад);

Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
        ОбщегоНазначения.СообщитьПользователю(СтрШаблон(
            "%1, остаток: %2",
            Выборка.НоменклатураНаименование,
            Формат(Выборка.Остаток, "ЧДЦ=3")));
    КонецЦикла;
КонецЕсли;
// серверная процедура с аннотацией
&НаСервере
Процедура ЗаписатьДанныеНаСервере(Объект, Отказ)
    Попытка
        НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Регистратор.Установить(Объект.Ссылка);

        Для Каждого СтрокаТЧ Из Объект.Товары Цикл
            Движение = НаборЗаписей.Добавить();
            Движение.ВидДвижения  = ВидДвиженияНакопления.Расход;
            Движение.Номенклатура = СтрокаТЧ.Номенклатура;
            Движение.Количество   = СтрокаТЧ.Количество;
        КонецЦикла;

        НаборЗаписей.Записать();
    Исключение
        ОбщегоНазначения.СообщитьПользователю(
            ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),
            ,,,, Отказ);
    КонецПопытки;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьОстаток(Номенклатура, Склад) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(
    |        , Номенклатура = &Номенклатура И Склад = &Склад) КАК Остатки";
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Склад",        Склад);
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.КоличествоОстаток;
    КонецЕсли;
    Возврат 0;
КонецФункции
// литералы и объявление переменных
Перем ЗначениеПоУмолчанию;

Если НЕ ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
    ЗначениеПоУмолчанию = Истина;
КонецЕсли;

// NULL в запросах — безопасное сравнение через ЕСТЬNULL()
Если Выборка.Остаток = NULL Тогда
    ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'нет данных'"));
КонецЕсли;
Without the patch: Процедура, КонецПроцедуры, Функция, КонецФункции, Знач — no coloring. &НаСервере, &НаКлиентеНаСервере — plain text. Истина, Неопределено — no literal class.
// query with virtual table
Query = New Query;
Query.Text =
"SELECT
|    StockBalance.Product AS Product,
|    StockBalance.Product.Description AS ProductDescription,
|    StockBalance.QuantityBalance AS Balance
|FROM
|    AccumulationRegister.StockInWarehouses.Balance(
|        &StartDate, &EndDate,
|        Warehouse = &Warehouse) AS StockBalance
|WHERE
|    StockBalance.QuantityBalance <> 0";

Query.SetParameter("StartDate", BegOfDay(CurrentDate()));
Query.SetParameter("EndDate",   EndOfDay(CurrentDate()));
Query.SetParameter("Warehouse", Warehouse);

Result = Query.Execute();
If NOT Result.IsEmpty() Then
    Selection = Result.Choose();
    While Selection.Next() Do
        Common.MessageToUser(StrTemplate(
            "%1, balance: %2",
            Selection.ProductDescription,
            Format(Selection.Balance, "NFD=3")));
    EndDo;
EndIf;
// server procedure with annotation
&AtServer
Procedure WriteDataAtServer(Object, Reject)
    Try
        RecordSet = AccumulationRegisters.StockInWarehouses.CreateRecordSet();
        RecordSet.Filter.Recorder.Set(Object.Ref);

        For Each LineItem In Object.Goods Do
            Movement = RecordSet.Add();
            Movement.MovementType  = AccumulationRecordType.Expense;
            Movement.Product       = LineItem.Product;
            Movement.Quantity      = LineItem.Quantity;
        EndDo;

        RecordSet.Write();
    Except
        Common.MessageToUser(
            ErrorProcessing.DetailErrorDescription(ErrorInfo()),
            ,,,, Reject);
    EndTry;
EndProcedure

&AtServerNoContext
Function GetBalance(Product, Warehouse) Export
    Query = New Query;
    Query.Text =
    "SELECT
    |    ISNULL(Balance.QuantityBalance, 0) AS QuantityBalance
    |FROM
    |    AccumulationRegister.StockInWarehouses.Balance(
    |        , Product = &Product AND Warehouse = &Warehouse) AS Balance";
    Query.SetParameter("Product",   Product);
    Query.SetParameter("Warehouse", Warehouse);
    Selection = Query.Execute().Choose();
    If Selection.Next() Then
        Return Selection.QuantityBalance;
    EndIf;
    Return 0;
EndFunction
// literals and variable declaration
Var DefaultValue;

If NOT ValueIsFilled(DefaultValue) Then
    DefaultValue = True;
EndIf;

// NULL in queries — safe comparison via ISNULL()
If Selection.Balance = Null Then
    Common.MessageToUser(NStr("en = 'no data'"));
EndIf;
English BSL note: the official hljs 1c grammar is Russian-only. Without this patch, English BSL code gets zero syntax coloring — keywords, literals, annotations all render as plain text.