Profile
Back to NewsBack
GitHub Trending 3 min
Reader Mode
salexdv/bsl_console: Консоль кода для 1С 8.3 (Управляемые и обычные формы)

salexdv/bsl_console: Консоль кода для 1С 8.3 (Управляемые и обычные формы)

3 hours ago

Консоль кода для 1С 8.3 (Управляемые и обычные формы)

Для работы внутри 1С требуется версия платформы не ниже 8.3.24 (обновлённый WebKit)

Для работы с платформами от 8.3.14.1565 до 8.3.23.2157 следует использовать архивные ветки:

  1. webpack_0_20 - ES-модули, с возможностью сборки в один файл (работает в linux)
  2. develop_0_20 - AMD-модули, набор файлов

Как работает?

На основе Monaco editor, версии 0.55.1

Основные возможности

  • Подсветка синтаксиса языка 1С
  • Подсветка языка запросов
  • Автокомплит для глобальных перечислений и функций
  • Автокомплит для метаданных (Справочники, Документы и т.п.)
  • Автокомплит для объектов метаданных (СправочникСсылка, ДокументОбъект и т.п.)
  • Подсказка параметров конструкторов и методов
  • Подсказка для типов
  • Вставка готовых блоков кода (сниппеты)
  • Вызов конструктора запроса и конструктора форматной строки
  • Загрузка пользовательских функций и сниппетов
  • Выделение строки, при выполнении которой произошла ошибка
  • Сворачивание циклов, условий и текстов запросов
  • Всплывающие подсказки для глобальных функций, перечислений и классов
  • Подсказки через точку для реквизитов типа справочники/документы
  • Подсказки через точку для объектов типа ТаблицаЗначений/Массив/РезультатЗапроса/ДвоичныеДанные и др., в том числе для объектов, полученных через методы других объектов.
  • Определение типа переменной по коду: конструктор Новый, присваивание, результат метода или функции
  • Подсказка имён ключей структуры и колонок таблицы значений, заданных в коде
  • Объявление типа комментарием в синтаксисе строгой типизации ЕДТ
  • Подсказки для источников и полей в режиме запроса

Публикации

Сборка

##### Для разработки и сборки необходим установленный node.js.

##### Установка

npm install

##### Разработка и отладка с помощью встроенного сервера

npm run debug

