-
Notifications
You must be signed in to change notification settings - Fork 4
Как устроен проект
[TOC]
Когда приступаешь к работе над чужим кодом - главное быстро разобраться, где что находится. Давайте попробуем это сделать.
Для начала вам необходимо подготовить рабочее окружение. Установить git, MS Visual Studio и др. инструменты. Предположим, что все уже установлено и настроено.
Откроем в Visual Studio файл 1Script.sln и посмотрим на структуру проекта.
Солюшен содержит несколько сборок:
Сборка | Описание сборки |
---|---|
oscript | Консольное exe-приложение, выполняющее сценарии в командной строке |
ScriptEngine | Ядро движка. Определяет базовые возможности языковых средств. Содержит компилятор и виртуальную машину |
ScriptEngine.HostedScript | Библиотека, обеспечивающая подключение скриптового движка к исполняющим приложениям (exe). Эта библиотека содержит все прикладные классы (Коллекции, Xml и прочее). |
ScriptEngine.Snegopat | Обеспечивает интеграцию с проектом "Снегопат" |
TestApp | Тестовое приложение с графическим интерфейсом. Позволяет писать несложные скрипты и выполнять эксперименты по изучению движка |
Как правило, расширение и развитие функционала должно реализовываться в библиотеке ScriptEngine.HostedScript.dll. Именно там содержатся все классы стандартной библиотеки и именно там нужно добавлять новые классы.
Термин | Описание |
---|---|
Компилятор | Совокупность объектов, выполняющих трансляцию языка 1С в байт-код скрипта |
Виртуальная машина | Объект, непосредственно выполняющий байт-код скрипта. ВМ реализована в классе MachineInstance |
Программное окружение | Набор всех классов, переменных и функций, видимых из языка. Это набор всех языковых средств, которые может использовать разработчик скрипта. |
Контекст | элемент программного окружения. Собственно, программное окружение представляет собой набор контекстов, подключенных к виртуальной машине. Все классы, доступные из языка, представляют собой контексты. |
Глобальный контекст | контекст, который подключен в глобальную область видимости. В результате все его свойства и методы доступны в скрипте как глобальные. |
Например, если контекст "Массив" подключить в глобальную область видимости, то глобально будут доступны функции Добавить(), Количество() и Получить(). | |
Глобальный контекст реализован именно как класс. Это обычный класс, но он подключен в глобальную область видимости, за счет чего все его свойства и методы в скрипте видны как глобальные. |
Каждое значение представлено типом IValue. Поскольку язык 1С слабо типизирован, то IValue может хранить любое значение. Все числа, строки, объекты, все это - экземпляры IValue.
Интерфейс IValue имеет несколько методов, позволяющих "добыть" из него конкретное значение:
- Функция AsString - приводит объект к строке и возвращает ее. Как правило, результат функции аналогичен стандартной ф-ии ToString(), но не обязательно.
- Функция AsNumber - приводит объект к типу decimal, т.е. получает тип Число. Если это невозможно, выбрасывается исключение "Приведение к типу Число невозможно"
- Функции AsDate/AsBoolean выполняют аналогичные приведения значений
- Функция AsObject приводит значение к объектному типу. Выбрасывает исключение "Значение не является значением объектного типа", если тип не является объектом.
Все объекты представлены экземплярами типа IRuntimeContextInstance. Этот тип является самым базовым для любых объектов.
Именно этот интерфейс используется для вызова свойств и методов объектов внутри виртуальной машины. Функция IValue.AsObject() возвращает как раз IRuntimeContextInstance.
Переменная хранит внутри какой-то IValue. Вне виртуальной машины IVariable позволяет организовать возврат значения через параметр (выходной параметр метода). об этом позже
Нужно взять одну из задач (или создать свою собственную задачу) со страницы Issues и реализовать ее. Для реализации задачи нужно будет завести отдельную ветку в GIT, а когда задача будет решена - прислать pull request.
Если возникают вопросы по разработке - не стесняйтесь спрашивать прямо в комментариях к выбранной Issue или на форуме поддержки.