Открытие интерфейса Полином:MDM из фрейма

Автор FeelsSoBad, 18.04.25, 15:49:12

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

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

FeelsSoBad

Добрый день, появился следующий вопрос - можно ли как-то открыть интерфейс Полинома:MDM из фрейма\плагина Лоцман? Задача заключается в следующем - необходимо реализовать кнопку, при нажатии на которую открывается интерфейс Полинома для выбора нужного объекта из базы. После выбора, объект связывается с выбранным (в интерфейсе Лоцмана) объектом. Можно ли это реализовать? Извиняюсь, если вопрос глупый, в документации по Лоцману не удалось найти похожего метода

Chaa

Как-то так:
var
    LProvider: Variant;
    LLocation: WideString;
begin
    LProvider := CreateOleObject('Polynom.BOSimpleProvider');
    if LProvider.Select(True, LLocation, Handle) then
    begin
        // LLocation - идентификатор выбранного объекта,
        // передается в Лоцман для создания объекта вместо обозначения (_PRODUCT).
        // Обозначение можно получить с помощью GetProductFromBO
    end;
end

FeelsSoBad

Если я правильно понял, это конкретно про связывание объектов. Можно ли именно открыть окно полинома из Лоцмана?

Chipollino

Любой справочник для работы с Лоцманом (в т.ч. сам Лоцман) должен реализовывать интерфейс IBOSimpleProvider со стандартным набором методов.
Один из методов - открыть окно справочника для выбора объекта.
bool Select(bool Modal, ref string Location, int clientWindow)
Параметры
Modal -  Параметр не используется, ему присваивается значение false.
Location - При подаче на вход отображет только заданный пакет. На выходе возвращает Location выбранного элемента.
clientWindow - Handle родительского окна.
В случае успешного выполнения (изделие выбрано, получен его Location) код возврата имеет значение 0.

После успешного выбора пользователем объекта в справочнике нужно перезаписанный Location отдать Лоцману для поиска в базе и создания объекта из внешнего справочника.


FeelsSoBad

Большое спасибо, теперь понял. Есть еще один вопрос - почему-то после выполнения Select через провайдер, сбивается интеграция полинома с лоцманом. Выглядит все примерно так:
- Проверяю работу интеграции с полиномом через создание объекта, для которого можно выбрать объект из полинома (в моем случае это оборудование)
- Нажимаю на кнопку "Выбрать из справочника" в правой части текстового поля "Объект". Окно полинома открывается
- Пробую открыть полином через свой функционал - открывается окно полинома, все нормально
- Второй раз окно полинома уже не открывается - причем ни через мой функционал, ни через стандартный лоцмановый. Что конкретно помогает опять поднять интеграцию - непонятно, то ли перезапуск сервера приложений лоцмана, то ли перезапуск полинома, то ли вообще непонятно что.
Может, сталкивались с такой ситуацией? Пример функции с вызовом окна:
try
{
    dynamic provider = Activator.CreateInstance(Type.GetTypeFromProgID("Polynom.BOSimpleProvider"));

    try
    {
        Console.WriteLine((string)provider.Connect("Storage=DemoMemo", true, null, null));
       
        var location = "0;Material:V5B3B2396562511D7882700508B01A93A;Sortament:V6A25FA24F2024846A417965BB2EC510D^SortamentEx:VF88E473663C511D7A551B5FF135EBA71";
       
        Console.WriteLine(location);

        if (provider.Select(true, ref location, 0))
        {
            Console.WriteLine($"NEW: {location}");

            var classId = string.Empty;
            var objectId = string.Empty;
            provider.GetObjectInfo(location, ref classId, ref objectId);

            var iObj = (IBOObject) provider.GetObject(classId, objectId, 0);

            if (iObj != null)
                File.WriteAllText(@"d:\ASCON\tmp\boobject.xml", iObj.XML);
        }
    }
    finally
    {
        provider.Disconnect();
    }
}
catch (Exception e)
{
    Console.WriteLine(e);
}
Console.ReadKey();

Chipollino

Предполагаю, что дело во множественных запущенных экземплярах Полинома. Во всяком случае я с этим эффектом столкнулся у МиС.
Порылся в исходниках, у меня это так реализовано было:
// Обращаемся к справочнику
// https://docs.microsoft.com/ru-ru/dotnet/api/system.activator.createinstance?view=netcore-3.1#System_Activator_CreateInstance_System_Type_
// https://forum.ascon.ru/index.php?topic=24406.msg175957#msg175957
BOSimple.IBOSimpleProvider ibo = null;
Type bo_type = null;
try
{
// По имени COM-сервера получаем его тип и создаем экземпляр BOSimpleProvider внешнего справочника
// ################################################################################################
// ВНИМАНИЕ!!! Загрузка COM объекта происходит не в текущую сборку плагина, а в mscorelib и поэтому при закрытии формы и даже Лоцман-клиента ОБЪЕКТ НЕ ВЫГРУЖАЕТСЯ ИЗ ПАМЯТИ!!!! 
// Отчётливо видно по Materials.exe остающемся в диспетчере задач ...
// TODO: 21.08.2020 - написать Chaa на форум или в блог, т.к. используем его плагин http://achechulin.blogspot.com/2018/10/plugin-c-sharp.html
// Решение 24.08.2020: https://docs.microsoft.com/ru-ru/dotnet/api/system.runtime.interopservices.marshal.releasecomobject?view=netcore-3.1
// Освобождаем COM объект BOSimple.IBOSimpleProvider в блоке finally через System.Runtime.InteropServices.Marshal.ReleaseComObject
bo_type = Type.GetTypeFromProgID(ServerProgID);
ibo = (BOSimple.IBOSimpleProvider)Activator.CreateInstance(bo_type);
// ################################################################################################
if (ibo.Status != 0) // Если инстанс не создался, то перехватим эксепшен в catch, поэтому без проверки на null
throw new Exception(string.Format("Ошибка подключения к справочнику \"{0}\" [{1}]\nСтатус: {2}",NativeName, ServerProgID, ibo.Status));
if (ibo.Select(true, ref stLocation, this._pluginCall.ClientHandle)){
// Обрабатываем успешный выбор объекта в справочнике
}
catch (Exception ex){

}
finally{
if (ibo != null)
System.Runtime.InteropServices.Marshal.ReleaseComObject(ibo);
ibo = null;
bo_type = null;
System.GC.Collect();
}

Цитата: Chaa от 19.04.25, 06:50:32Как-то так:
P.S. Хорошо, что оставляю себе комментарии в коде.
Выполняю намеченный в 2020 году TODO: Уважаемый Chaa, при работе с шаблоном плагина наткнулся на ошибку с работой бизнес-справочников, решение тут - https://docs.microsoft.com/ru-ru/dotnet/api/system.runtime.interopservices.marshal.releasecomobject?view=netcore-3.1  :-)))  :-)))

FeelsSoBad

Спасибо, попробую так. Есть только один момент - в диспетчере задач не видно ничего, связанного с Полиномом (в т.ч. и Materials.exe). При этом несколько раз перезапустил сервера приложений Лоцмана и Полинома, так и не получилось заставить интеграцию опять работать (проверяю через кнопку выбора объекта из справочника через стандартный функционал Лоцмана). Не подскажете, какие еще варианты можно попробовать?