├── test └── fixtures │ ├── emptyFile.xbsl │ └── example.xbsl ├── .gitattributes ├── .gitignore ├── README.md ├── CHANGELOG.md ├── language-configuration.json ├── .vscode └── launch.json ├── .github └── workflows │ └── release.yml ├── package.json ├── LICENSE └── syntaxes └── xbsl.tmLanguage.json /test/fixtures/emptyFile.xbsl: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.vsix 3 | /.vscodeignore 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Плагин поддержки кода на языке 1С:Предприятие Элемент 2 | 3 | Плагин добавляет подсветку синтаксиса в файлах `xbsl` и `sbsl` 4 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## 0.2.0 4 | 5 | 1. Улучшена раскраска для запросов 6 | 2. Улучшена раскраска типов параметров и типа возвращаемого значения функции 7 | 3. Мелкие фиксы 8 | 9 | ## 0.1.0 10 | 11 | Создание плагина 12 | -------------------------------------------------------------------------------- /language-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": { 3 | "lineComment": "//", 4 | "blockComment": ["/*", "*/"] 5 | }, 6 | "brackets": [ 7 | ["{", "}"], 8 | ["[", "]"], 9 | ["(", ")"] 10 | ], 11 | "autoClosingPairs": [ 12 | ["{", "}"], 13 | ["[", "]"], 14 | ["(", ")"], 15 | ["\"", "\""] 16 | ], 17 | "surroundingPairs": [ 18 | ["{", "}"], 19 | ["[", "]"], 20 | ["(", ")"], 21 | ["\"", "\""] 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that launches the extension inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "args": [ 13 | "--extensionDevelopmentPath=${workspaceFolder}" 14 | ] 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Make release 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | jobs: 8 | deploy: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions/setup-node@v1 13 | with: 14 | node-version: '22' 15 | - run: npm install 16 | - run: npm install -g @vscode/vsce 17 | - run: vsce package 18 | - name: Upload vsix to release 19 | uses: AButler/upload-release-assets@v1.0 20 | with: 21 | files: '*.vsix' 22 | repo-token: ${{ secrets.GITHUB_TOKEN }} 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "language-1c-element-xbsl", 3 | "displayName": "Language 1C Element (xbsl)", 4 | "description": "Syntax highlighting for 1C:Enterprise Element", 5 | "version": "0.2.0", 6 | "publisher": "bia-tech", 7 | "engines": { 8 | "vscode": "^1.97.0" 9 | }, 10 | "categories": [ 11 | "Programming Languages" 12 | ], 13 | "license": "SEE LICENSE IN LICENSE", 14 | "contributes": { 15 | "languages": [{ 16 | "id": "xbsl", 17 | "aliases": ["XBSL", "SBSL", "1C Element"], 18 | "extensions": [".xbsl", ".sbsl"], 19 | "configuration": "./language-configuration.json" 20 | }], 21 | "grammars": [{ 22 | "language": "xbsl", 23 | "scopeName": "source.xbsl", 24 | "path": "./syntaxes/xbsl.tmLanguage.json" 25 | }] 26 | }, 27 | "repository": { 28 | "type": "git", 29 | "url": "https://github.com/bia-technologies/vscode-xbslplugin.git" 30 | }, 31 | "devDependencies": { 32 | "vsce": "^2.7.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2025 BIA Technologies, LLC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/fixtures/example.xbsl: -------------------------------------------------------------------------------- 1 | import Библиотека /* тест */ 2 | 3 | импорт Товары.МодульОбъекта.ОписаниеТовара// dfdf 4 | 5 | конст Б = Истина 6 | 7 | /* Многострочный 8 | комментарий 9 | /* может содержать 10 | любые символы * / */ 11 | @ВПодсистеме @клиент //sdddsds 12 | метод Метод1(Параметр1 : Тип1, 13 | Параметр2: Массив<Строка | Число|?> = "Значение по умолчанию"): Тип2<Тип2<Тип3|Тип4>> 14 | 15 | пер А: Число 16 | А = 15 // целое десятичное число 17 | А = 3.141592654 // дробное десятичное число 18 | А = 15/7 // выражение с использованием десятичных чисел 19 | А = 0xff // шестнадцатеричное число 20 | А = -0xff // отрицательное шестнадцатеричное число 21 | А = 0b10101 // двоичное число 22 | 23 | пер б = а.Представление("'Результат: '6.2") 24 | 25 | // Полная форма - %{выражение} 26 | пер Длина:Число = 100 27 | пер Ширина = 30 28 | пер Сообщение = "Площадь равна %{Длина * Ширина} м2" 29 | 30 | // С форматированием - ${выражение|формат} 31 | пер Сейчас = ДатаВремя.Сейчас() 32 | пер Сообщение = "Текущая дата ${Сейчас|дд ММММ гггг, дддд}" 33 | ; 34 | 35 | статический метод Скрипт() 36 | пер а: Число = 2 37 | пер б: Число = 3 38 | б++ 39 | Консоль.Записать(а > б) // Выдаст значение Ложь типа Булево 40 | Консоль.Записать(а < 123) // Выдаст значение Истина типа Булево 41 | 42 | знч Стр1 = "%0" 43 | знч Стр2 = "$0" 44 | знч Стр3 = "50% заряда" 45 | знч Стр4 = "цена 10$" 46 | область 47 | // вариант 1 48 | пер ИмяПользователя: Строка 49 | пер Приветствие = "Привет, %ИмяПользователя!" 50 | ИмяПользователя = "Ипполит" 51 | ; 52 | ; 53 | 54 | метод РассчитатьСебестоимость(Нал_ог: Число = 1, //comment 55 | Наценка: Число = 10, /*inline*/ Цена: Строка = "Строка"): Число 56 | возврат Цена - (Цена * Наценка / 100 + Цена * Налог / 100) 57 | ; 58 | 59 | структура ПользовательПриложения 60 | обз пер Переменная: Строка 61 | пер Имя: Строка 62 | пер Ид: Ууид 63 | пер ДоступКПриложению: Булево = Истина 64 | 65 | // Возвращает значение: "Вторая строка" 66 | знч СтрокаДва = новый Строка(Байты{feff04120442043e04400430044f0020044104420440043e043a0430}, 67 | Кодировка.Utf16) 68 | 69 | ДанныеСообщений.Добавить("{\n \"date\" : \"%ДатаСообщения\",\n\"headers\" : %Заголовки,\n\"body\" : %Тело\n}") 70 | 71 | 72 | если ФильтроватьПоВозрасту 73 | СотрудникиПоследовательность = СотрудникиПоследовательность.Фильтровать(а -> а.Возраст > 30) 74 | ; 75 | 76 | знч Запрос = Запрос{ВЫБРАТЬ 77 | Лог.ЗаголовкиСообщения КАК Заголовки, 78 | Лог.ТелоСообщения КАК Тело, 79 | Лог.МеткаВремени КАК ДатаСообщения // комментарий 80 | ИЗ 81 | Лог КАК Лог 82 | ГДЕ 83 | Лог.ИдентификаторСодержимогоСообщения == %ИдентификаторОбъекта 84 | //И Лог.МеткаВремени >= %{ДатаОт} 85 | И Лог.МеткаВремени <= %ДатаДо 86 | И Лог.МеткаВремени != 7 87 | } 88 | 89 | знч Запрос2 = новый Запрос(" 90 | ВЫБРАТь ПЕРВЫЕ 1 Поле, Поле2 ИЗ Таблица ГДЕ Поле НЕ ЕСТЬ NULL 91 | ИМЕЮЩИЕ ПО СУММА(Поле2 * ВЫБОР КОГДА ИСТИНА НЕ ЕСТЬ NULL ТОГДА 1 ИНАЧЕ 42 КОНЕЦ) > 42 92 | / КОЛИЧЕСТВО(%Делитель) 93 | ") 94 | 95 | пер КонкретныйИдентификатор = новый Ууид("550e8400-e29b-41d4-a716-446655440000") 96 | пер КонкретныйИдентификатор2 = Ууид{550e8400-e29b-41d4-a716-446655440000} 97 | 98 | метод Скрипт() 99 | пер МоментСоздания = новый ДатаВремя(2019, 05, 01, 23, 30, 40, 345) 100 | пер МоментСозданияФормат = МоментСоздания.ВМомент(ЧасовойПояс{UTC}) 101 | 102 | пер ДатаСоздания = новый ДатаВремя(2019, 5, 1, 23, 30, 40) 103 | пер ДатаСозданияФормат = ДатаСоздания.Представление("дд ММММ гггг', 'ЧЧ:мм:сс") 104 | 105 | пер Период = Строки.Шаблон("С %0 по %1 года", [ДатаНачалаФормат, ДатаОкончанияФормат]) 106 | 107 | пер ОкончаниеРаботы = Время{18:00} 108 | 109 | пер Значение3: Строка|Число|Неопределено = МоментСоздания("ы") 110 | ; 111 | 112 | метод НайтиПользователя(Ид: ИдПользователя): ОписаниеПользователяСервиса 113 | знч ОписаниеПользователя = ПользователиСервиса.Найти(Ид) 114 | 115 | // Метод вернет "никогда", если "ОписаниеПользователя" неопределено 116 | возврат ОписаниеПользователя != Неопределено ? ОписаниеПользователя : ВыброситьИсключение("Пользователь не найден!") 117 | ; 118 | ; 119 | 120 | метод ЭтоМассив(Параметр: Объект) 121 | пер ТипПараметра = Параметр.ПолучитьТип() 122 | пер Результат: Строка 123 | если Параметр это не ЧитаемыйМассив<Объект> 124 | Результат = "Это не массив!" 125 | иначе если Параметр это ЧитаемыйМассив<Строка> 126 | Результат = "Это массив строк!" 127 | иначе если Параметр это ЧитаемыйМассив<Число> 128 | Результат = "Это массив чисел!" 129 | иначе 130 | Результат = "Это массив!" 131 | ; 132 | 133 | пер Значение = Ссылка.ЗагрузитьОбъект()?.РеквизитСсылка?.ЗагрузитьОбъект()?.РеквизитЧисло ?? 0 134 | ; 135 | 136 | 137 | метод ПримерНаЗакрываемыйТип() 138 | попытка 139 | пер Файл = Файлы.Создать(СредаИсполнения.ПолучитьПеременную("temp") + "\\test.txt") 140 | исп Поток = Файл.ОткрытьПотокЗаписи() 141 | Поток.Записать("1-я строка\н") 142 | Поток.Записать("2-я строка\н") 143 | Поток.Записать("3-я строка\н") 144 | пер Успех = "Файл записан!" 145 | поймать Искл: Исключение 146 | // попадем сюда, если хоть какое-то исключение случилось 147 | // здесь поток записи уже закрыт 148 | // переменная Поток здесь уже отсутствует 149 | пер Ошибка = Искл.ПоследовательностьВызовов + "\н" + Искл.Описание 150 | вконце 151 | // попадем сюда в любом случае 152 | // здесь поток записи уже закрыт! 153 | // переменная Поток здесь уже отсутствует 154 | пер Конец = "Файловый поток закрыт, переменная недоступна (выход из области видимости)" 155 | ; 156 | 157 | пер А = Момент{2019-05-01 23:30:40.345 UTC+3} 158 | пер Б = Момент(Дата{2019-05-01},Время{23:30:40},ЧасовойПояс{UTC+3}) 159 | ; 160 | 161 | перечисление ОперационныеСистемы 162 | Linux, 163 | macOS, // для ОС Apple 164 | Windows умолчание 165 | 166 | @сервер 167 | метод МетодПеречисления(): Булево 168 | ; 169 | 170 | статический метод МетодПеречисления2(): Булево 171 | ; 172 | ; 173 | 174 | 175 | структура Продажа 176 | обз пер Товар: Строка = "Пустая" 177 | обз пер Дата: Дата 178 | 179 | @ИменованныеПараметры 180 | конструктор 181 | 182 | // Простой метод 183 | метод ВСтроку(): Строка 184 | возврат Товар + " " + Дата 185 | ; 186 | 187 | // Статический метод 188 | @Аннотация1(Параметр11 = @Аннотация2(Параметр21 = "ЗначениеПараметра")) 189 | статический метод ИзСтроки(СтрокаПродажи: Строка): Продажа 190 | знч Части = СтрокаПродажи.Разделить(" ") 191 | возврат новый Продажа(Части[0], новый Дата(Части[1])) 192 | ; 193 | ; -------------------------------------------------------------------------------- /syntaxes/xbsl.tmLanguage.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", 3 | "name": "xbsl", 4 | "patterns": [ 5 | { "include": "#comments" }, 6 | { "include": "#query-full" }, 7 | { "include": "#literals" }, 8 | { "include": "#operators" }, 9 | { 10 | "name": "keyword.control.import.xbsl", 11 | "match": "^\\s*(импорт|import)\\b([^\\/$]+)", 12 | "captures": { 13 | "1": { "name": "keyword.control.xbsl" }, 14 | "2": { "name": "storage.modifier.import.xbsl" } 15 | } 16 | }, 17 | { 18 | "name": "keyword.operator.expression.xbsl", 19 | "match": "\\s*(метод|method)\\s+(?i:([\\wа-яё]+)\\s*(?:\\()(.*)(?:\\))(?:\\s*:(.*[^\\/$]))?)", 20 | "captures": { 21 | "1": { "name": "keyword.control.xbsl" }, 22 | "2": { "name": "entity.name.function.xbsl" }, 23 | "3": { "patterns": [ { "include": "#method-params" } ] }, 24 | "4": { "name": "entity.name.type.xbsl" } 25 | } 26 | }, 27 | { 28 | "name": "keyword.operator.expression.xbsl", 29 | "begin": "(?i:\\s*(метод|method)\\s+([\\wа-яё]+\\s*(?:\\()))", 30 | "beginCaptures": { 31 | "1": { "name": "keyword.control.xbsl" }, 32 | "2": { "name": "entity.name.function.xbsl" } 33 | }, 34 | "end": "(?<=\\))(?:\\s*:(.*[^\\/$]))*", 35 | "endCaptures": { "1": { "name": "entity.name.type.xbsl" } }, 36 | "patterns": [ { "include": "#method-params" } ] 37 | }, 38 | { 39 | "name": "storage.type.var.xbsl", 40 | "match": "(?<=[^\\wа-яё\\.]|^)(пер|var|знч|val)\\s+(?i:([\\wа-яё]+))\\s*(:[^=]+)*", 41 | "captures": { 42 | "1": { "name": "storage.type.var.xbsl" }, 43 | "2": { "name": "variable.xbsl" }, 44 | "3": { "patterns": [ { "include": "#value-type" } ] } 45 | } 46 | }, 47 | { 48 | "name": "entity.name.class", 49 | "match": "(?i:^\\s*(структура|structure|перечисление|enum)\\s+([\\wа-яё]+\\s*))", 50 | "captures": { 51 | "1": { "name": "keyword.control.xbsl" }, 52 | "2": { "name": "entity.name.class.xbsl" } 53 | } 54 | }, 55 | { 56 | "name": "string.other.query.xbsl", 57 | "begin": "(?i:(?<=[^\\wа-яё\\.])(Запрос|Query)\\s*\\{)", 58 | "beginCaptures": { "1": { "name": "entity.name.type.xbsl" } }, 59 | "end": "\\}", 60 | "patterns": [ 61 | { "include": "#comments" }, 62 | { "include": "#literals" }, 63 | { "include": "#interpool" }, 64 | { "include": "#operators" }, 65 | { "include": "#query-keywords" } 66 | ] 67 | }, 68 | { 69 | "name": "meta.preprocessor", 70 | "match": "(?i:@\\s*[\\wа-яё]+)" 71 | }, 72 | { "include": "#keywords" } 73 | ], 74 | "repository": { 75 | "keywords": { 76 | "patterns": [ 77 | { 78 | "name": "keyword.control.xbsl", 79 | "match": "\\b(вконце|finally|возврат|return|выбор|case|выбросить|throw|для|for|если|if|знч|val|и|and|из|in|или|or|импорт|import|иначе|else|исключение|exception|исп|use|как|as|когда|when|конст|const|конструктор|constructor|метод|method|не|not|неизвестно|unknown|новый|new|обз|req|область|scope|пер|var|перечисление|enum|по|to|поймать|catch|пока|while|попытка|try|прервать|break|продолжить|continue|статический|static|структура|structure|умолчание|default|это|is|этот|this)\\b" 80 | } 81 | ] 82 | }, 83 | "operators": { 84 | "patterns": [ 85 | { 86 | "name": "keyword.control.xbsl", 87 | "match": "->" 88 | }, 89 | { 90 | "name": "keyword.operator.expression.xbsl", 91 | "match": "<=|>=|=|<|>|==|!=|\\*|\\+|-|/|%|\\*\\*\\:\\?" 92 | }, 93 | { 94 | "name": "keyword.control.xbsl", 95 | "match": "(?<=[^\\wа-яё\\.]|^)(не|not|и|and|или|or)(?=[^\\wа-яё\\.]|$)" 96 | } 97 | ] 98 | }, 99 | "comments": { 100 | "patterns": [ 101 | { 102 | "name": "comment.line.double-slash.xbsl", 103 | "begin": "//", 104 | "end": "$" 105 | }, 106 | { 107 | "name": "comment.block.xbsl", 108 | "begin": "\/\\*", 109 | "end": "\\*\/" 110 | } 111 | ] 112 | }, 113 | "literals": { 114 | "patterns": [ 115 | { 116 | "name": "constant.numeric.xbsl", 117 | "match": "(?<=[^\\wа-яё\\.]|^)((\\d+\\.?\\d*)|(0x[0-9a-f]+)|(0b[0-1]+))(?=[^\\wа-яё\\.]|$)" 118 | }, 119 | { 120 | "name": "string.quoted.double.xbsl", 121 | "begin": "\"", 122 | "end": "\"", 123 | "patterns": [ 124 | { "include": "#interpool" }, 125 | { 126 | "name": "constant.character.escape.xbsl", 127 | "match": "\\\\." 128 | } 129 | ] 130 | }, 131 | { 132 | "name": "constant.language.xbsl", 133 | "match": "(\\b(Истина|True|Ложь|False|Неопределено|Undefined)\\b)" 134 | }, 135 | { "include": "#built-in-type" } 136 | ] 137 | }, 138 | "built-in-type": { 139 | "patterns": [ 140 | { 141 | "name": "storage.type.xbsl", 142 | "match": "(?i:(\\b[\\wа-яё]+\\b)\\{(.*?)\\})", 143 | "captures": { 144 | "2": { "name": "support.type.xbsl" }, 145 | "3": { "name": "variable.other.constant.xbsl" } 146 | } 147 | } 148 | ] 149 | }, 150 | "value-type": { 151 | "patterns": [ 152 | { 153 | "comment": "Имя типа, первая часть", 154 | "begin": "(?<=\\:)\\s*(?:([\\wа-яё\\.\\?]+)\\s*((?>\\<)))", 155 | "beginCaptures": { 156 | "1": { "name": "entity.name.type.xbsl" }, 157 | "2": { "name": "keyword.other.operator.xbsl" } 158 | }, 159 | "end": ">(?:\\?)?", 160 | "endCaptures": { "0": { "name": "keyword.other.operator.xbsl" } }, 161 | "patterns": [ 162 | { 163 | "comment": "содержимое, надо вынести наверное", 164 | "name": "entity.name.type.xbsl", 165 | "begin": "\\b([\\wа-яё\\.\\?]+\\s*)", 166 | "end": ">|<|\\|", 167 | "patterns": [ { "include": "#operators" } ] 168 | } 169 | ] 170 | }, 171 | { 172 | "comment": "Имя типа брильянта, включая составное", 173 | "match": "(?:(?<=\\||(?<=\\:))\\s*([\\wа-яё\\.\\?]+))+", 174 | "captures": { "1": { "name": "entity.name.type.xbsl" } } 175 | } 176 | ] 177 | }, 178 | "interpool": { 179 | "patterns": [ 180 | { 181 | "name": "variable.parameter.xbsl", 182 | "begin": "[\\%\\$]\\{", 183 | "end": "\\}", 184 | "patterns": [ { "include": "#operators" } ] 185 | }, 186 | { 187 | "name": "variable.parameter.xbsl", 188 | "match": "[\\%\\$][\\wа-яё]+\\b" 189 | } 190 | ] 191 | }, 192 | "query-keywords": { 193 | "comment": "Ключевые слова запроса", 194 | "patterns": [ 195 | { 196 | "name": "keyword.sql.xbsl", 197 | "match": "(?i:\\b(ВЫБРАТЬ|SELECT|ВСТАВИТЬ|INSERT|ИЗМЕНИТЬ|UPDATE|РАЗРЕШЕННЫЕ|ALLOWED|ПЕРВЫЕ|TOP|РАЗЛИЧНЫЕ|DISTINCT)\\b)" 198 | }, 199 | { 200 | "name": "keyword.sql.xbsl", 201 | "match": "(?i:\\b(ОБРЕЗАТЬ|TRUNCATE|УДАЛИТЬ|DELETE|УНИЧТОЖИТЬ|DROP|ПОМЕСТИТЬ|INTO|ИНДЕКСИРОВАТЬ|INDEX|УСТАНОВИТЬ|SET)\\b)" 202 | }, 203 | { 204 | "name": "keyword.sql.xbsl", 205 | "match": "(?i:\\b(СОЗДАТЬ\\s+ВРЕМЕННУЮ\\s+ТАБЛИЦУ|CREATE\\s+TEMPORARY\\s+TABLE|СОЗДАТЬ\\s+ИНДЕКС|CREATE\\s+INDEX)\\b)" 206 | }, 207 | { 208 | "name": "keyword.sql.xbsl", 209 | "match": "(?i:\\b(ИЗ|FROM|ГДЕ|WHERE|СОЕДИНЕНИЕ|JOIN|ЛЕВОЕ|LEFT|ПРАВОЕ|RIGHT|ПОЛНОЕ|FULL|ВНУТРЕННЕЕ|INNER)\\b)" 210 | }, 211 | { 212 | "name": "keyword.sql.xbsl", 213 | "match": "(?i:\\b(ОБЪЕДИНИТЬ|UNION|ВСЕ|ALL|УПОРЯДОЧИТЬ|ORDER|СГРУППИРОВАТЬ|GROUP|ИМЕЮЩИЕ|HAVING|ИЕРАРХИИ|HIERARCHY)\\b)" 214 | }, 215 | { 216 | "name": "keyword.sql.xbsl", 217 | "match": "(?i:\\b(ПО|ON|BY|ВОЗР|ASC|УБЫВ|DESC|ДЛЯ|FOR|КАК|AS|ЕСТЬ|IS|В|IN|ВЫРАЗИТЬ|CAST)\\b)" 218 | }, 219 | { 220 | "name": "keyword.sql.xbsl", 221 | "match": "(?i:\\b(ВЫБОР|CASE|КОГДА|WHEN|ТОГДА|THEN|ИНАЧЕ|ELSE|КОНЕЦ|END)\\b)" 222 | }, 223 | { 224 | "name": "keyword.sql.xbsl", 225 | "match": "(?i:\\b(НЕ|NOT|ИЛИ|OR|И|AND|ССЫЛКА|REFS|СПЕЦСИМВОЛ|ESCAPE|NULL|ПОДОБНО|LIKE|МЕЖДУ|BETWEEN)\\b)" 226 | } 227 | ] 228 | }, 229 | "query-func": { 230 | "comment": "Функции запроса", 231 | "patterns": [ 232 | { 233 | "name": "string.query.xbsl", 234 | "begin": "(?i:\\b([\\wа-яё]+)\\b(\\())", 235 | "beginCaptures": { 236 | "1": { "name": "support.function.sql.xbsl" }, 237 | "2": { "name": "entity.name.function.xbsl" } 238 | }, 239 | "end": "\\)", 240 | "endCaptures": { "0": { "name": "entity.name.function.xbsl" } }, 241 | "patterns": [ 242 | { "include": "#comments" }, 243 | { "include": "#literals" }, 244 | { "include": "#interpool" }, 245 | { "include": "#operators" }, 246 | { "include": "#query-func" }, 247 | { "include": "#query-keywords" } 248 | ] 249 | } 250 | ] 251 | }, 252 | "query-full": { 253 | "comment": "Блок запроса", 254 | "patterns": [ 255 | { 256 | "comment": "Первый вариант написания запроса {}", 257 | "name": "string.query.xbsl", 258 | "begin": "(?i:\\b(Запрос|Query)\\s*(\\{))", 259 | "beginCaptures": { 260 | "1": { "name": "entity.name.type.xbsl" }, 261 | "2": { "name": "entity.name.function.xbsl" } 262 | }, 263 | "end": "\\}", 264 | "endCaptures": { "0": { "name": "entity.name.function.xbsl" } }, 265 | "patterns": [ 266 | { "include": "#comments" }, 267 | { "include": "#literals" }, 268 | { "include": "#interpool" }, 269 | { "include": "#operators" }, 270 | { "include": "#query-func" }, 271 | { "include": "#query-keywords" } 272 | ] 273 | }, 274 | { 275 | "comment": "Второй вариант написания запроса новый Запрос()", 276 | "name": "string.query.xbsl", 277 | "begin": "(?i:\\b(новый|new)\\s+(Запрос|Query)\\s*(\\())", 278 | "beginCaptures": { 279 | "1": { "name": "keyword.control.xbsl" }, 280 | "2": { "name": "entity.name.type.xbsl" }, 281 | "3": { "name": "entity.name.function.xbsl" } 282 | }, 283 | "end": "\\)", 284 | "endCaptures": { "0": { "name": "entity.name.function.xbsl" } }, 285 | "patterns": [ 286 | { 287 | "comment": "Текст запроса строкой", 288 | "begin": "\"", 289 | "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.bsl" } }, 290 | "end": "\"", 291 | "endCaptures": { "0": { "name": "punctuation.definition.string.end.bsl" } }, 292 | "patterns": [ 293 | { "include": "#comments" }, 294 | { "include": "#literals" }, 295 | { "include": "#interpool" }, 296 | { "include": "#operators" }, 297 | { "include": "#query-func" }, 298 | { "include": "#query-keywords" } 299 | ] 300 | } 301 | ] 302 | } 303 | ] 304 | }, 305 | "method-params": { 306 | "begin": "\\s*([\\wа-яё]+)", 307 | "beginCaptures": { "1": { "name": "variable.parameter.xbsl" } }, 308 | "end": "(?=[,\\)])", 309 | "patterns": [ 310 | { 311 | "begin": "(?<=\\:)([^,\\=$]+)", 312 | "beginCaptures": { "1": { "name": "entity.name.type.xbsl" } }, 313 | "end": "(?=[,\\=$])" 314 | }, 315 | { "include": "#literals" } 316 | ] 317 | }, 318 | "variable": { 319 | "comment": "Определенние переменной или параметра", 320 | "begin": "(?i:([\\wа-яё]+))\\b", 321 | "beginCaptures": { "1": { "name": "variable.parameter.method.xbsl" } }, 322 | "end": "(?:(?=\\,|\\=|\\)|$))", 323 | "patterns": [ 324 | { "include": "#operators" }, 325 | { "include": "#value-type" } 326 | ] 327 | } 328 | }, 329 | "scopeName": "source.xbsl" 330 | } --------------------------------------------------------------------------------