Помимо самого редактора (http://localhost:9000/), dev-сервер сразу отдаёт страницы тестов: http://localhost:9000/test.html (встроенный язык) и http://localhost:9000/test_query.html (язык запросов).

##### Сборка финального файла ./dist/index.html

npm run build

##### Сборка single-file (один самодостаточный HTML для поля 1С 8.3.27+)

Собирает ./dist/index.html как единый самодостаточный файл без внешних ресурсов: JS, CSS, шрифты, картинки, иконки дерева и воркер Monaco инлайнятся в сам HTML (data:/blob:). Это нужно, чтобы загружать редактор в «Поле HTML документа» 1С как текст и обойти предупреждение безопасности платформы 8.3.27+ «ПолеHTMLДокумента пытается открыть локальный файл» (оно возникает на любой ресурс, читаемый с диска).

npm run build:single

После сборки в ./dist/ остаётся ровно один файл index.html. Проверить отсутствие внешних ссылок можно отдельно:

npm run check:single

Обычная сборка (npm run build) при этом не меняется.

##### Сборка сжатого single-file (один самодостаточный HTML для поля 1С 8.3.27+ меньшего размера)

npm run build:pack

##### Опции сборки

По умолчанию штатный интерфейс Monaco (поиск, контекстные меню, панель inline-подсказок и другие виджеты) собирается на русском языке. Английские варианты основных команд:

npm run debug:en
npm run build:en
npm run build:single:en
npm run build:pack:en

То же значение можно передать webpack напрямую: --env monacoLocale=en. Поддерживаются только ru и en; локаль фиксируется на время жизни HTML-документа. Функция switchLang переключает язык программных подсказок BSL и не меняет штатный интерфейс Monaco.

Для передачи дополнительных опций, используемых при создании редактора, можно воспользоваться следующей командой:

npm run build -- --env customOptions="automaticLayout: true, someOption: false"

Опции подставляются в вызов editor.create() (маркер customOptions в src/editor.js). Значение — через --env (webpack-cli 5+ не принимает произвольные флаги вроде --customOptions).

Как запускать?

  1. Собрать проект и открыть в браузере файл ./dist/index.html, либо воспользоваться ссылкой
  2. Для запуска в 1С можно использовать обработку console.epf, выкладываемую в релизах или сделать свою.
  3. Редактор используется на сайте Paste1C.
  4. На платформе 8.3.27+ (с включённой «Защитой от опасных действий») собрать single-file
(npm run build:single) и загрузить содержимое ./dist/index.html в «Поле HTML документа» как текст — так платформа не выдаёт предупреждение об открытии локального файла.

Функции для взаимодействия с 1С:Предприятием

Работа с текстом (кодом)

| Функция | Описание | | ------------------------------ | --------------------------------------------------------------------------------------------- | | setText | Устанавливает переданный текст в текущую или определенную позицию | | updateText | Полностью заменяет весь текст редактора, игнорируя при этом режим Только просмотр | | setContent | Устанавливает текст редактора. Игнорирует режим Только просмотр и не генерирует событие EVENT_CONTENT_CHANGED| | getText | Возвращает весь текст из окна редактора | | eraseText | Удаляет весь текст редактора | | selectedText | Получает или заменяет выделенный текст | | getSelection | Возвращает selection, аналог GetTextSelectionBounds| | setSelectionByLength | Устанавливает выделение, аналог первой сигнатуры SetTextSelectionBounds | | setSelection | Устанавливает выделение, аналог второй сигнатуры SetTextSelectionBounds | | getLineCount | Возвращает количество строк | | getLineContent | Возвращает содержимое строки по её номеру, аналог GetLine | | setLineContent | Устанавливает содержимое строки по её номеру, аналог ReplaceLine | | getCurrentLineContent | Возвращает содержимое текущей строки | | getCurrentLine | Возвращает номер текущей строки | | getCurrentColumn | Возвращает номер текущей колонки | | getCurrentWord | Возвращает текущее слово и его позици | | getModuleMethods | Возвращает JSON-описание процедур и функций модуля; список перехода открывается по CTRL+ALT+P | | getQuery | Определяет текст запроса в текущей позиции и возвращает его вместе с областью текста | | getFormatString | Определяет текст форматной строки в текущей позиции | | findText | Возвращает номер строки, в которой находится заданный текст | | addComment | Добавляет комментарий к текущему блоку кода | | removeComment | Удаляет комментарий у текущего блока | | addWordWrap | Добавляет перенос строки к текущему блоку | | removeWordWrap | Удаляет перенос строки у текущего блока | | insertLine | Вставляет текст в строку с указанным номером | | addLine | Добавляет новую строку с указанным текстом | | deleteLine | Удаляет строки с указанным номером | | getPositionOffset | Возвращает координаты текущей позиции курсора | | jumpToBracket | Переход к парной скобке CTRL+[] | | selectToBracket | Выделяет скобки и текст между ними SHIFT+ALT+B | | formatDocument | Форматирование выделенного фрагмента кода или всего кода ALT+SHIFT+F | | insertSnippet | Вставляет переданный сниппет в текущую позицию редактора | | revealDefinition | Переход к определению переменной, функции или поля запроса F12 | | peekDefinition | Быстрый просмотр определения переменной, функции или поля запроса CTRL+F12 | | getDifferences | Возвращает список различий в режиме сравнения | | hideBlocks | Сворачивает переданные диапазоны строк в обычном редакторе | | showHiddenBlocks | Раскрывает области, свернутые функцией hideBlocks |

Вкладки

| Функция | Описание | | ------------------------------ | --------------------------------------------------------------------------------------------- | | createTab | Создаёт и выбирает новую независимую вкладку с редактором | | closeCurrentTab | Закрывает текущую вкладку или очищает единственную вкладку | | getCurrentTab | Возвращает название и нулевой индекс текущей вкладки |

Управление режимом работы / настройками

| Функция | Описание | | ------------------------------ | --------------------------------------------------------------------------------------------- | | init | Инициализация редактора с передачей версии платформы и имени пользователя | | setLanguageMode | Переключение режимов редактора (встроенный язык, язык запросов и т.п.) | | setContextMode | Установка контекста редактора (сервер / тонкий клиент) | | getContextMode | Получение текущего контекста редактора (сервер / тонкий клиент) | | setTheme | Установка темы редактора bsl-white, bsl-white-query, bsl-dark, bsl-dark-query, bsl-edt-white, bsl-edt-dark| | setReadOnly | Устанавливает/снимает режим Только просмотр | | getReadOnly | Возвращает значение режима Только просмотр | | switchLang| Переключает язык подсказок с английского на русский и обратно | | enableQuickSuggestions | Включает/выключает режим быстрых подсказок | | minimap | Включает/выключает отображение карты кода | | wordWrap| Включает/выключает перенос строк | | compare | Включает/выключает режим сравнения текстов | | setDiffSideBySideMode | Включает/выключает двусторонее сравнение | | hideUnchangedBlocks | Скрывает неизмененные блоки в режиме сравнения | | showUnchangedBlocks | Показывает неизмененные блоки в режиме сравнения | | getDiffCount | Возвращает количество изменений в режиме сравнения | | nextDiff | Переход с следующему изменению в режиме сравнения | | previousDiff | Переход с предыдущему изменению в режиме сравнения | | getVarsNames | Возвращает имена всех объявленных в коде переменных | | disableContextMenu | Отключает показ контекстного меню | | showLineNumbers | Включает отображение номеров строк в редакторе | | hideLineNumbers | Отключает отображение номеров строк в редакторе | | hideScrollX | Скрывает стандартную горизонтальную полосу прокрутки | | hideScrollY | Скрывает стандартную вертикальную полосу прокрутки | | openSearchWidget | Открывает окно поиска | | closeSearchWidget | Закрывает окно поиска | | nextMatch | Переход к следующему совпадению в поиске | | previousMatch | Переход к предыдущему совпадению в поиске | | saveSearchHistory | Возвращает JSON-массив последних 10 строк поиска, от новой к старой | | restoreSearchHistory | Восстанавливает историю из JSON-массива строк; возвращает true или описание ошибки | | setFontSize | Установка размера шрифта | | setFontFamily | Установка семейства шрифтов | | setFontWeight | Установка насыщенности (толщины) шрифта | | setLineHeight | Установка высоты строки | | setLetterSpacing | Установка расстояния между символами | | setDefaultStyle | Установка стиля редактора по умолчанию | | showStatusBar | Включает отображение строки состояния в нижней части редактора | | hideStatusBar | Отключает отображение строки состояния | | renderWhitespace | Включает/отключает отображение пробелов и табуляций | | hasTextFocus | Возвращает признак активности фокуса | | setOption | Установка опциональных настроек редактора | | getOption | Получение опциональных настроек редактора | | disableKeyBinding | Отключает любое стандартное сочетание клавиш редактора | | enableKeyBinding | Включает обратно сочетание | | saveViewState | Возвращает JSON-строку с текущими настройками (положение курсора и прокрутки, а также свернутые блоки) | | restoreViewState | Восстанавливает настройки. В качестве аргумента принимает JSON-строку, полученную ранее через saveViewState | | parseHelp | Загружает Base64/Blob/File с shcntx, shlang, shquery или dcsui | | getHelpState | Возвращает состояние справки: признак готовности ready и полное состояние сервиса | | showHelp | Открывает справку текущего режима; с необязательной строкой поиска ищет, как CTRL+F1, только в готовом пакете | | showHelpLoader | Показывает скрытую по умолчанию панель ручного выбора файлов справки | | beginBase64Transfer | Начинает универсальную порционную передачу Base64 | | pushBase64Chunk | Добавляет часть Base64 с произвольной границей | | endBase64Transfer | Завершает передачу и публикует собранный Blob | | setOriginalText | Устанавливает или сбрасывает оригинальный текст, на основании которого строится подсветка изменений | | getOriginalText | Возвращает текст, установленный ранее функцией setOriginalText | | getCurrentLanguageId | Возвращает идентификатор текущего языка (bsl, bsl_query, dcs_query, xml) | | isQueryMode | Возвращает true, если редактор находится в режиме редактирования запроса и false в любом другом режиме | | isDCSMode | Возвращает true, если редактор находится в режиме СКД и false в любом другом случае | | isSuggestWidgetVisible | Возвращает видимость стандартного списка подсказок | | isParameterHintsWidgetVisible| Возвращает видимость списка подсказок для параметров функции/метода | | setDebugMode | Включает/выключает режим отладки (влияет на возможность использования команды "Вычислить выражение") | | isDebugMode | Возвращает true, если редактор находится в режиме отладки и false в другом случае | | setUsingDebugger | Включает/выключает возможность интерактивного управления точками останова | | isUsingDebugger | Возвращает true, возможность интерактивного управления точками останова включена и false в другом случае |

Взаимодействие

| Функция | Описание | | ------------------------------ | --------------------------------------------------------------------------------------------- | | updateMetadata | Обновляет через JSON структуру метаданных (Справочники/Документы/пр.) | | setObjectContext | Задаёт контекст объекта (реквизиты/методы/ТЧ доступны как в модуле объекта) | | clearObjectContext | Сбрасывает контекст объекта, заданный через setObjectContext | | clearMetadata | Очищает структуру метаданных | | clearBslGlobals | Очищает справочник глобальных объектов, сохраняя корневые разделы | | filterBslGlobals | Оставляет или исключает выбранные объекты справочника глобальных объектов | | updateSnippets | Обновляет пользовательские сниппеты | | parseSnippets | Загружает шаблоны кода (сниппеты) в формате 1С:Предприятия | | updateSnippetByGUID | Обновление текущего сниппета | | setDefaultSnippets | Возвращает стандартные шаблоны кода (сниппеты) | | clearSnippets | Очищает шаблоны кода (сниппеты) | | updateCustomFunctions | Обновляет пользовательские функции | | parseCommonModule | Загружает структуру общего модуля | | parseMetadataModule | Загружает структуру модуля менеджера или модуля объекта | | showImmediateHover | Показывает произвольную всплывающую подсказку | | setCustomHovers | Обновляет пользовательские подсказки, показываемые при наведении | | setCustomSignatures | Обновляет пользовательские подсказки по вызову процедуры/метода | | setCustomCodeLenses | Загружает подсказки для Code Lens | | addContextMenuItem | Регистрирует пользовательский пункт контекстного меню и связанное с ним событие | | markError | Индикация ошибки в указанной строке | | triggerSuggestions | Принудительный вызов подсказок | | triggerHovers | Принудительный вызов всплывающей подсказки для текущего слов | | triggerSigHelp | Принудительный вызов подсказки по вызову процедуры/метода | | showCustomSuggestions | Показ пользовательских подсказок | | showInlineSuggestion | Показ inline-подсказки в текущей позиции редактора | | triggerInlineSuggestions | Явный запуск штатных inline-подсказок Monaco | | resolveAIInlineCompletion | Передача результата AI inline-запроса из 1С | | setInlayHints | Показ инлей-хинтов — текстовых подсказок в строках кода | | clearInlayHints | Убирает все инлей-хинты текущей вкладки | | setQueryParamsTooltips | Показ тултипов значений параметров запроса (&Параметр) в режимах запроса/СКД | | setQueryDescription | Показ примечаний подзапросов у правого края строк в режимах запроса/СКД | | showPreviousCustomSuggestions| Вывод списка пользовательских подсказок, ранее показанных через showCustomSuggestions | | hideSuggestionsList | Скрывает текущий список подсказок | | hideHoverList | Скрывает активную всплывающую подсказку для слова | | hideSignatureList | Скрывает активную всплывающую подсказку по вызову процедуры/метода | | addBookmark | Создание закладки в строке с указанным номером | | removeBookmark | Удаление закладки из строки с указанным номером | | goNextBookmark | Переход к следующей закладке | | goPreviousBookmark | Переход к предыдущей закладке | | getBookmarks | Возвращает массив с номерами строк, в которых установлены закладки | | removeAllBookmarks | Удаляет все закладки | | setMarkers | Задает маркеры выделения | | getMarkers | Возвращает список установленных маркеров | | goNextMarker | Переход к следующему маркеру | | goPreviousMarker | Переход к предыдущему маркеру | | setActiveSuggestLabel | Устанавливает заголовок активного пункта списка подсказок | | setActiveSuggestDetail | Устанавливает подробное описание активного пункта списка подсказок | | revealLineInCenter | Переход к строке по её номеру и позиционирование по центру экрана | | goToFuncDefinition | Переход к определению процедуры/функции по имени | | getLastToken | Возвращает токен (вид слова) текущей позиции | | fold | Сворачиват текущий блок | | unfold | Разворачивает текущий блок | | foldAll | Сворачиват все блоки | | unfoldAll | Разворачивает все блоки | | showVariablesDescription | Вывод окна со значениями переменных (табло) | | updateVariableDescription | Обновление значения переменной в табло | | scale | Изменение масштаба (+1 - увеличить, -1 - уменьшить, 0 - сбросить) | | gotoLine | Перейти к строке... | | setActiveSuggestionAcceptors | Установка символов, подтверждающих выбор текущего пункта подсказки (в дополнение к Enter) | | setLineNumbersDecorations) | Установка текста слева от номера каждой строки | | startCodeReview | Активирует режим Code Review, в котором можно интерактивно добавлять замечания к коду | | stopCodeReview | Отключает режим Code Review | | getReviewIssues | Возвращает замечания, установленные в ходе Code Review | | setReviewIssues | Устанавливает замечания в режиме Code Review | | goNextIssue | Переход к следующему замечанию | | goPreviousIssue | Переход к предыдущему замечанию | | getBreakpoints | Возвращает сериализованный в JSON массив номеров строк точек останова | | updateBreakpoints | Устанавливает/удаляет точку останова в строке по её номеру | | removeAllBreakpoints | Удаляет все установленные точки останова | | setCurrentDebugLine | Устанавливает цветовое выделение строки отладки по её номеру | | deleteCurrentDebugLine | Удаляет цветовое выделение существующей строки отладки | | showModuleMethods | Показывает список процедур и функций текущего модуля |

