JVM Native API плагин - для запуска в 1С плагинов написанных на Java

0. minimajack 69 20.06.18 16:13 Сейчас в теме
Запускаем виртуальную машину Java в 1С.
Собрана внешняя компонента которая позволяет запускать виртуальную машину java в среде 1С. Позволяет как передавать параметры в java - так и получать уведомление через externalevent.
Предпосылкой создания являлся тот факт, что есть много готового функционала которого не хватает в 1С. Язык сpp - довольно сложен для быстрой разработки, и теперь возможно использовать готовые сборки java классов (так называемые jar-файлы) для использования в 1С.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. blackhole321 1183 20.06.18 21:28 Сейчас в теме
А пример кода 1С:Предприятие (типа пример использования) можно добавить в публикацию?
2. minimajack 69 20.06.18 21:59 Сейчас в теме
(1) Компонента находится в стадии разработки
Если ПодключитьВнешнююКомпоненту(имядлл, "AddInNative",ТипВнешнейКомпоненты.Native ) Тогда
	Сообщить("Подключилась!");
	ОбъектJvm = Новый("AddIn.AddInNative.JVMLauncher");
	ОбъектJvm.javaHome = "d:/Program Files (x86)/Java/jdk1.8.0_172/";
	ОбъектJvm.libraryDir = "d:/";
	ОбъектJvm.AddJar("Runner-0.0.1-SNAPSHOT.jar");
КонецЕсли;
Показать

Далее вызываем метод и передаем имя java-класса который будет исполнять работу.
ОбъектJvm.LaunchInJVM("Compare");
ОбъектJvm.LaunchInJVM("Runner");
3. blackhole321 1183 20.06.18 22:21 Сейчас в теме
4. minimajack 69 20.06.18 22:54 Сейчас в теме
(3) Само апи пока не закончено. То есть передавать параметры можно - но в демо примере такого нет.
Разница между 1С и java слишком большая и скорее всего придется подготовить некоторый набор вариантов вызова:
LaunchInJVM - без параметра
LaunchInJVM_S с одним параметром типа строка
LaunchInJVM_SS с двумя параметрами типа строка
5. OLEG4120 154 21.06.18 09:00 Сейчас в теме
7. minimajack 69 21.06.18 10:48 Сейчас в теме
(5) возможность использования многочисленных java библиотек
6. fishca 1181 21.06.18 09:14 Сейчас в теме
8. minimajack 69 21.06.18 10:50 Сейчас в теме
(6) пока должным образом не проверял - сейчас апи наладить бы
12. minimajack 69 22.06.18 07:51 Сейчас в теме
(6) Потестил чуть больше - взлетает, по крайней мере виртуальную машину удалось завести (на 32-битах). Думаю проблем особых не будет.
Остальной код надо портировать и проверять
9. minimajack 69 21.06.18 14:21 Сейчас в теме
Обновил пример.
Поправил api - на текущий момент возможно вызывать передавая до 2-х параметров. Эти функции синхронные - то есть 1С ожидает завершения выполнения методов.

ОбъектВК.LaunchInJVM(<ИмяКласса>); - без параметров
ОбъектВК.LaunchInJVMP(<ИмяКласса>,<Параметр>); - с 1-м
ОбъектВК.LaunchInJVMPP(<ИмяКласса>,<Параметр1>,<Параметр2>); - с 2-мя

Типы параметров: строки, числа, булево. На основании типов параметров ищется метод в java ну и вызывается собственно.

Кейсы самые разные: что то вычислять (работает JIT-компилятор, поэтому шустро), создавать дополнительные окна (работает swing, awt) с информацией, чаты, да что угодно в общем то.
10. Infactum 291 21.06.18 15:57 Сейчас в теме
(9) Можно просто XML с параметрами передать. Будет один метод.
11. minimajack 69 21.06.18 16:13 Сейчас в теме
(10) иногда все же удобней хотя бы 2...например передать бинарные данные и строку, все же лучше чем конвертировать в xml, а потом распаковывать в java
13. minimajack 69 22.06.18 13:48 Сейчас в теме
Добавлены функции возвращающие байтики:
CallFInJVMB - без параметров
CallFInJVMBP - с одним параметром
CallFInJVMBPP - с двумя параметрами

