Мне нужно, чтобы при выборе колонки в справочнике подгружались и ещё дополнительные значения по этой колонке. В основной версии я это могу сделать, перечислив нужные мне колонки в columns в lookupListConfig в настройке соответствующей справочной колонки в attributes. Как мне сделать аналогичное в мобильном приложении? Скажем, мне нужно в активности получить колонку Account.UsrParentAccount.UsrCode или что-то подобное.

Нравится

2 комментария

Добрый день!

Если необходимо отобразить дополнительную колонку в реестре, это можно сделать с помощью SDK реестра - https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/sdk-reestra. Если задача другая, опишите, пожалуйста, ее подробнее, а также с какой целью необходимо ее реализовать.

Одеяненко Юлия,

Нет, это совсем не то.

Впрочем, сам уже разобрался. Делается это через sdk страницы, например так:

Terrasoft.sdk.RecordPage.addColumn("Activity", {
    name: "Account.UsrCode",
    hidden: true
}, "primaryColumnSet");

Тогда и нужная колонка будет подгружаться. Только если это доп. поле нужно на странице детали и зависит от родительской колонки, например, Activity.Account.UsrCode, то нужно добавлять колонку к родительскому объекту, чтобы получить доступ к нужной колонке при создании записи.

Показать все комментарии

Добрый день!

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

Изображение удалено.

Нравится

1 комментарий

Судя по типу доступных для выбора колонок, дело в том, что в реестре у Вас настраивается агрегирующая колонка по обратной связи. То есть она строится не по конкретной записи с детали, а по всем подходящим одновременно.

В таких случаях можно подсчитать количество записей, максимум и минимум по дате, максимум, минимум и среднее по числовому значению. Выбор справочника или логического значения в таком контексте не имеет смысла.

Показать все комментарии

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

Нравится

5 комментариев

Здравствуйте!

Реестр справочника и так открывается если нажать на значение - http://prntscr.com/jixl4c

Как вариант можете реализовать пользовательское действие - https://www.dropbox.com/s/80xtv5f8ngqviru/%D0%9F%D0%BE%D0%BB%D1%8C%D0%B…

Вильшанский Дмитрий,

Мне нужно открывать справочник, не связанный со страницей, и перед этим ещё могут потребоваться доп. действия. Просто справочным полем не получится это реализовать.

Есть возможность поместить кнопку именно где-то посреди страницы? Дейсвтие для пользователя будет довольно неудобным. Или это принципиально невозможно?

Бершеда Д. Н.,

Можете посмотреть алгоритм реализации в похоже топике:

https://community.terrasoft.ru/questions/dobavlenie-kastomnyh-elementov-v-mobilnom-prilozenii

Если нужно открыть пикер для выбора значения, то посмотрите MobileActivityGridPageControllerV2. Там много пример открытия пикеров. Например, для выбора «Ответственного» (метод getEmployeePicker()

) или выбора режима расписания (метод getGridModePicker()).

Вильшанский Дмитрий,

Спасибо, всё получилось. Только возникла проблема другого характера. После изменения значений записи из кода на самой странице по-прежнему отображаются старые значения. Как это можно исправить?

Бершеда Д. Н.,

Так как представил только направление куда смотреть, то сложно сказать в чем проблема.

Используйте отладку для выяснения причины - https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/otladka-mobi…

Показать все комментарии

Добрый день.

При попытке сохранить новую запись в бд через esq возникает ошибка на методе Save():

"Ссылка на объект не указывает на экземпляр объекта..    в Terrasoft.Core.DB.Select.GetSqlText()"

Код:

var schema = UserConnection.EntitySchemaManager.GetInstanceByName("OrderProduct");
			var esqEntity = schema.CreateEntity(UserConnection);
			esqEntity.SetColumnValue("Id", entity.BpmId);
            ....
            esqEntity.SetColumnValue("CurrencyId", entity.CurrencyId);
            esqEntity.UseAdminRights = false;
            esqEntity.Save();

 

Нравится

1 комментарий

Сообщение «Ссылка на объект не указывает на экземпляр объекта» означает, что в C#-коде конфигурации или ядра в какое-то поле попадает Null, а с ним пытаются работать как с объектом. Например, обращаться к его полям и методам. Не видя полного кода и стека сложно сказать точно, где именно.

Показать все комментарии

Добрый день. Возникла необходимость скрыть стандартную деталь на странице мобильного приложения. Есть ли возможность это реализовать?

Нравится

3 комментария

Добрый день. Вот тут предоставили хороший ответ: https://community.terrasoft.ru/questions/skrytie-standartnoi-detali-v-k…

Парамонов Роман,

благодарю. Всё получилось.

Здравствуйте! 



Один из вариантов реализации этой задачи - перекрыть в контроллерах страниц метод onBusinessRuleExecuted, который отрабатывает после выполнения бизнес-правил и в котором можно найти нужный элемент у panel-а и скрыть\показать его.

