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

Хотим сделать чтобы в редактируемом реестре записи отображались как ссылки для удобного перехода, нашел что для этого необходимо добавить признак useLinks: true для DataGrid и метод-обработчик linkClicked, но это почему-то не меняет ситуацию, строки отображаются как обычно... ошибок в консоли нет

Код DataGrid:

{
    "operation": "merge",
    "name": "DataGrid",
    "values": {
        "className": "Terrasoft.ConfigurationGrid",
        "generator": "ConfigurationGridGenerator.generatePartial",
        "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
        "changeRow": {"bindTo": "changeRow"},
        "unSelectRow": {"bindTo": "unSelectRow"},
        "onGridClick": {"bindTo": "onGridClick"},
        "activeRow": {"bindTo": "ActiveRow"},
        "selectedRows": {"bindTo": "SelectedRows"},
        "activeRowActions": [
            {
                "className": "Terrasoft.Button",
                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "save",
                "markerValue": "save",
                "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
            },
            {
                "className": "Terrasoft.Button",
                "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "card",
                "markerValue": "card",
                "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
            },
            {
                "className": "Terrasoft.Button",
                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "cancel",
                "markerValue": "cancel",
                "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
            },
            {
                "className": "Terrasoft.Button",
                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "remove",
                "markerValue": "remove",
                "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
            }
        ],
        "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
        "activeRowAction": {"bindTo": "onActiveRowAction"},
        "multiSelect": false,
        "useLinks": true,
        "primaryColumnName": "Id",
        "sortColumnIndex": null,
        "listedZebra": true,
        "type": "listed"
    }
}

 

Посмотрите, пожалуйста, может я что-то упустил

Нравится

3 комментария
Лучший ответ

Добрый день!

Я бы Вам рекомендовал посмотреть в сторону метода addColumnLink в GridUtilitiesV2. Так же можно изучить поподробнее как формируются ссылки в FileDetailV2

Добрый день!

Я бы Вам рекомендовал посмотреть в сторону метода addColumnLink в GridUtilitiesV2. Так же можно изучить поподробнее как формируются ссылки в FileDetailV2

Обрати внимание на флаг showValueAsLink (и выше тебе уже ответили в системе множество примеров, потрать немного времени и разберись)

ПРимер использования ниже

{
    "operation": "insert",
    "name": "UsrURLpage",
    "values": {
        "layout": {
            "colSpan": 12,
            "rowSpan": 1,
            "column": 0,
            "row": 3,
            "layoutName": "Header"
        },
        "labelConfig": {},
        "enabled": true,
        "bindTo": "UsrURLpage",
        "showValueAsLink": true,
        "href": {
            "bindTo": "UsrURLpage",
            "bindConfig": {"converter": "getUsrURLpageLink"}
        },
        "controlConfig": {
            "className": "Terrasoft.TextEdit",
            "linkclick": { bindTo: "onUsrURLpageLinkClick"}
        }
    },
    "parentName": "Header",
    "propertyName": "items",
    "index": 6
}

 

Переопределил метод addColumnLink, спасибо Константину за наводку:

addColumnLink: function(item, column) {
    this.callParent(arguments);
 
    var columnPath = column.columnPath;
    if (columnPath === "UsrProduct") {
        item["on" + columnPath + "LinkClick"] = function() {
            var value = this.get(columnPath);
            return {
                caption: item.values.UsrProduct.displayValue,
                target: "_self",
                title: item.values.UsrProduct.displayValue,
                url: "/0/Nui/ViewModule.aspx#CardModuleV2/ProductPageV2/edit/" + item.values.UsrProduct.value
            };
        };
    }
}

При переходе по ссылке появились ошибки в консоли, видимо не мог поставить фокус при переходе, просто убрал фокус на это поле:

focusActiveRowControl: function(columnName) {
    if (!columnName || columnName === "UsrProduct") {
        return;
    }
    var activeRow = this.getActiveRow();
    activeRow.set("Is" + columnName + "Focused", true);
    this.currentActiveColumnName = columnName;
}

 