Для примера:
CallFInJVMB - ОбъектВК.CallFInJVMB("ScreenShot"); получение скриншота экрана
CallFInJVMBP - ОбъектВК.CallFInJVMBP("GetFile", ПутьКФайлу); чтение файла

Вот такое в java - 2 строки и никакой возни с cpp
 
        Path path = Paths.get( file );
        return Files.readAllBytes( path );
    

Скриншот уложился в 5 строк
        Robot robot = new Robot();
        BufferedImage screenShot = robot.createScreenCapture( new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() ) );
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        ImageIO.write( screenShot, "JPG", buffer );
        return buffer.toByteArray();
    

p.s. Вот и преимущества java - работает из коробки, никаких плюсов (которые с++) и кроссплатформенно
p.s.s. Архив обновлен
14. minimajack 69 22.06.18 16:56 Сейчас в теме
Как повернуть PDF на 90 градусов
tPdf = ПолучитьИмяВременногоФайла("pdf");
		byteData = ОбъектВК.CallFInJVMBP("PDFRotator", ПутьКПДФ); 
		byteData.Записать(tPdf);
		ЗапуститьПриложение(tPdf);


В файлы добавлен bouncy castle provider - который надо распаковать в JAVA_HOME\jre\lib\ext\
Можно скачать самостоятельно
 bcmail-jdk15on-1.47.jar
bcpkix-jdk15on-1.47.jar
bcprov-jdk15on-1.47.jar


Java код
    PdfReader reader = new PdfReader( fileName );
        int n = reader.getNumberOfPages();
        int rot;
        PdfDictionary pageDict;
        for ( int i = 1; i <= n; i++ )
        {
            rot = reader.getPageRotation( i );
            pageDict = reader.getPageN( i );
            pageDict.put( PdfName.ROTATE, new PdfNumber( rot + 90 ) );
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfStamper stamper = new PdfStamper( reader, baos );
        stamper.close();
        reader.close();
        return baos.toByteArray();
Показать
15. virtex3 18 23.06.18 07:31 Сейчас в теме
а как на счет варианта, чтобы компонента работала на linux сервере где и запущен сервер 1С, чтобы пользователи не заморачивались с жавой?
16. minimajack 69 23.06.18 09:31 Сейчас в теме
(15) Под линукс ещё не портировал - да и на сервере не тестил.
Java это не только утилити возможности...
Визуализация полезна: для производства или склада можно отображать 3d модель по нажатию кнопки, отображать графики показателей(оборудования или ещё чего)...
Тот же пдф-повернуть? Зачем кидать на сервер(с сервера) сотни мегабайт, если локально за секунды получим результат?
В общем случае - не важно...есть инструмент, а как им работать каждый решает сам для себя
17. so-quest 132 27.06.18 07:49 Сейчас в теме
Наглый вопрос - Открытый репозиторий у компоненты есть?
19. minimajack 69 27.06.18 09:18 Сейчас в теме
18. Voffka 27.06.18 08:30 Сейчас в теме
20. minimajack 69 27.06.18 13:00 Сейчас в теме
Обновил примеры:
Можно открывать 3d модели(формат obj), вращать, приближать-удалять
21. minimajack 69 27.06.18 14:24 Сейчас в теме
Для всех стесняющихся - добавлено видео
o.nikolaev; +1 Ответить
22. minimajack 69 01.08.18 09:38 Сейчас в теме
Добавлен возврат строк из вызовов, архив обновлен.
Для примера используется распознавание ШК из картинки и возврат ШК в виде строки.
Строка64 = Base64Строка(Новый ДвоичныеДанные(ПутьКИзображениюШК));
Сообщить(ОбъектВК.CallFInJVMP("CodeScanner", Строка64, ""));

в java
   public static String mainInt(String param) throws IOException, NotFoundException
    {
        ByteBufferInputStream is = new ByteBufferInputStream( ByteBuffer.wrap( Base64.decode( param ) ) );
        BufferedImage bufferedImage = ImageIO.read(is);
        LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

        Result result = new MultiFormatReader().decode(bitmap);
        return result.getText();

    }
Показать
o.nikolaev; +1 Ответить
23. haverlon 10 11.12.18 15:09 Сейчас в теме
Вещь интересная, под Linux бы пользовалась спросом)))
24. minimajack 69 11.12.18 15:54 Сейчас в теме
(23) сомневаюсь...доля windows юзеров значительно больше - а спроса нет
25. Evil Beaver 6833 01.01.19 12:24 Сейчас в теме
Правильно ли я понял, что это аналог .NET Bridge для 1С от Elisy, только под Яву?
26. minimajack 69 01.01.19 19:45 Сейчас в теме
Это не полноценный мост...
Изначально позиционируется как замена внешних компонент на c++.
Концепция с созданием классов как в .NET bridge - но в 1с - мне не нравится.
А так написал полноценный код на java -> потестил -> упаковал и все запускается и в 32 и 64 битном режиме без танцев с бубнами.
27. minimajack 69 11.01.19 14:06 Сейчас в теме
Добавлено видео по работе с СКД в клиент-северном варианте.