Ext.define("CustomUsrHaulPreviewPage.Controller", {

    override: "UsrHaulPreviewPage.Controller",

 

    onBusinessRuleExecuted: function(record, rule, ruleResult) {

        this.callParent(arguments);

        var view = this.getView();

        var panel = view.getPanel();

        var type = record.get("UsrDriverCheckType");

        var isNeededType = (type && type.getId() === "079acedd-585f-4a0e-aff0-eb419ec09925");

        var panelItems = panel.getItems();

        for (var i = 0, ln = panelItems.getCount(); i < ln; i++) {

            var item = panelItems.items[i];

            if (item instanceof Terrasoft.ViewEmbeddedDetail &&

                    item.getName() === "UsrSchema11DetailEmbeddedDetail") {

                var isItemHidden = item.getHidden();

                if (type && isNeededType) {

                    if (!isItemHidden) {

                        item.setHidden(true);

                    }

                } else if (type) {

                    if (isItemHidden) {

                        item.setHidden(false);

                    }

                }

            }

        }

    }

 

});

Ext.define("CustomUsrHaulEditPage.Controller", {

    override: "UsrHaulEditPage.Controller",

 

    onBusinessRuleExecuted: function(record, rule, ruleResult) {

        this.callParent(arguments);

        var view = this.getView();

        var panel = view.getPanel();

        var type = record.get("UsrDriverCheckType");

        var isNeededType = (type && type.getId() === "079acedd-585f-4a0e-aff0-eb419ec09925");

        var panelItems = panel.getItems();

        for (var i = 0, ln = panelItems.getCount(); i < ln; i++) {

            var item = panelItems.items[i];

            if (item instanceof Terrasoft.EditEmbeddedDetail &&

                    item.getName() === "UsrSchema11DetailEmbeddedDetail") {

                var isItemHidden = item.getHidden();

                if (type && isNeededType) {

                    if (!isItemHidden) {

                        item.setHidden(true);

                    }

                } else if (type) {

                    if (isItemHidden) {

                        item.setHidden(false);

                    }

                }

            }

        }

    }

 

});

Либо же 

Создаем новую схему UsrMobileAccountPreviewPage (с типом «Модуль»)

/* globals Account: false */

Terrasoft.LastLoadedPageData = {

&nbsp;&nbsp;&nbsp;&nbsp;controllerName:&nbsp;"UsrAccountPreviewPage.Controller",

&nbsp;&nbsp;&nbsp;&nbsp;viewXType:&nbsp;"usractivitypreviewpageview"

};

