EvilBeaver / OneScript

Исполняющая среда скриптов на языке 1С
http://oscript.io
Mozilla Public License 2.0
471 stars 106 forks source link

В модуль добавить метод ПриПолученииТипаЗначения(Объект) #1098

Closed steelvan closed 3 years ago

steelvan commented 3 years ago

Начинаю изучать ваш движок с точки применения для написания приложений вместо 1С платформы. Сразу вопрос по поводу ТипЗнч() в общем и для перечислений в частности.

Как в 1С

Создается объект метаданных "Перечисление" со значениями. Например, Перечисление.ВидКонтрагента.Поставщик или Перечисление.ВидКонтрагента.Покупатель. Данное равенство будет истинным: ТипЗнч(Перечисления.ВидКонтрагента.Покупатель) = Тип("ПеречислениеСсылка.ВидКонтрагента")

Предложение сделать в Оскрипте

В модуль добавить предопределенную функцию ПриПолученииТипаЗначения(Объект). Данная функция должна неявно вызываться из метода ТипЗнч(Объект). Данная функция должна возвращать строку, которая должна быть в описании типа.

Пример применения Создается модуль "Перечисления". В нем создаются экспортные переменные для каждого перечисления в виде структуры. Ключами структуры должны являться значения перечисления, значения могут быть простого типа. При получении типа значения через ТипЗнч(Объект) должна неявно вызываться функция ПриПолученииТипаЗначения(Объект), внутри которой должен быть пользовательский код, который должен проанализировать объект и вернуть строку, которая и должна быть описанием типа.

// Файл "Перечисления.os"

Перем ТипыКонтрагентов Экспорт;

ТипыКонтрагентов = Новый Структура("Покупатель, Поставщик", "Покупатель", "Поставщик");

Функция ПриПолученииТипаЗначения(Объект) Экспорт

    ЗначениеВозврата = "Тип не определен";

    // Некий код анализа
    Если Объект = "Покупатель" Тогда
        ЗначениеВозврата = "ПеречислениеСсылка.ТипыКонтрагентов";
    КонецЕсли

    Возврат ЗначениеВозврата;

КонецФункции

// Файл script.os

Сообщить(ТипЗнч(Перечисления.ТипыКонтрагентов.Покупатель)); // ПеречислениеСсылка.ТипыКонтрагентов

Понятно, что при таком подходе надо проверку писать более тщательную и стараться исключать пересечения по значениям перечислений. Но хоть что-то для работы с расширениями типов. На этом уже можно пробовать строить работу со справочниками, документами и прочими наборами.

EvilBeaver commented 3 years ago

А зачем? Я не очень понял выходную пользу этого. Чтобы что? Сейчас собственные типы можно объявлять через механизм библиотек и загрузки классов.

steelvan commented 3 years ago

Ну хорошо. Если считаете лишним, то закрывайте.

steelvan commented 3 years ago

Польза в том, чтобы можно было работать с объектами метаданных. Например как в оскрипте сделать вот такое ?

Сообщить(ТипЗнч(Перечисления.ТипыКонтрагентов.Покупатель)); // ПеречислениеСсылка.ТипыКонтрагентов Сообщить(ТипЗнч(Перечисления.ТипыКонтрагентов.Поставщик)); // ПеречислениеСсылка.ТипыКонтрагентов Сообщить(ТипЗнч(Перечисления.ТипыКонтрагентов.Посредник)); // ПеречислениеСсылка.ТипыКонтрагентов

steelvan commented 3 years ago

Я смотрю немного наперед и продумываю более-менее полноценную работу с перечислениями, справочниками, документами и прочими объектами. Хочу на основе оскрипта попробовать сделать систему быстрой разработки веб-приложений по 1Сным принципам.

steelvan commented 3 years ago

Это видел https://infostart.ru/1c/articles/840993/ не, спасибо :)

nixel2007 commented 3 years ago

для работы с объектами и в целом с ORM уже есть entity. перечисления уже реализуются как обычные модули с экспортными переменными, что туда положить зависит только от вас. ТипЗнч на такой модуль будет таким, как модуль зарегистрирован в системе типов, в т.ч. можно сделать и ТипыКонтрагентов. Пример реализации можно посмотреть в той же entity.

nixel2007 commented 3 years ago

в частности entity работает в OneScript.Web. в каталоге примеров есть пример использования, да и в целом на гитхабе можно найти использование этой библиотеки

EvilBeaver commented 3 years ago

Посмотри на https://github.com/EvilBeaver/OneScript.Web Он, конечно, очень далек от совершенства, и вообще первый блин, но надо же от чего-то отталкиваться.