События, генерируемые редактором для 1С:Предприятия

| Событие | Описание | | ------------------------------ | --------------------------------------------------------------------------------------------- | | EVENT_QUERY_CONSTRUCT | При выборе пункта меню "Конструктор запросов". Возвращает текст и позицию запроса | | EVENT_FORMAT_CONSTRUCT | При выборе пункта меню "Конструктор форматной строки". Возвращает текст и позицию форматное строки | | EVENT_TYPE_CONSTRUCT | Генерируется при выборе шаблона кода ВыборТипа | | EVENT_TYPEDESCRIPTION_CONSTRUCT | Генерируется при выборе шаблона кода КонструкторОписанияТипов | | EVENT_CONTENT_CHANGED | При любом изменении содержимого редактора (подробнее) | | EVENT_GET_METADATA | Генерируется при отсутствии метаданных. В параметрах передается имя запрашиваемых метаданных (подробнее) | | EVENT_XXX | При выборе пользовательского пункта меню. addContextMenuItem('Мой пункт', 'EVENT_MY') | | EVENT_ON_ACTIVATE_SUGGEST_ROW| При активации пункта в текущем списке подсказок (подробнее) | | EVENT_ON_DETAIL_SUGGEST_ROW | При активации подробного описания пункта в текущем списке подсказок (подробнее) | | EVENT_ON_SELECT_SUGGEST_ROW | При выборе пункта из списка подсказок (подробнее) | | EVENT_BEFORE_SHOW_SUGGEST | Перед появлением списка подсказок (подробнее) | | EVENT_BEFORE_HOVER | Перед появлением всплывающей подсказки для слова (подробнее) | | EVENT_BEFORE_SIGNATURE | Перед появлением всплывающей подсказки по вызову процедуры/метода (подробнее) | | EVENT_ON_LINK_CLICK | При клике по гиперссылке | | EVENT_KEY_BINDING_ХХХ | При нажатии отключенного сочетания клавиш (подробнее) | | EVENT_GET_DEFINITION | При переходе к определению (подробнее) | | EVENT_ON_GET_HELP | Опционально при запросе справки по слову через CTRL+F1 | | EVENT_ON_KEY_DOWN | При нажатии на клавиатуру (подробнее) | | EVENT_ON_INSERT_SNIPPET | При вставке сниппета (шаблона) (подробнее) | | EVENT_GET_VARIABLE_DATA | При расшифровке значения переменной в табло (подробнее) | | EVENT_ON_KEY_ESC | При нажатии ESC (подробнее) | | EVENT_EVALUATE_EXPRESSION | При выборе пункта меню "Вычислить выражение". Возвращает выделенный в редакторе текст | | EVENT_UPDATE_BREAKPOINTS | При интерактивном добавлении/удалении точки останова в редакторе. Возвращает сериализованный в JSON массив номеров строк точек останова | | EVENT_REMOVE_ALL_BREAKPOINTS | При интерактивном удалении всех точек останова в редакторе | | EVENT_ON_HELP_READY | После успешной загрузки или замены пакетов shcntx/shquery/dcsui. Параметр {kind} | | EVENT_ON_HELP_PREPARED | Ранний сигнал готовности справки (фаза prepared: оглавление и индекс заголовков готовы, полнотекстовая индексация ещё идёт). Параметр {kind} | | EVENT_AI_INLINE_COMPLETION_REQUEST | Запрос AI inline-подсказки у 1С | | EVENT_AI_INLINE_COMPLETION_CANCEL | Отмена ранее отправленного AI inline-запроса | | EVENT_TAB_CHANGED | Изменилась текущая вкладка или её нулевой индекс. Параметр {title, index} |