Ext.define("UsrAccountPreviewPage.View", {

&nbsp;&nbsp;&nbsp;&nbsp;extend:&nbsp;"AccountPreviewPage.View",

&nbsp;&nbsp;&nbsp;&nbsp;xtype:&nbsp;"usractivitypreviewpageview",

&nbsp;&nbsp;&nbsp;&nbsp;config: {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:&nbsp;"AccountPreviewPage"

&nbsp;&nbsp;&nbsp;&nbsp;},

&nbsp;&nbsp;&nbsp;&nbsp;/**

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @inheritdoc

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @protected

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @overridden

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/

&nbsp;&nbsp;&nbsp;&nbsp;shouldHidePanelItem:&nbsp;function(loadedRecord, component) {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var detailName = component.config.name;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (detailName ===&nbsp;"ActivityDetailV2StandartDetail") {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var categoryId = loadedRecord.get("AccountCategory.Id");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return categoryId !== Terrasoft.Configuration.AccountCategory.DoctorVisit;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return this.callParent(arguments);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;}

});

Ext.define("UsrAccountPreviewPage.Controller", {

&nbsp;&nbsp;&nbsp;&nbsp;extend:&nbsp;"AccountPreviewPage.Controller",

&nbsp;&nbsp;&nbsp;&nbsp;statics: {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model: Account

&nbsp;&nbsp;&nbsp;&nbsp;},

&nbsp;&nbsp;&nbsp;&nbsp;config: {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refs: {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view:&nbsp;"#AccountPreviewPage"

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;}

});

Прописываем ее в манифесте

"Models": {

&nbsp;&nbsp;&nbsp;&nbsp;"Account": {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Preview":&nbsp;"UsrMobileAccountPreviewPage",

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...

Показать все комментарии

Добрый день!

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

 

Изображение удалено.

 

Нравится

3 комментария

Добрый день, было бы неплохо увидеть ошибки с консоли, раз вы не переопределяли ничего связанного со справочником.

Дмитрий, здравствуйте!

Значение, которое у Вас выводится как undefined, берется из локализируемой строки в схеме LookupPageViewModelGenerator, название строки - CaptionLookupPage. Проверьте, возможно, там затерлось значение, или эта локализируемая строка вообще отсутствует.

Юлия, спасибо! Действительно, схема LookupPageViewModelGenerator была мной переопределена, а параметр LookupPageCaptionPrefix был не заполнен.

Показать все комментарии

Добрый день.

подскажите как мне сделать выполнения определенного кода старте bpm'online, который регистрирует BPM'Online в определенном сервисе. И так же при выключении BPM'Online делает unregister.

Нравится

1 комментарий

"при выключении BPM'Online" - это очень странная фраза, учитывая, что bpm-серверное приложение и всегда активно. Ну допустим, что все пользователи не будут бездумно жать на крест в браузере(я так понимаю тогда вообще не отследить), а будут разлогиниваться перед закрытием приложения(кто блин вообще так делает в 2018?)

1) logout в MainHeaderSchema в функции onExitMenuItemClick

2) при входе грузится ViewModuleWrapper и ConfigurationViewModule. Я думаю легче перегрузить wrapper(в нем меньше мусора)



Но, опять же, при такой архитектуре всё будет работать в "лабораторных" условиях: пользователь залогинился, НЕ обновляет никакие страницы, (скорее всего) не открывает доп вкладки (иначе происходит загрузка приложения с нуля, отработает теоретический register), перед закрытием браузера выходит из приложения.

Возможно, кто-нибудь из разработчиков подскажет, можно ли с серверной стороны как-то отследить пользователя (ip-шники же пишутся в деталь пользователя)

Показать все комментарии

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

Нравится

1 комментарий

Здравствуйте! 

В базовой версии предусмотрена работа только с цифровыми, дробными и булевскими полями. Ниже базовый метод схемы EditListItem: 

createEditComponentByColumnName: function(columnName) {

        var model = this.getModel();

        var columnConfig = model.ColumnConfigs.get(columnName);

        var config = {

            name: columnName,

            markerValue: columnName

        };

        switch (columnConfig.columnType) {

            case Terrasoft.ColumnTypes.number:

                config.xtype = "tsintegerfield";

                break;

            case Terrasoft.ColumnTypes.decimal:

                config.xtype = "tsfloatfield";

                break;

            case Terrasoft.ColumnTypes.bool:

                config.xtype = "tstoggle";

                break;

            default:

                return null;

        }

        return this.createFieldComponent(config);

    },

 

Мы зафиксируем Ваше пожелание для рассмотрения аналитиками продукта.

Показать все комментарии

При отправке POST из BPM на внешний веб-сервис возникает ошибка. Сайт крутится на https. Сервис тоже на https.

System.Net.WebException: Базовое соединение закрыто: Не удалось установить доверительные отношения для защищенного канала SSL/TLS. ---> System.Security.Authentication.AuthenticationException: Удаленный сертификат недействителен согласно результатам проверки подлинности.
   в System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
   в System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   в System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   в System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   в System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   в System.Net.ConnectStream.WriteHeaders(Boolean async)
   --- Конец трассировки внутреннего стека исключений ---
   в System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   в System.Net.HttpWebRequest.GetRequestStream()
   в Terrasoft.Configuration.ContactLoad.ContactLoad.GetResponse()
   в Terrasoft.Configuration.ContactLoad.ContactLoad.GetContacts()
   в Terrasoft.Core.Process.UsrStartContactServiceMethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Когда отправляю из Postman, респонс приходит корректно. Возможно дело в настройках IIS?

 Вот код запроса : 

 

var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ServerCertificateValidationCallback = delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
httpWebRequest.Method = WebRequestMethods.Http.Post;
httpWebRequest.Timeout = 240000;
httpWebRequest.ContentType = "application/json";
httpWebRequest.ServicePoint.Expect100Continue = false;
httpWebRequest.ContentLength = data.Length;
Stream stream = httpWebRequest.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
try
{
	var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
	using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
	{
		result = streamReader.ReadToEnd().ToString();
	}
}
catch (Exception ex)
{
	throw new Exception("Failed to get response. : " + ex.Message);
	return ex.Message;
}

 

Нравится

3 комментария

В postman проходит успешная проверка из-за того, что вы отключили проверку сертификата

https://stackoverflow.com/questions/777607/the-remote-certificate-is-invalid-according-to-the-validation-procedure-using

Варианты решения вопроса с ошибкой доступны в открытых источниках.

Сергей Кy6риш,

У меня в коде присутствует отключение проверки сертификата 

 

httpWebRequest.ServerCertificateValidationCallback = delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

 

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

Показать все комментарии

Коллеги, добрый день!

Мне необходимо внести изменения в базовый конфигурационный сервис AdministrationServiceUsers.

Возможно ли создать замещающую схему для сервиса? 

Подскажите, как правильно это сделать? В академии не нашел информации.

Нравится

3 комментария

Добрый день, Павел.

Вносить изменения в базовые веб сервисы нет возможности.

Для этих целей Вам необходимо реализовать собственный веб - сервис,

Вы можете выполнить наследование в своем сервисе от базового, но, так как многие методы нет возможности переопределить, оптимальным решением будет реализовать полностью свой сервис по аналогии с базовым.

Подробно вопрос конфигурирования веб-сервисов рассматривается в видео-обучении. https://www.youtube.com/watch?v=rbdB7LFgNf0&feature=youtu.be

Антон Малий,

а случайно ссылки на "День 2" у Вас нет?

Александр О,

Продвинутая разработка, день 2 (внимание, версия 7.11, многое устарело): https://youtu.be/y45IHGDm0WY

Показать все комментарии