Всем спасибо за помощь...)

 

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

Добрый день!

При использовании команды "debugger;" появляется сообщение об ошибке "forgotten 'debugger' statement".

Требуется ли дополнительно править что-то в конфигах или подключать в самом js-файле?

Спасибо!

Нравится

3 комментария
Лучший ответ

На это сообщение можно не обращать внимание, оно носит информационный характер.

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

На это сообщение можно не обращать внимание, оно носит информационный характер.

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

Алла Савельева,

Спасибо! А то я тут уже и исходные коды перерыл, и академию с сообществом. :)

Информационное предупреждение JSHint (используется для проверки синтаксиса JS в bpmonline), как написала Алла можно игнорировать это не Error а Warning.

Смысле его в том чтобы не ушел в продакшен код с отладочными операторами/командами информацией и тд!

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

Добрый день!

По кнопке из карточки кастомного раздела запускаю БП.

Он создает по своей логике пачку записей в детали, которая выведена на текущей карточке.

Как после этого обновить реестр детали?

Пользовался следующей ссылкой:

https://academy.terrasoft.ua/documents/technic-sdk/7-13/clientmessagebr…

В ней правда есть только вывод сообщение в консоли.

Это действие планировал заменить как-то так:

//                this.refreshGridData();

или

//                this.location.reload();

Делал все аналогично:

1) бп после сохранения элемента детали

2) логика с родителем ClientMessageBridge 

3) подписка на странице, где выведена деталь

Такое впечатление, что сообщение не доходит и обрывается на каком-то моменте.

Можно ли его судьбу как-то отследить?

Нравится

10 комментариев
Лучший ответ

На самом деле проблема в том что конфигурационный параметр команды в этом обсуждении указан неверно: realoadAll. Должно быть reloadAll. Случайно обнаружил.

this.updateDetail({detail: "UsrMyDetail", realoadAll: true});

Алексей-Карягин,

А само сообщение, которое должно стать инициатором обновления, можно ли как-то отследить?

Я его по аналогии с примером описал (и источник, и приёмник)

Смотря на каком этапе пропадает. Можно рядом с обновлением детали оставить window.console.info из примера, чтобы видеть, дошло до клиента или нет. Сетевую активность между сервером и браузером можно мониторить в Fiddler, запущенном на том же компьютере, где браузер. Если же до отправки сообщения не доходит на стороне БП на сервере, их тоже можно мониторить.

Зверев Александр,

БП по сути только инициирует - там-то проблем быть не должно.

Дальше есть 2 куска логики (клиент и

ClientMessageBridge). Вот у клиента этой логики нет.

Вот для этого и нужно смотреть вышеупомянутыми или другими способами, на каком этапе ещё нормально отработало, а на каком — уже нет.

Добрый день! В моем случае в результате выполнения команды this.updateDetail({detail: "UsrMyDetailName", realoadAll: true}); в детали отображаются все записи из таблицы (как будто слетает фильтр по колонке Id объекта). В чем может быть причина?

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

На самом деле проблема в том что конфигурационный параметр команды в этом обсуждении указан неверно: realoadAll. Должно быть reloadAll. Случайно обнаружил.

коллеги в итоге как удалось решить задачу? не могу обновить деталь после выполнения БП.

БП выполняется на сервере, а деталь находится в браузере пользователя. Следовательно, нужно посылать туда сообщение по ClientMessageBridge, ссылка в самом верху.

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

Если не использую фильтр, то все работает, но без фильтрации

Если использую, то null на выходе

В чем может быть причина?

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

        rootSchemaName: "GeneralForm"

    });

    

    esq.addColumn("Id");

    esq.addColumn("UsrCode");

    esq.addColumn("UsrInfoId.Name");

    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(

    Terrasoft.ComparisonType.EQUAL, "UsrInfoId.Name", "Инфо"));

    

    var rowsCount = 0;

    var rowsCount1 = "";

    esq.getEntityCollection(function(result) {

        if (result.success) {

            

            

            result.collection.each(function (item) {

                rowsCount = rowsCount + 1;

                rowsCount1 += item.get("UsrCode") + "#" + item.get("UsrInfoId.Name") + 

                    "(" + rowsCount + ")" + "\n";

            });

            this.set("UsrCount", rowsCount1);

        }

    }, this);

Нравится

12 комментариев
Лучший ответ

Посмотрите профилировщиком какой sql запрос отправляется в БД, это поможет определить проблему

Посмотрите профилировщиком какой sql запрос отправляется в БД, это поможет определить проблему

Ошибка в том, что Вы неправильно построили связи - нужно писать UsrInfo.Name, а у Вас UsrInfoId.Name.

Вот корректный код:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

        rootSchemaName: "GeneralForm"

    });

    

    esq.addColumn("Id");

    esq.addColumn("UsrCode");

    esq.addColumn("UsrInfo.Name");

    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(

    Terrasoft.ComparisonType.EQUAL, "UsrInfo.Name", "Инфо"));

    

    var rowsCount = 0;

    var rowsCount1 = "";

    esq.getEntityCollection(function(result) {

        if (result.success) {

            

            

            result.collection.each(function (item) {

                rowsCount = rowsCount + 1;

                rowsCount1 += item.get("UsrCode") + "#" + item.get("UsrInfo.Name") + 

                    "(" + rowsCount + ")" + "\n";

            });

            this.set("UsrCount", rowsCount1);

        }

    }, this);

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

Алла Савельева,

пытаюсь реализовать запрос:



select 

    q1.UsrCode

    , q2.Name

from 

    GeneralForm q1 

    join UsrInfoList q2 

on 

    q1.UsrInfoId = q2.Id

При моей текущей реализации этот кусок работает:

esq.addColumn("UsrInfoId.Name");

Проблема с фильтром. 

Григорий Чех,

Ок. Разбираюсь с тем как его использовать.

Григорий Чех,

а как корректно этот механизм объявить в коде?

добавил:

//перед esq

var performanceManagerLabel = "";

performanceManager.start(performanceManagerLabel + "_Init");

//сразу после фильтрации

performanceManager.stop(performanceManagerLabel + "_Init");

пишет:

'performanceManager' is not defined

 

Григорий Чех,

Нашел. 

performanceManager указать надо было.

Григорий Чех,

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

Алла Савельева,

Верно понимаю, что для такого запроса реализация ниже верна?

На практике без фильтра логика выдает правильное число строк, а с фильтром null.

select 

    q1.Id

    q1.UsrCode

    , q2.Name

from 

    GeneralForm q1 

    join UsrInfoList q2 

on 

    q1.UsrInfoId = q2.Id



var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

    rootSchemaName: "GeneralForm"

esq.addColumn("Id");

esq.addColumn("UsrCode");

esq.addColumn("UsrInfoId.Name");

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(

Terrasoft.ComparisonType.EQUAL, "UsrInfoId.Name", "Инфо"));

Посмотрите в профайлере, что за SQL-запрос идёт в базу при выполнении последнего кода и потом запустите в Management Studio  его отдельно, чтобы выяснить, почему у него пустой результат.

Зверев Александр,

система в yазвании таблицы, которую пробую подцепить добавляет в начале и конце названия еще символы

SysUsrInfoListLcz. А нужна таблица была UsrInfoList. Это фича такая?

Хотя нет. Не в ней дело. Тут все хорошо.

SysUsrInfoListLcz — это автоматически сгенерированная таблица переводов названий для UsrInfoList.

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

В академии есть ряд разделов по данной теме. Например, ссылка:

https://academy.terrasoft.ua/documents/technic-sdk/7-13/clientmessagebr…

Если прошел последовательно по пунктам, но механизм не отработал как ожидалось, то где можно концы искать?

Нравится

1 комментарий
Лучший ответ

Выполните отладку клиентского кода. Как это сделать смотрите в статье на Академии.

Выполните отладку клиентского кода. Как это сделать смотрите в статье на Академии.

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

Добрый день!

Пробую реализовывать запрос к данных через ESQ таким образом:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "UsrTbl1"

                });

                esq.addColumn("Id");

                esq.addColumn("UsrPar1");esq.addColumn("UsrInfoId");

                esq.addColumn("UsrValueList.Name");//вот с такими строками уже начинается проблема

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrValueList.Name", "значение1"));//и с такими фильтрами

 

Если нужно получить значение колонок с таблицы - rootSchemaName, то не вопрос.

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

GUID  видимо со String плохо понимают друг друга. Если ли примеры их нормального совместного использования в рамках ESQ?

Можно ли как-то понять причины неработоспособности прямых ссылок? Или хотя бы понять как с GUID быть? Даже если я значение GUID пытаюсь вставлять так, то не работает:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfoId", "337ED96B-B658-48B0-BBB6-7FACF918C735"));

Нравится

2 комментария
Лучший ответ

Eсли нужно получить справочную колонку, то её название нужно указывать без приставки "Id", как в схеме таблицы:

esq.addColumn("UsrInfo")

Аналогично и с фильтрами:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfo", "337ED96B-B658-48B0-BBB6-7FACF918C735"));

Но обратите внимание, что, если у Вас фильтр построен по обратным связям, то можно писать 2 способами.