Использовалась стандартная консоль СКД (разрешен вызов функций из общих модулей) на управляемых формах:
В вычисляемые поля добавлено ВызватьJavaКлиент("CompareDouble", Числа,&Поиск) - что приводит к вызову java функции с передачей параметров и возвратом результатов.

Получаем вычисляемое поле с расстоянием Левенштейна в консоле СКД

p.s. для 12000 строк, вызов функции происходил 36000 раз за 6,38 сек. на сервере

28. minimajack 69 16.01.19 15:50 Сейчас в теме
В публикацию добавлен пример написания простейшего плагина для чтения из Apache Kafka.
o.nikolaev; +1 Ответить
29. minimajack 69 17.01.19 16:10 Сейчас в теме
Архив обновлен, вместе с получателем добавлен демо-издатель Kafka.
Прежде чем тыкать в Кафку, необходимо запустить зукипер и кафка-сервер, иначе будете ждать подключения...

По нажатию на "Send to Kafka" - будет отправлено 10 000 пронумерованых сообщений на сервере (асинхронно). При ожиданиях между отправкой более 10 секунд издатель отправляет сообщение "Producer closed" и закрывается

По нажатию на "Load from Kafka" - будет получено либо 500 сообщений с начала партиции (если пустое поле данных), либо произойдет ожидание 5 секунд для получения данных.

Оба и издатель и подписчик обмениваются данными через топик "testTopic"
Перформанс:
1С + java - 3696 сообщений/сек
Вызов без 1С на java - 36554 сообщений/сек
Прикрепленные файлы:
o.nikolaev; +1 Ответить
39. o.nikolaev 201 17.11.19 14:42 Сейчас в теме
(29) На видео у вас в обработке еще нет команды Send to Kafka. Но в cf-ке в публикации уже есть. В файловом варианте, чтобы добиться выполнения команды send to немножко исправил текст команды:
&НаКлиенте
Процедура SendToKafka(Команда)
	//SendToKafkaНаСервере();
	Для нумератор=1 По 20000 Цикл
		ОбъектВК.CallFInJVMPP("KafkaExampleProducer",Строка(нумератор),Строка(нумератор), 1);
	КонецЦикла;
КонецПроцедуры
Показать


