Получение целочисленного массива в автооперации из вызываемого плагина

Автор Black_Walker, 28.11.25, 14:36:15

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Black_Walker

Здравствуйте! Возникла некоторая проблема с получением возвращённых плагином данных в автооперации.
В автооперации бизнес-процесса я вызываю плагин ЛОЦМАН:
 ids := ExecPluginFunction(stdotNETLib, 'RunOperation', ['TestMethod', 3, processID]); Переменная ids в автооперации при этом объявлена как массив:
 ids : array of Integer;Внешний плагин, метод которого я вызываю, написан на C#. Метод возвращает массив int:
 public int[] TestMethod(object[] parameters)Так вот, после получения результата вызова метода внешнего плагина при попытке обратиться к переменной ids через индексатор ЛОЦМАН выкидывает ошибку "Variable is not an array". Причём, если из внешнего плагина вернуть, например, просто целое число, то всё отрабатывает корректно. То есть плагин из автооперации вызывается правильно. Подскажите, как правильно получить массив из внешнего плагина?

lavgirb

Цитата: Black_Walker от 28.11.25, 14:36:15Подскажите, как правильно получить массив из внешнего плагина?
Это везде у КОМПАС.
Сделать свою функцию с проверкой на массив возвращаемого значения, если не массив, то создать массив с одним элементом.
Тогда со всеми значениями, возвращаемыми этой функцией, можно работать как с массивами. Что удобно. Как-то так.

Soultaker

Цитата: lavgirb от 28.11.25, 15:10:15Это везде у КОМПАС.
Сделать свою функцию с проверкой на массив возвращаемого значения, если не массив, то создать массив с одним элементом.
Тогда со всеми значениями, возвращаемыми этой функцией, можно работать как с массивами. Что удобно. Как-то так.
Вопрос про ЛОЦМАН.

PS Кстати, не везде.

lavgirb

Цитата: Soultaker от 28.11.25, 16:22:47Вопрос про ЛОЦМАН.

PS Кстати, не везде.

Допустим.
На вопрос Black_Walker можете ответить?

Цитата: Black_Walker от 28.11.25, 14:36:15...как правильно получить массив из внешнего плагина?

Soultaker

Цитата: lavgirb от 29.11.25, 20:36:10На вопрос Black_Walker можете ответить?
Гуглить не пробовали? https://stackoverflow.com/questions/5079200/how-to-correctly-marshal-vb-script-arrays-to-and-from-a-com-component-written-in
Опять же. Вы вроде работаете с API КОМПАС, Вас не удивляло, что в нём повсеместно используется SAFEARRAY?

Black_Walker

Тут проблема в том, что ExecPluginFunction() возвращает string, судя по справке SDK. Можно конечно же вернуть монолитную строку с разделителями и распарсить её, а потом каждую подстроку скастовать к integer. Но это не очень безопасно.

Black_Walker

В общем, пока что пришлось костылить. Пришёл к такому решению:
     processID := Route.inID;                                                                                     
                                                                                                 
     str := ExecPluginFunction(stdotNETLib, 'RunOperation', ['TestMethod', 3, processID]);
     
     notSignedList := TStringList.Create;                                                   
     notSignedList.Delimiter := ',';                 
     notSignedList.StrictDelimiter := True;                 
     notSignedList.DelimitedText := str;
Во внешнем плагине формирую строку с разделителями. А в автооперации с помощью TStringList разбираю её на коллекцию подстрок.
+ Благодарностей: 1

Chipollino

Цитата: Black_Walker от 01.12.25, 11:06:38В общем, пока что пришлось костылить. Пришёл к такому решению:
Такой процесс называется сериализация/десериализация. А для безопасности конвертации используйте TryStrToInt

Если не секрет, что такого делает библиотека и точно это нельзя выполнить в скрипте? Просто потом поддерживать/изменять и даже просто понять логику WF будет трудно, а порой и вовсе невозможно.

Black_Walker

Цитата: Chipollino от 02.12.25, 12:10:22Если не секрет, что такого делает библиотека и точно это нельзя выполнить в скрипте?

Если в двух словах, то у нас имеется бизнес-процесс, обрабатывающий много объектов (реально много, сотни). Так вот, из автооперации получение списка прикреплённых объектов к БП,  проверка их подписей и подписание неподписанных занимает 40 и более минут в некоторых случаях. Плагин получает список объектов прямым запросом в базу. Время обработки объектов с почти часа сократилось до 4-5 минут. API ЛОЦМАН в некоторых случаях работает критически медленно.

Soultaker

Цитата: Black_Walker от Вчера в 08:07:34Если в двух словах, то у нас имеется бизнес-процесс, обрабатывающий много объектов (реально много, сотни). Так вот, из автооперации получение списка прикреплённых объектов к БП,  проверка их подписей и подписание неподписанных занимает 40 и более минут в некоторых случаях. Плагин получает список объектов прямым запросом в базу. Время обработки объектов с почти часа сократилось до 4-5 минут. API ЛОЦМАН в некоторых случаях работает критически медленно.
Не завидую я Вам. Да и всем пользователям ЛОЦМАН. По себе знаю

Chipollino

Цитата: Black_Walker от Вчера в 08:07:34Если в двух словах, то у нас имеется бизнес-процесс, обрабатывающий много объектов (реально много, сотни). Так вот, из автооперации получение списка прикреплённых объектов к БП,  проверка их подписей и подписание неподписанных занимает 40 и более минут в некоторых случаях. Плагин получает список объектов прямым запросом в базу. Время обработки объектов с почти часа сократилось до 4-5 минут. API ЛОЦМАН в некоторых случаях работает критически медленно.
Если это запрос на T-SQL, то оформите его как хранимку для отчёта, но вызывайте её через API:
Variant GetReport(
 BSTR stReportName,        // название отчета
 Variant vaObjectList,        // коллекция идентификаторов объектов
 BSTR stParams,        // набор параметров
 Variant * inReturnCode,        // код возврата
 Variant * stErrorMessage        // сообщение об ошибке
);

// Возвращаемое значение
// Возвращает набор данных с полями, определенными в соответствующей хранимой процедуре.

+ Благодарностей: 1

Black_Walker

Цитата: Chipollino от Вчера в 08:30:09Если это запрос на T-SQL, то оформите его как хранимку для отчёта, но вызывайте её через API:
О, неплохой, кстати, вариант. Спасибо за совет! Попробую.