Skip to content

Как устроен проект

artbear edited this page Dec 5, 2014 · 10 revisions

[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 - универсальное значение

Каждое значение представлено типом IValue. Поскольку язык 1С слабо типизирован, то IValue может хранить любое значение. Все числа, строки, объекты, все это - экземпляры IValue.

Интерфейс IValue имеет несколько методов, позволяющих "добыть" из него конкретное значение:

  • Функция AsString - приводит объект к строке и возвращает ее. Как правило, результат функции аналогичен стандартной ф-ии ToString(), но не обязательно.
  • Функция AsNumber - приводит объект к типу decimal, т.е. получает тип Число. Если это невозможно, выбрасывается исключение "Приведение к типу Число невозможно"
  • Функции AsDate/AsBoolean выполняют аналогичные приведения значений
  • Функция AsObject приводит значение к объектному типу. Выбрасывает исключение "Значение не является значением объектного типа", если тип не является объектом.

IRuntimeContextInstance - базовый объектный тип

Все объекты представлены экземплярами типа IRuntimeContextInstance. Этот тип является самым базовым для любых объектов.

Именно этот интерфейс используется для вызова свойств и методов объектов внутри виртуальной машины. Функция IValue.AsObject() возвращает как раз IRuntimeContextInstance.

IVariable - просто переменная

Переменная хранит внутри какой-то IValue. Вне виртуальной машины IVariable позволяет организовать возврат значения через параметр (выходной параметр метода). об этом позже

Как добавить что-либо в проект

Нужно взять одну из задач (или создать свою собственную задачу) со страницы Issues и реализовать ее. Для реализации задачи нужно будет завести отдельную ветку в GIT, а когда задача будет решена - прислать pull request.

Если возникают вопросы по разработке - не стесняйтесь спрашивать прямо в комментариях к выбранной Issue или на форуме поддержки.

См. также

Clone this wiki locally