Подскажите, не по этому (https://dzone.com/articles/running-apache-kafka-on-windows-os) примеру все настраивали? :)
40. o.nikolaev 201 17.11.19 14:45 Сейчас в теме
(29) Все отлично работает. Спасибо!
Прикрепленные файлы:
30. minimajack 69 18.01.19 16:43 Сейчас в теме
Путем нехитрых манипуляций удалось ускорить издателя до 8-10 тысяч сообщений в секунду.
p.s. Архив обновлен
p.p.s. К сожалению количество сообщений пришлось увеличивать до 20 тысяч что бы замерить скорость...так что жать кнопку "Load from Kafka" придется в два раза больше
31. o.nikolaev 201 29.10.19 11:03 Сейчас в теме
Очень круто. А какой-то полноценный стабильный релиз, который в проде можно использовать, есть?
32. minimajack 69 31.10.19 22:30 Сейчас в теме
(31) в проде не использовал, но сомневаюсь что могут быть какие то серьезные проблемы.
Планировал выложить в опенсорс, но надо причесать исходники. А на это надо найти время.
33. o.nikolaev 201 31.10.19 23:03 Сейчас в теме
(32) А может ну его - причесывание - и выложить как есть :) ? Уж очень завораживающая вещь получилась. Просто думаю нашлись бы люди которые занялись и причесыванием и развитием.
34. minimajack 69 01.11.19 22:41 Сейчас в теме
(33) я не первый раз выкладываю...что то энтузиастов не находилось.
По факту мне надо убрать код проверки сертификата для паблика.
35. o.nikolaev 201 16.11.19 21:47 Сейчас в теме
(34) Так. Нет времени объяснять :) Что я могу сделать чтобы вы выложили исходники в public ? :)
36. o.nikolaev 201 16.11.19 23:36 Сейчас в теме
Не получается воспроизвести примеры. Выдается сообщение "JVMLauncher : Cannot find class.". Можете подсказать что не так делаю?
37. o.nikolaev 201 17.11.19 00:03 Сейчас в теме
(36) Отвечаю сам же. Подключил папку subst-ом как диск d:\ и положил в нее Runner-0.0.1-SNAPSHOT.jar
После этого пример заработал :)
38. minimajack 69 17.11.19 09:54 Сейчас в теме
Все верно. jar файлы загружаются из classpass(library dir)
Исходники надо очистить от сертификата. Если все срочно - напишите в личку, соберу индивидуально
41. o.nikolaev 201 17.11.19 14:54 Сейчас в теме
Ну и исходники Runner-0.0.1-SNAPSHOT.jar было бы бесценно скачать за SM вместе с выложенным примером. :) Подхватить-то удается конечно, но жалуется что Source not found :)
Прикрепленные файлы:
42. o.nikolaev 201 17.11.19 15:01 Сейчас в теме
Глупый вопрос - а зачем подписывать jar файлы?
43. minimajack 69 17.11.19 16:46 Сейчас в теме
(42) затем, что демокомпонента проверяет подпись и не дает выполнить неподписанный код.
Практически все исходники есть тут в качестве комментариев. Да и в любой ide можно глянуть...ничего там нет секретного)
44. o.nikolaev 201 17.11.19 20:51 Сейчас в теме
Еще вопрос - а предполагается развитие API? Чтобы все-таки можно было вызывать public методы java согласно их сигнатур? Еще вопрос: если, например в пакете в классе есть метод который возвращает значение типа другого класса, то можно ли помещать такое значение в переменную кода 1С и затем передавать в качестве параметра другому методу java-класса? Понимаю что можно это обойти создав, например void метод-обертку, который будет выполнять эту же операцию в самом java классе, но все-таки. Есть какие-то планы на этот счет?
45. minimajack 69 17.11.19 22:55 Сейчас в теме
Не вижу никакого смысла в вызове...ни скорости ни удобства.
Апи планируется править, но точно не в эту сторону.
Более рационально использовать как дополнение к native api - когда весь код заранее можно протестировать, а в 1с уже полноценно использовать
46. minimajack 69 18.11.19 09:15 Сейчас в теме
Добрался до компа...
Просто создавая объекты java, вызывая методы мы теряем во всем.

По сути вы хотите тот же Elisy.Net Bridge только на java.
плюсы:
- не надо собирать jar файлы
- можно писать код типа на java
минусы:
- в 99% случаев все равно потребуются какие то библиотеки, и одно дело когда мы собираем так называемый UberJar - со всем вместе( а там и включаем свои классы), другое что нам придется прописывать все jar файлы ручками и следить за их версиями...
- не возможно полноценное тестирование перед заливкой в 1С - юнит тесты и прочее проще организовать в java, а там и гит и все остальное из коробки.
- сами себе режем производительность: interop вызовы не бесплатны, чем реже прыгать java -> 1C -> java и т.п. тем выше скорость решения
- теряем в функциональности java - многие конструкции станут недоступны: try-with-resources, multicatch, case и т.п. это как вернутся в каменный век :)
48. o.nikolaev 201 18.11.19 22:18 Сейчас в теме
(46) :) Да, ступил. Это я уже потом и сам сообразил. Не столь развернуто правда :)
47. minimajack 69 18.11.19 10:20 Сейчас в теме
https://gist.github.com/MinimaJack/8573b375a1f5121a06e5b03c53c6f6aa
KafkaExampleProducer.java
предпосылки:
1. демо пример
2. получить максимум производительности за минимально затраченное время на разработку

Когда происходит вызов 1С, никакой отправки на самом деле не происходит, вместо этого:
при каждом вызове проверяется java-поток на наличие, и если его нет происходит запуск
при каждом вызове в очередь сообщений кладется сообщение

Java-поток берет на себя обязательства по отправке сообщений, опустошает очередь отсылая сообщения, при отсутствии 10 сек сообщений отключается

p.s. код написан на коленке, скорее всего с ошибками, не безопасен, но работает очень шустро. По идее подобный код можно использовать для логирования событий, когда незначительную часть сообщений можно потерять.
p.p.s На деле довольно таки стабильно отсылал сообщения. В прод не рекомендовал бы...но в свое время не выложил текст.
49. o.nikolaev 201 18.11.19 22:20 Сейчас в теме
(47) У меня ситуация такая что есть уже готовый профессиональный и отлаженный блок на Java для взаимодействия с Kafka и встала задача дотянуться до него из 1С-ки. Будем пробовать окучить сие с помощью компоненты.
50. minimajack 69 29.11.19 14:50 Сейчас в теме
Исходники доступны всем желающим

https://github.com/MinimaJack/JVM-plugin
dvsidelnikov; Labotamy; +2 Ответить
51. minimajack 69 03.12.19 16:30 Сейчас в теме
Существующий пример Kafka-получателя имел существенный недостаток.
При каждом получении данных происходило подключение и отключение к кафке, что вызывало дополнительные задержки связанные как с сетевым взаимодействием так и с ребалансировкой группы получателей.
Решение такое же простое как и с отправителем -> запускаем поток который будет закрывать получателя после продолжительного интервала.
Записал видео где два 1С клиента успешно общаются...
https://www.youtube.com/watch?v=jMl66aurQeI

Скорость конечно не супер, но 80001 сообщение со скоростью 2600 сообщений/сек доставлено(в видио есть вывод статистики по отправителю).

Проверил в асинхронном режиме...вполне себе удобно.
		оповещение = Новый ОписаниеОповещения("ЗавершитьПолучениеВсехДанных", ЭтотОбъект, "", "ЗавершитьПолучениеДанныхОшибка", ЭтотОбъект);
		ОбъектВК.НачатьВызовCallFInJVMPP(оповещение, "kafka.Consumer", 5, ПустаяСтрока(KafkaData), "");

Да, и теперь классы можно адекватно раскладывать по пакетам...kafka.Consumer, kafka.Producer, kafka.ProducerMetrics
o.nikolaev; +1 Ответить
52. o.nikolaev 201 06.12.19 06:12 Сейчас в теме
(51) А Kafka разве сама (сам) не отслеживает активность consumer-ов? Т.е. там если не хочешь влететь в ребалансировку надо непрерывно опрашивать. Ну дык на то она и "потоковая работа с данными" как я понимаю.
53. minimajack 69 06.12.19 09:42 Сейчас в теме
(52) JVM - живет столько сколько живет процесс rphost

Kafka выкинет только если heartbeat - перестанет поступать...а что ему не поступать если Consumer так и останется запущенным и будет отправлять heartbeat.

например:
у нас 2 rphost-а(2 сервера или 2 процесса):
на rphost#1 запустилось регламентное задание, запустился consumer#1, стал лидером - получил сообщения и ждет еще вызова из 1С...но в 1С регламентное задание завершилось. Неважно по какой причине...получены все сообщения или только определенный batch(1000 сообщений и хватит). JVM - продолжает работать, consumer#1 все так же сидит в лидерах и ждет от 1С приказов.

на rphost#2 запускается регламентное задание, запустился consumer#2 ( другой процесс, другая JVM) и ждет пока станет лидером...и тут вопрос в kafke - когда и вообще сделает ли она ребалансировку consumer-ов так, что бы consumer#2 стал лидером и начал получать сообщения для регламентного задания на rphost#2.


Решения два:
1. со стороны 1C - закрывать consumer при завершении регламентного задания.
минусы:
если регламентное задание отрабатывает маленькими пачками и часто, будут переподключения к кафке и создания новых consumer-ов
плюсы
железно подключаемся одним consumer-ом
2. со стороны java - закрывать consumer в другом потоке по истечении какого то интервала со времени последнего вызова.
минусы:
надо подбирать интервал согласно скорости обработки, если он будет меньше скорости обработки - consumer-ы переподключатся.
Например 1С обрабатывает пачку за 10 секунд - можно поставить интервал в java 15 секунд(с последнего вызова). Если 1С затупит - старый закроется , создастся новый Consumer - совершенно без дополнительных телодвижений.
плюсы
если регламентное задание запускается чаще интервала, consumer будет переиспользоваться.
54. kickout 14 10.12.19 09:04 Сейчас в теме
Скачал либы, начал тестить, и есть несколько моментов. (64 разрядка)
Небольшой итог по тому в чем удалось разобраться и чего тут не описано.
1) в классе в яве который подключаем должен быть публичный статик метод(функция) mainInt()
2) не удалось запустить не подписанный jar файл
3)при попытке передать параметры говорит что "много фактических параметров"
4) подписать jar файл пока не удалось

Что пробовал делать я
1) Создал хелоу ворлд свой на яве, вывел в отдельный класс, пишет что класс не найден.
2) с прилоденным архивом пока тоже не получилось пораьотать, выходит ошибка но уже говорит "mainInt" т.е. класс находит, наверно дело в подписи jar файла

Что делаю не так и какие еще есть нюансы использования dll?
Качал последний архив, самый свежий.
55. minimajack 69 10.12.19 10:51 Сейчас в теме
LaunchInJVM* - вызов процедур, первый параметр имя класса

LaunchInJVM - без параметров                   => void mainInt()                                =>  VK.LaunchInJVM   ( ИМЯ_КЛАССА)
LaunchInJVMP - процедура с одним параметром    => void mainInt(int param)                       =>  VK.LaunchInJVMP  ( ИМЯ_КЛАССА, Параметр1)
LaunchInJVMPP - процедура с 2-мя параметрами   => void mainInt(int param, int param2)           =>  VK.LaunchInJVMPP ( ИМЯ_КЛАССА, Параметр1, Параметр2)


CallFInJVM* - вызов функций, первый параметр имя класса, от типа последнего параметра зависит возвращаемое значение:
VK.CallFInJVM("JavaClass", 1) =>
public static int mainInt()    {
    }

VK.CallFInJVMP("JavaClass", 1, "") =>
public static String mainInt(int param)    {
    }

VK.CallFInJVMPP("JavaClass", 1,0.5, "") =>
public static String mainInt(int param, float param2)    {
    }

CallFInJVM    - функция без параметров         => int mainInt()                                 =>  VK.CallFInJVM      ( ИМЯ_КЛАССА, 1)
CallFInJVMP   - функция с одним параметров     => int mainInt(int param)                        =>  VK.CallFInJVMP     ( ИМЯ_КЛАССА, Параметр1, 1)
CallFInJVMPP  - функция с 2-мя параметрами     => int mainInt(int param,int param2)             =>  VK.CallFInJVMPP    ( ИМЯ_КЛАССА, Параметр1, Параметр2, 1)
CallFInJVMPPP - функция с 3-мя параметрами     => int mainInt(int param,int param2,int param3)  =>  VK.CallFInJVMPPP   ( ИМЯ_КЛАССА, Параметр1, Параметр2, Параметр3, 1)


ОбъектВК.CallFInJVMPP("CompareDouble",Строка1,Строка2,0.01)

	ОбъектВК = JVM_ПовтИсп.ВернутьКомпонентJava();
	ОбъектВК.libraryDir = "блабла"; // путь к Jar-ам по умолчанию d:/
	ОбъектВК.AddJar("Runner-0.0.1-SNAPSHOT.jar"); // используемый jar 


Код 1С:
ОбъектВК.LaunchInJVMP("factorial.Get", Число); 

Код Java:

public class Get
{

    private native void log( String info );

    public static void mainInt(int number)
    {

        Get r = new Get();
        r.log( new String( "Привет из джава! Object hash is " + r.hashCode() ) );

        BigInteger result = null;
        for ( int i = 0; i < 1; i++ )
        {
            result = BigInteger.valueOf( 1 );

            for ( long factor = 2; factor <= number; factor++ )
            {
                result = result.multiply( BigInteger.valueOf( factor ) );
            }
        }

        r.log(result.toString());
    }

}
Показать
Прикрепленные файлы:
native.zip
jvmcf.cf
Runner-0.0.1-SNAPSHOT.jar
56. kickout 14 10.12.19 11:10 Сейчас в теме
(55)
LaunchInJVMP

Во... чуть стало понятнее, как вызывать с параметрами и без, но у меня теперь вот такая штука выходит
Так я подключаюсь.
&НаКлиенте
Процедура test(Команда)
	имядлл = "C:\testNativeJVM\JVMLauncher64.dll";
	Если ПодключитьВнешнююКомпоненту(имядлл, "AddInNative",ТипВнешнейКомпоненты.Native ) Тогда
		Сообщить("Подключилась!");
		ОбъектJvm = Новый("AddIn.AddInNative.JVMLauncher");
		ОбъектJvm.javaHome = "C:\Program Files\Java\jdk1.8.0_162\";
		ОбъектJvm.libraryDir = "C:\testNativeJVM\";
		ОбъектJvm.AddJar("1cjvm.jar");
		ОбъектJvm.LaunchInJVMP("Testc",456);
	КонецЕсли
КонецПроцедуры
Показать

57. kickout 14 10.12.19 11:24 Сейчас в теме
(56)
Всё получилось, была путаница с методами, теперь вроде всё понял.
Будем дальше тестить и что то изобретать))))
Спасибо, за пояснения.
Было бы классно если бы в публикацию добавили про вызов процедур и функций явы через 1с, а то путаница идет.
И последний вопрос, как много можно передавать параметров?
Поддерживаются только примитивные типы? (про массив и структуры пока можно мечтать или даже мечтание не поможет?))))
58. minimajack 69 10.12.19 11:58 Сейчас в теме
(57)
В функцию можно до 4-х параметров, в процедуру можно до 2-х...
Возможно увеличить если будет необходимость
Ни массивы, ни структуры - сама 1С не даст отправить...точно работают строки, числа (int ,float, double)
Возможен только возврат массива байт в Бинарные данные:
CallFInJVMB  - byte[] mainInt()  
CallFInJVMBP - byte[] mainInt(param)  


Все остальное только через сериализацию ЗначениеВСтрокуВнутр...
59. kickout 14 10.12.19 12:14 Сейчас в теме
(58)
Дополню одной идеей, не знаю насколько это профитно,но...
Как мне кажется удобнее будет переделать вызов класса и метода примерно вот так (Runner.getAll, , )
т.е. пишется класс, а потом через точку метод который необходимо вызвать, чтобы не привязываться исключительно к mainInt
ну или как то по другому реализовать, но суть в том чтобы можно было явно указать метод который необходимо выполнить, ну и через запятую параметры для метода.
вдруг в классе будет 2 и более метода которые можно выполнить, а то получается одна точка входа, а тут уже появляется выбор...
да и городить тогда классы под каждый метод не надо будет.
60. minimajack 69 10.12.19 13:08 Сейчас в теме
(59) идея нормальная...
Возможно реализовать альтернативным апи: ClassFunctionCall, ClassFunctionCallP,ClassFunctionCallPP
По сути надо стандартизировать апи, а то сейчас есть разброс в именовании...

Проще отправлять прямиком предложения в репо: https://github.com/MinimaJack/JVM-plugin/issues
61. minimajack 69 11.12.19 16:54 Сейчас в теме
(59) Добавлено
Вызовы эквивалентны
		ОбъектВК.CallFInJVM("time.utils.Current", '00010101'));
		ОбъектВК.ClassFunctionCall("time.utils.Current.mainInt", '00010101'));


time.utils - package
Current - class
mainInt - имя метода

