import{_ as i,c as a,a3 as n,o as t}from"./chunks/framework.CUlkWZrb.js";const g=JSON.parse('{"title":"Гайд по доработке движка","description":"","frontmatter":{},"headers":[],"relativePath":"community/engine-dev.md","filePath":"community/engine-dev.md"}'),h={name:"community/engine-dev.md"};function l(p,s,k,e,E,r){return t(),a("div",null,s[0]||(s[0]=[n(`
Разработка ведется в фичаветках, которые потом вливаются в ствол. Специальных веток, наподобие git-flow мы не используем, оказалось, что для нас слишком много формализма и слишком мало пользы.
Стволов у нас несколько, потому что одновременно поддерживается несколько версий:
Версия 1.x на данный момент самая распространенная и считается стабильной. Разработка новых фич в ней не ведется. Основана на .NET 4.8, на линуксе требует Mono
Разрабатываемая мажорная версия, пока не выпущена как официальная замена версии 1. Основана на актуальных версиях .NET, кроссплатформенная, собирается под windows, linus, MacOS ARM и x86
Вам нужно добавить обычный новый класс C#, дать ему какое-то имя %ВашеИмя% и унаследовать его от класса AutoContext<%ВашеИмя%>. Кроме того, класс нужно пометить атрибутом ContextClassAttribute.
using System;
using System.IO;
using ScriptEngine.Machine;
using ScriptEngine.Machine.Contexts;
namespace ScriptEngine.Machine.Library
{
[ContextClass("ЧтениеТекста", "TextReader")]
class TextReadImpl : AutoContext<TextReadImpl>, IDisposable
{
StreamReader _reader;
[ContextMethod("Открыть", "Open")]
public void Open(string path, string encoding = null)
{
if (encoding == null)
{
_reader = Environment.FileOpener.OpenReader(path);
}
else
{
var enc = Encoding.GetEncoding(encoding);
_reader = Environment.FileOpener.OpenReader(path, enc);
}
}
}
}В примере приведен фрагмент класса TextReadImpl, который в языке виден, как ЧтениеТекста. Класс унаследован от AutoContext<TextReadImpl> и помечен атрибутом ContextClassAttribute.
В принципе, этих простых действий достаточно, чтобы ваш класс появился в языке.
В приведенном примере класс не имеет конструктора. Экземпляр такого класса нельзя создать через оператор Новый, однако его можно вернуть, как результат какого-либо метода.
Чтобы экземпляры класс могли создаваться через оператор Новый, нашему классу нужно задать конструкторы. Конструктор реализуется в виде статического метода класса, помеченного атрибутом ScriptConstructorAttribute и возвращающего IRuntimeContextInstance.
[ScriptConstructor(Name="По имени файла и кодировке")]
public static IRuntimeContextInstance Constructor(IValue path, IValue encoding)
{
var reader = new TextReadImpl();
reader.Open(path.AsString(), encoding.AsString());
return reader;
}Методы класса - это обычные методы-члены класса C#, которые помечены атрибутом ContextMethodAttribute.
Типы параметров автоматически транслируются из типов языка 1С в типы языка C#
[ContextMethod("Открыть", "Open")]
public void Open(string path, string encoding = null)
{
if (encoding == null)
{
_reader = Environment.FileOpener.OpenReader(path);
}
else
{
var enc = Encoding.GetEncoding(encoding);
_reader = Environment.FileOpener.OpenReader(path, enc);
}
}Обратите внимание, параметры заявлены, как string. OneScript самостоятельно транслирует типы значений, передаваемых из скрипта в методы C# и выбрасывает исключения, если типы несовместимы.
Если метод имеет выходной параметр (возвращает значение в параметре), то этот параметр должен иметь тип IVariable и быть помечен атрибутом ByRefAttribute. Т.е. это должно выглядеть примерно так:
[ContextMethod("Свойство", "Property")]
public bool HasProperty(string name, [ByRef] IVariable value = null)
{
value.Value = ValueFactory.Create("Это строковое значение, передаваемое в скрипт");
}Второй параметр value является необязательным и в нем можно вернуть значение обратно в скрипт.
Свойство класса - это обычное свойство класса C#, помеченное атрибутом ContextPropertyAttribute.
[ContextProperty("Имя","Name")]
public string Name
{
get
{
return "some name";
}
}Доступность чтения и записи свойства регулируется двумя способами:
ContextPropertyAttributeВ приведенном примере свойство не содержит части set, поэтому оно будет доступно в скриптах только, как свойство "Для чтения". Если добавить туда часть set, то свойство будет доступно для записи.
OneScript самостоятельно регистрирует в системе доступность свойств и автоматически транслирует типы значений языка 1С в типы C# и обратно.
Чтобы добавить свой класс в язык, вам нужно: