Вопрос

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

У меня такой же вопрос

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

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

Реестр справочника и так открывается если нажать на значение - 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()).

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

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

Войдите или зарегистрируйтесь, чтобы комментировать

Добрый день.
При попытке сохранить новую запись в бд через 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 = {

    controllerName: "UsrAccountPreviewPage.Controller",

    viewXType: "usractivitypreviewpageview"

};

Ext.define("UsrAccountPreviewPage.View", {

    extend: "AccountPreviewPage.View",

    xtype: "usractivitypreviewpageview",

    config: {

        id: "AccountPreviewPage"

    },

    /**

     * @inheritdoc

     * @protected

     * @overridden

     */

    shouldHidePanelItem: function(loadedRecord, component) {

        var detailName = component.config.name;

        if (detailName === "ActivityDetailV2StandartDetail") {

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

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

        } else {

            return this.callParent(arguments);

        }

    }

});

Ext.define("UsrAccountPreviewPage.Controller", {

    extend: "AccountPreviewPage.Controller",

    statics: {

        Model: Account

    },

    config: {

        refs: {

            view: "#AccountPreviewPage"

        }

    }

});

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

"Models": {

    "Account": {

        ...

        "Preview": "UsrMobileAccountPreviewPage",

        ...

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

Добрый день!

При открытии любого лукапа в системе, рядом с названием объекта справочника пишется 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.

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

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

У меня такой же вопрос

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

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

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

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

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

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

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

Добрый день!

Добавил на кастомную страницу базовую деталь FileDetailV2 из пакета UIv2.

При инициализации детали падает ошибка: 

user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: undefined
 line: undefined
 column: undefined
 message: Cannot read property 'initDropzoneEvents' of undefined 
 date: Fri Apr 20 2018 10:17:45 GMT+0400 (RTZ 3 (зима))
 moduleId: CardModuleV2_fa04f9ca-d9d9-4c1e-bae9-ef23c8b24925_FinApplicationPage_detail_FileDetailV2snIntegrationLogFile
 moduleName: DetailModuleV2

При этом вручную добавить файлы на деталь невозможно.

В другом разделе деталь работает корректно, добавлена аналогично.

Подскажите, в чем может быть проблема?

 

У меня такой же вопрос

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

Дмитрий, добрый день! 

Попробуйте передобавить деталь согласно SDK - https://academy.terrasoft.ru/documents/technic-sdk/7-12/dobavlenie-deta…

Либо как во вложении https://www.dropbox.com/s/uhruk6kh04y0zjr/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%B5%D1%82%D0%B0%D0%BB%D0%B8%20%D1%84%D0%B0%D0%B9%D0%BB%D1%8B%20%D0%B8%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8.docx?dl=0

Также в версии 7.12.1 появится возможность добавить деталь "Файлы и ссылки" пользовательскими средствами.

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

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

Реализовал кастомную кнопку закрытия обращения с выпадающим меню. Но никак не могу найти, как установить цвет выпадающих кнопок. Мне необходимо все 5-кнопок сделать разными цветами. 

. 

 

А так же интересует каким образом можно добавить для выпадающей кнопки Значок, по аналогии с кнопкой "Экспорт в Excel" в меню "Действия"?

Спасибо!

У меня такой же вопрос

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

Добрый день

Чтобы реализовать раскраску цветами, то:

1. Каждое меню должно быть уникальное

2. Добавить css стиль

К примеру, у меня есть 2 пункта меню. Чтобы я мог реализовать корректный selector, то мне нужно их как-то назвать. Поэтому, в методе, где формируется menuItem я явно буду указывать Id этого меню. После чего можно будет писать что-то типа:

#myMenuItem {
    background-color: green;
}

 

Теперь по значкам.

Как вы сами заметили, что хотите добавить значок по аналогии, то вам и нужно сделать по аналогии :). Вот как это сделано в BaseSection

Артем Гура,

Спасибо, но не совсем понято как указать id каждого из меню в методе.

Вот мой метод:

getCustomCloseActions: function() {
 
	self = this;
	var actionMenuItems = Ext.create("Terrasoft.BaseViewModelCollection");
		actionMenuItems.addItem(this.getButtonMenuItem({
			"Tag": "5",
			"Caption": "Закрыть с оценкой 5",
			"Click": {bindTo: "OnCustomClosedButtonMenuClick"}
		}));
		actionMenuItems.addItem(this.getButtonMenuItem({
			"Tag": "4",
			"Caption": "Закрыть с оценкой 4",
			"Click": {bindTo: "OnCustomClosedButtonMenuClick"}
		}));
		actionMenuItems.addItem(this.getButtonMenuItem({
			"Tag": "3",
			"Caption": "Закрыть с оценкой 3",
			"Click": {bindTo: "OnCustomClosedButtonMenuClick"}
		}));
		actionMenuItems.addItem(this.getButtonMenuItem({
			"Tag": "2",
			"Caption": "Закрыть с оценкой 2",
			"Click": {bindTo: "OnCustomClosedButtonMenuClick"}
		}));
		actionMenuItems.addItem(this.getButtonMenuItem({
			"Tag": "1",
			"Caption": "Закрыть с оценкой 1",
			"Click": {bindTo: "OnCustomClosedButtonMenuClick"}
		}));
	self.set("CloseButtonMenuItems", actionMenuItems);
 
},

 

Обратите внимание на метод getButtonMenuItem: как он работает по умолчанию, и как он работает, например в BaseSection.

Особенно то, как формируется значок Excel и как генерируется Id.

А дальше сделать всё по аналогии.

Войдите или зарегистрируйтесь, чтобы комментировать