EvilBeaver / oscript-library

Библиотека полезных скриптов для 1Script
http://oscript.io/docs/page/libraries
Apache License 2.0
118 stars 46 forks source link

Нужна статья про то, как создать компоненту средствами 1Скрипта, а не C# #179

Closed ArsenShnurkov closed 6 years ago

ArsenShnurkov commented 6 years ago

Неясно, как это сделать (и можно ли), http://oscript.io/dev/page/components

Вроде бы компонента/библиотека начинается с файла package-loader.os - http://oscript.io/docs/page/libraries

кроме того, есть (http://oscript.io/library) заманчивая картинка

Но всё вместе оно как-то не складывается в голове, как надо что писать и куда класть в файловой системе.

nixel2007 commented 6 years ago

В планах на ближайший месяц-два. Либо одна большая - как сделать библиотеку и как сделать приложение, либо две поменьше.

nixel2007 commented 6 years ago

как это сделать (и можно ли)

большинство библиотек написаны на oscript, а не на c# :)

bambr1975 commented 6 years ago

https://infostart.ru/public/548028/ раздел "Схема загрузки библиотек", плюс уже упомянутый http://oscript.io/docs/page/libraries плюс https://github.com/oscript-library/oscript-lib-template и https://github.com/oscript-library/oscript-app-template

ArsenShnurkov commented 6 years ago

Простой вопрос - чем "классы" отличаются от "модулей"? У них какой-то особый синтаксис? Где этот синтаксис описан?

bambr1975 commented 6 years ago

http://oscript.io/docs/page/package-loader Под классом понимается новый тип в системе типов приложения. Экземпляры объектов этого типа создаются через оператор Новый. Модуль это то же самое, что ОбщийМодуль в системе 1С:Предприятие. Модуль - это свойство в глобальном контексте, методы которого мы можем вызывать из языка.

ArsenShnurkov commented 6 years ago

я имею в виду синтаксис в месте определения класса, а не в месте использования через оператор Новый

nixel2007 commented 6 years ago

Классы инстанцируются с помощью оператора Новый. Каждый инстанс имеет свои собственные версии глобальных переменных скрипта. Модули инстанцируются при начале работы приложения, как общие модули конфигурации. Глобальные переменные таких модулей (если они есть) общие на все время выполнения

nixel2007 commented 6 years ago

у класса еще есть необязательный метод ПриСозданииОбъекта.

различий в синтаксисе описания классов и модулей нет, т.к. этого не позволяет сама грамматика 1С

ArsenShnurkov commented 6 years ago

в языке C# для класса есть ключевое слово "class", есть ли подобное в 1Скрипт? Или класс отличается от модуля только тем, что в классе описаны переменные в глобальном скопе, а в модуле не описаны?

nixel2007 commented 6 years ago

в языке C# для класса есть ключевое словл "class", есть ли подобное в 1Скрипт?

нет, такого нет. все различие - в способе инстанцирования.

nixel2007 commented 6 years ago

Или класс отличается от модуля только тем, что в классе описаны переменные в глобальном скопе, а в модуле не описаны?

в модуле тоже могут быть переменные в глобальном скоупе.

EvilBeaver commented 6 years ago

@ArsenShnurkov все как на картинке. Будет файл "классом" или "модулем" зависит от того, в какой папке он лежит. Внутри синтаксически они не отличаются никак.

Если копнуть еще глубже, то дело не в папках, а в алгоритме модуля package-loader.os. Именно он решает в какую из групп "класс"/"модуль" отнести тот или иной файл .os

EvilBeaver commented 6 years ago

@bahtiy - это к кому просьба? Про написать?

EvilBeaver commented 6 years ago

Ничо не понял

ArsenShnurkov commented 6 years ago

Ничего не получается.

// Файл main.os
#Использовать Classes

Перем символ;
символ = Новый Символ();
символ.Выступить_С_Речью();
// Файл oscript.cfg
lib.additional = .;
// Файл package-loader.os
ДобавитьКласс("./Classes/symbol.os", "Символ");
// Файл Classes/symbol.os
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Процедура Выступить_С_Речью() Экспорт
    Перем консоль;
    консоль = Новый Консоль();
    консоль.ВывестиСтроку("за роботу товарещи");
КонецПроцедуры

Результат:

{Модуль main.os / Ошибка в строке: 5 / Ожидается идентификатор}
ArsenShnurkov commented 6 years ago

Так тоже не работает

// Файл main.os
Попытка
    ПодключитьСценарий("symbol.os","Символ");
    Высказать();
Исключение
    Сообщить("Пичаль/бида");
КонецПопытки;
// Файл symbol.os
Процедура Высказать() Экспорт
    Сообщение("за роботу товарещи");
КонецПроцедуры

Пишет

{Модуль main.os / Ошибка в строке: 4 / Неизвестный символ: Высказать}

$ oscript -v | head -1 1Script Execution Engine. Version 1.0.19.0

есличё, новее релизов нет в списке тэгов репозитория

arkuznetsov commented 6 years ago

@ArsenShnurkov : // МойКласс.os

Процедура ПриСозданииОбъекта()
    Сообщить("Создан класс!");
КонецПроцедуры

Процедура МойМетод() Экспорт
    Сообщить("Вызван метод");
КонецПроцедуры

//main.os

ПодключитьСценарий("МойКласс.os", "МойКласс");

ЭкземплярКласса = Новый МойКласс();

ЭкземплярКласса.МойМетод();

вот так работает

ArsenShnurkov commented 6 years ago

Ясно, слово "Символ" неудачное было... Надо было использовать "СимволПрорыва"

EvilBeaver commented 6 years ago

Вопрос решен вроде бы

EinstokFair commented 6 years ago

Не затруднит ли Вас в таком случае добавить сюда ссылку на эту замечательную обучающую статью с официального сайта 1Скрипт, раз уж вопрос решен. Или таки не решен?

nixel2007 commented 6 years ago

http://oscript.io/docs

Статья под заголовком "Исчерпывающее руководство по созданию библиотеки 1Script" ведет на мою статью на ИС.