1. Через Id и тогда в качестве значения фильтра указываем Id:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(

                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment.Id", shipment.value));

2. Через справочное поле и тогда в качестве значения указывать значение справочного поля:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(

                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment", shipment));

А вообще, чтобы понять причину ошибки нужно отладиться на стороне клиента, если запрос уходит в базу данных, то посмотреть в SQL profiler, какой запрос идет в базу и какой результат работы этого запроса.

 

В js все Guid преобразуйте к нижнему регистру

те в вашем случае напишите что то типа esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfoId", "337ed.....

Eсли нужно получить справочную колонку, то её название нужно указывать без приставки "Id", как в схеме таблицы:

esq.addColumn("UsrInfo")

Аналогично и с фильтрами:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfo", "337ED96B-B658-48B0-BBB6-7FACF918C735"));

Но обратите внимание, что, если у Вас фильтр построен по обратным связям, то можно писать 2 способами.

1. Через Id и тогда в качестве значения фильтра указываем Id:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(

                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment.Id", shipment.value));

2. Через справочное поле и тогда в качестве значения указывать значение справочного поля:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(

                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment", shipment));

А вообще, чтобы понять причину ошибки нужно отладиться на стороне клиента, если запрос уходит в базу данных, то посмотреть в SQL profiler, какой запрос идет в базу и какой результат работы этого запроса.

 

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

Добрый день. Версия 7.12.

Подскажите, в чём может быть причина возникновения такой ошибки при загрузке деталей:

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

Возникает при открытии вкладки с деталями, страница на этом перестаёт грузиться и зависает.

Нравится

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

Уточните, после каких изменений начала возникать описанная проблема?

Стандартно таких деталей нет. Если их схемы ставили из пакета, что-то могли развернуть неверно или не полностью.

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

В нативном пакете FinAppLanding есть процесс "Синхронизация анкетных данных с данными физ. лица " который падает на последней строке :

appFormToContactHelper.SynchronizeContactByAppForm(appFormId);

вызывая ошибку "Недостаточно прав для изменения записи в объекте" , конкретно :

System.Security.SecurityException: Недостаточно прав для изменения записи в объекте "Contact" at Terrasoft.Core.Entities.Entity.UpdateInDB(Boolean validateRequired) at Terrasoft.Core.Entities.Entity.InternalSave(Boolean validateRequired, Boolean setColumnDefValue) at Terrasoft.Core.Entities.Entity.Save(Boolean validateRequired, Boolean setColumnDefValue) at Terrasoft.Configuration.AppFormToContactHelper.AppFormToContact(Dictionary`2 columnValues, Guid appFormId) at Terrasoft.Configuration.AppFormToContactHelper.SynchronizationContact(Guid appFormId) at Terrasoft.Configuration.AppFormToContactHelper.SynchronizeContactByAppForm(Guid appFormId) at Terrasoft.Core.Process.AppFormToContactSyncProcessCustom1.AppFormToContactSyncScriptTaskExecute(ProcessExecutingContext context) at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context) The Zone of the assembly that failed was: MyComputer

Что с ним не так и как исправить ?

Нравится

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

Значит, у пользователя, под которым запущен БП, нет прав на изменение этого физ. лица или одного из полей. Проверьте права доступа на запись в разделе физ. лиц, есть ли права на изменение у этого пользователя или какой-то из его групп.

Зверев Александр,

 это я уже догадался. Вопрос как узнать КТО ЭТОТ пользователь ?

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

Коллеги, а как настроить Lead source URL, чтобы определялся source=google при переходе с любого google.com, google.ru и других сайтов (которые, по идее не являются поддоменами)?

Нравится

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

А что туда попадает при нынешних настройках? Если в разных адресах есть одинаковая часть «google», можно написать какой-нибудь процесс, который при сохранении лида считывает и заменяет нужным значением то же или другое поле объекта. В процессе указать список слов-подстрок, по упоминанию которых определяет источник-поисковик.

Зверев Александр пишет:

А что туда попадает при нынешних настройках? Если в разных адресах есть одинаковая часть «google», можно написать какой-нибудь процесс, который при сохранении лида считывает и заменяет нужным значением то же или другое поле объекта. В процессе указать список слов-подстрок, по упоминанию которых определяет источник-поисковик.

При нынешних настройках необходимо в справочник добавлять именно полное доменное имя (как из тестов выяснилось).

Сейчас копаем код и думаем, как это исправить.



Но, возможно, всё должно решаться как-то проще. Задача-то стандартная 

Тут пишут, что Google и Yandex можно определять по “gclid” и “yclid”, но это только для рекламных ссылок.

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

Зверев Александр пишет:

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

Да, нужно добавить много разных доменных имён google.



https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2_Google



И ещё подозреваю, что он постоянно изменяется и пополняется

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

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

В процессе пытаюсь получить UserConnection :

var userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;

однако получаю ошибку :

System.NullReferenceException: Object reference not set to an instance of an object. at Terrasoft.Core.Process.AppFormToContactSyncProcessMethodsWrapper.AppFormToContactSyncScriptTaskExecute(ProcessExecutingContext context) at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

В чем может быть причина? Как исправить ?

Нравится

1 комментарий
Лучший ответ

Такое может быть, например, если метод вызван из БП, который запущен по расписанию, тогда никакой сессии не будет. В качестве решения, если это сервис - сделать UserConnection свойством класса с возможностью задать извне, и вызывать сервис как-то так.

var service = MyService();
service.UserConnection = userConnection;
service.MyMethod(param1, param2);

В самом бизнес-процессе UserConnection стоит получать как context.UserConnection или Get<UserConnection>("UserConnection"). Во встроенном процессе просто свойство UserConnection есть.

Такое может быть, например, если метод вызван из БП, который запущен по расписанию, тогда никакой сессии не будет. В качестве решения, если это сервис - сделать UserConnection свойством класса с возможностью задать извне, и вызывать сервис как-то так.

var service = MyService();
service.UserConnection = userConnection;
service.MyMethod(param1, param2);

В самом бизнес-процессе UserConnection стоит получать как context.UserConnection или Get<UserConnection>("UserConnection"). Во встроенном процессе просто свойство UserConnection есть.

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