Тип Даты работает и в параметрах и в возвращаемом результате, с учетом адекватности на вхождение в unixtime интервал.
Прикрепленные файлы:
native.zip
62. kickout 14 12.12.19 10:02 Сейчас в теме
(61)
Огонь,а есть аналогичное для процедуры?
63. minimajack 69 27.01.20 10:46 Сейчас в теме
(62) Добавил
ОбъектВК.LaunchInJVMPP("graphics.ViewObjModel",~,~);
ОбъектВК.ClassProcedureCallPP("graphics.ViewObjModel.mainInt",~,~);

Добавлена поддержка запуска на 11+ java
64. Simplyare 14.04.20 23:51 Сейчас в теме
Не работают функции "Расстояние Левинштейна" и "Повернуть PDF".
При попытке повернуть pdf вываливается ошибка:

{Обработка.ТестированиеJVM.Форма.УправляемаяФорма.Форма(98)}: Ошибка при вызове метода контекста (CallFInJVMBP)
byteData = ОбъектВК.CallFInJVMBP("PDFRotator", ПутьКПДФ);
по причине:
Ошибка внешней компоненты

С чем может быть связано?
Другие функции работают корректно.
65. minimajack 69 16.04.20 06:42 Сейчас в теме
PDFRotator - для него надо обязательно добавить bouncy castle provider. В 14 сообщении описание.
bcmail-jdk15on-1.47.jar
bcpkix-jdk15on-1.47.jar
bcprov-jdk15on-1.47.jar
66. Vix 27 25.04.20 17:06 Сейчас в теме
Интересная идея, плюсую однозначно. Есть желание вот написать плагин который будет фотографировать и изображение сохранять в файл, интересно получится или нет такое сделать через это решение?
67. minimajack 69 28.04.20 01:11 Сейчас в теме
Это же только для десктопа. Возможно использовать вебкамеру, но сам не использовал
https://github.com/sarxos/webcam-capture
68. Ruler 83 07.08.20 16:20 Сейчас в теме
1. Добрый день, подскажите есть ли у вас планы написать немного документации? Хотя бы простое описание api, пошаговый пример простейшего плагина? Видео здорово, но в дополнение к тексту как демонстрация, что инструкция или гайд рабочие. Я к сожалению видимо слишком туп, и у меня не получилось сделать свой плагин...
3.Поясните, чем опасно
"Виртуальная машина запускается один раз и может быть запущена только в одном экземпляре;" -
- это относиться к одному сеансу 1С, одному сеансу пользователя или к чему?

Думаю, что у многих есть интерес, но натыкаясь на отсутствие документации, неочевидность шагов по созданию плагинов, желание тратить время пропадает...
69. minimajack 69 14.08.20 14:49 Сейчас в теме
(68) извиняюсь...пропустил коммент

1. Постараюсь в свободное время, по крайней мере выложу на гит пример компоненты
3. Если виртуальная машина запускается на один "процесс операционной системы", неважно это клиент или сервер...

Ок, постараюсь исправить эти моменты
70. comol 4372 22.09.20 12:53 Сейчас в теме
Просто отмечуь здесь что бэээ.... Для чего нужно - ХЗ:
1) Клиентские истории - используйте JS внутри WebKit - не надо этого всего... и 3D можно нарисовать через WebGL и просто порисовать через canvas и svg animation можно. И ничего подключать не надо

2) Серверные - ну тут вообще компонента это странная история - поднимаем микросервис на чём угодно и общаемся с ним через http интерфейс

Ну если уж очень хочется серверную компоненту и у вас там "C:\Program files"... юзайте .net - там ничего не надо ставить и прописывать. Обёртка уже испытанная временем и на инфостарте валяется давно.
71. minimajack 69 22.09.20 14:58 Сейчас в теме
(70) Если у вас стойкое отвращение JVM и вы не знаете для чего и зачем это нужно - можете проходить мимо.
72. comol 4372 22.09.20 17:01 Сейчас в теме
(71) мысль верная последовательность не та. Я очень хорошо знаю что такое JVM, поэтому у меня к нему стойкое отвращение.... И поэтому не могу пройти мимо когда ее куда то пихают не понимая зачем
Оставьте свое сообщение
Вопросы с вознаграждением