Перед началом работы с редактором из 1С Предприятия желательно вызвать функцию инициализации и передать в нее текущую версию платформы. Пример:

init('8.3.27.2130');

Переключение режимов работы

По умолчанию редактор находится в режиме редактирования кода (bsl). Для переключения режимов работы редактора служит функция setLanguageMode Пример:

// Переключение в режим языка запросов
setLanguageMode('bsl_query');
// Переключение в режим языка СКД
setLanguageMode('dcs_query');
// Переключение в режим XML
setLanguageMode('xml');
// Переключение в режим встроенного языка
setLanguageMode('bsl');

Справка выбирается по режиму: shcntx + shlang используются в bsl и xml, shquery — только в bsl_query, dcsui — только в dcs_query.

Горячие клавиши

Все горячие клавиши описаны тут

Продукты, использующие консоль

Проверенные платформы

  • 8.3.27.1719
  • 8.3.27.2130

Известные проблемы

  • В веб-клиенте недоступно любое взаимодействие редактора и 1С. Можно попробовать только набор кода, отображение кода, вывод режима сравнения.

Благодарности

Выражаю благодарность команде 1c-syntax и их проекту для VSCode за подробное описание внутренних конструкций языка в JSON, а также за коллекцию сниппетов.

Благодарность @vandalsvq за перевод на версиюю 0.55

Chat with me