Вопрос

Как установить значение для активной записи из модуля раздела в режиме редактирования (вертикальный реестр)

Ответ

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

var activeRow = this.getActiveRow();
activeRow.set("YourColumnName", columnValue);
activeRow.saveEntity();

Для работы этого кода необходимо, чтобы в коллекции activeRow.columns была колонка с названием YourColumnName и типом Terrasoft.ViewModelColumnType.ENTITY_COLUMN (данная константа равняется 0).

Также обновление значения можно выполнить через запрос примерно так:

var updateQuery = this.Ext.create("Terrasoft.UpdateQuery"{
        rootSchemaName: "EntitySchemaName"
});
var filters = updateQuery.filters;
filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
        this.Terrasoft.ComparisonType.EQUAL"Id", currentRecordId));
updateQuery.setParameterValue("YourColumnName", columnValue);
updateQuery.execute(callbackFunction, this);

 

Нравится

Поделиться

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

Вопрос

Как открыть MainHeaderExtensions в консоли для дебага? 

Ответ

Если версия 7.5 и выше, то для отладки схемы «MainHeaderExtensions» необходимо в консоли браузера (Ctrl+O) открыть схему «ConfigurationBootstrap»  (представляет из-за себя комплекс схем, которые минимально используются в приложении).

Если версия до 7.5, то открыть нужно схему в консоли «MainHeaderExtensions».

Нравится

Поделиться

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

Вопрос

Метод getEntity класса EntitySchemaQuery работает асинхронно. Можно ли сделать так, чтобы метод getEntity работал синхронно?

Ответ

Метод getEntity клиентской EntitySchemaQuery рассчитан только на асинхронное использование. Тем не менее, можно имитировать синхронное поведение с помощью Terrasoft.chain.

Выглядит это так:

getMyEntity: function(callback) {
    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: schemaName
    });
    ...
    esq.getEntity(recordId, function(response) {
        ...
        if (callback) {
            callback.call(this);
        }
    }, this)
},
globalMethod: function() {
    Terrasoft.chain(
        function(next) {
            this.getMyEntity(function() {
                next();
            });
        },
        function() {
            this.doAfterGettingEntity();
        },
        this
    );
}

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

Terrasoft.chain может содержать сколько угодно аргументов. Важно не забывать указывать в аргументах next, чтобы цепочка не прервалась раньше времени. Последним аргументом передается контекст выполнения.

Нравится

Поделиться

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

Вопрос

Я создал деталь [Документы водителя], схема UsrSchema6Detail, в разделе [Контакты]. Мне необходимо показывать ее если выбрана должность [Водитель]. Если должность не выбрана или выбрана другая, то деталь скрыта.

Я добавил бизнес правило в схему контакты, оно не работает.

rules: {
   "UsrSchema6Detail": {
      BindParametrVisibilePlaceByType: {
         // Тип правила BINDPARAMETER.
         ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
         // Правило регулирует свойство VISIBLE поля.
         property: BusinessRuleModule.enums.Property.VISIBLE,
         conditions: [{
            // Выражение левой части условия.
            leftExpression: {
               //Тип выражения ATTRIBUTE указывает на то, что в качестве выражения выступает
               // аттрибут (колонка) модели представления.
               type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
               // Название колонки модели представления, значение которой сравнивается в выражении.
               attribute: "Job"
            },
            // Тип операции сравнения.
            comparisonType: Terrasoft.ComparisonType.EQUAL,
            // Выражение правой части условия.
            rightExpression: {
               type: BusinessRuleModule.enums.ValueType.CONSTANT,
               value: "703e34d6-4113-43b5-84dc-2e1f8635c6d4"
            }
         }]
      }
   }
}

Если я применяю это же правило к колонке [Департамент], то оно работает так как надо. 

Ответ

Для решения Вашей бизнес задачи использование бизнес правил не подходит.

Вот пример кода для скрытия детали [Средства связи] на карточке редактирования [Контрагента].

Создаете замещающий модуль AccountPagev2, в секции diff добавляете следующий код:

{
    "operation": "merge",
    "name": "Communications",
    "values": {
        "visible" : {
            "bindTo": "communicationsVisibility"
        }
    }
}

Объявляете метод отвечающий за видимость детали в секции methods:

communicationsVisibility: function(){
    var type = this.get("Type");
    return !!type && type.displayValue === "Наша компания";
}

В результате деталь будет видима только в случае, если “Тип” указан как “Наша компания”. По аналогии можно скрывать любую деталь.

Нравится

Поделиться

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

Симптомы

Баг-репорт:

Type: Terrasoft.SourceCodeException

Message: TypeError: undefined is not an object (evaluating 'ruleConfig.rule')

Причина

BusinesRuleManager в карточке редактирования выполняет правила паралельно 

Решение

1.В конфигурации добавить кастомную схему с типом «Исходный код», например, с названием «UsrMobileUtilities»;

2.В схеме вставить код:

Ext.define("Terrasoft.BusinessRulesManager.Override", {
    override: "Terrasoft.BusinessRulesManager",
    /**
    * @private
    */
    doExecuteRules: function(config) {
        this.executionConfig = config;
        this.allRulesAreValid = true;
        this.executeRulesForNextRecord();
    },
    executeRules: function(config) {
        if (this.rulesToExecute > this.rulesExecuted) {
            this.waitRulesInProgressId = setInterval(function() {
                if (this.rulesToExecute === this.rulesExecuted) {
                    clearInterval(this.waitRulesInProgressId);
                    this.doExecuteRules(config);
                }
            }.bind(this), 500);
        } else {
            this.doExecuteRules(config);
        }
    }
});

3. Сохраняете изменения;

4. Данную схему подключить в манифесте мобильного приложения (например, «MobileApplicationManifestDefaultWorkplace») в секции «CustomSchemas»:

"CustomSchemas": [
    "UsrMobileUtilities"
]

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

5. Сохранить изменения.

 

Второй способ решения: заполнить справочники Города, Регионы и Страны (с заполнением связывающих полей).

Нравится

Поделиться

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

Вопрос

какие возможности представляет API камеры в мобильном приложении? (mobile 5.4)

Ответ

В BPMonlineMobile 5.4 используется версия PhoneGap 2.8

О ее возможностях работы с камерой можно почитать тут: http://cordova.apache.org/docs/en/2.8.0/cordova_camera_camera.md.html#Camera

Нравится

Поделиться

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

Вопрос

Как получить ссылку на картинку добавленную в модуле в секцию Images.

Ответ

Для получения ссылки на картинку добавленную в модуле, необходимо:

1. Добавить зависимость для библиотеки Terrasoft в define;

2. Получить конфиг картинки:

var imageConfig = resources.localizableImages.ImageListSchemaItem1;

Имя картинки будет отличаться.

3. Преобразовать конфиг в ссылку:

var link = Terrasoft.ImageUrlBuilder.getUrl(imageConfig);

 

Нравится

Поделиться

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

Вопрос

Невозможно использовать поиск по продажам, если неизвестно в каком регистре введено название продажи.

Ответ

В базовой версии фильтры по текстовым полям не зависят от регистра. Попробуйте при поиске также добавить «%» перед значением, которое Вы указываете в поле поиска – возможно, название продажи немного от него отличается.

 

Нравится

Поделиться

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

1. В объект добавляем строку неограниченной длины (обязательно!). Например, "UsrNotes"

2. В мастере выводим эту строку на нужное нам место. Например, во вкладке "Файлы и примечания" под деталью "Файлы и ссылки" создаем группу полей "Примечания" и добавляем в нее наше поле "UsrNotes"

3. В конфигурации находим код страницы редактирования данного объекта (название с Page в конце) и в коде ищем нужный нам контейнер с нашим полем. Меняем код его представления. Он должен выглядеть примерно так:

{
    "operation": "insert",
    "parentName": "UsrTestSectionPage3Tab", //у вас будет что-то другое
    "propertyName": "items",
    "name": "UsrNotes", //заменяем значение на название вашего поля
    "values": { // полностью заменяем все что в "values" от скобки до скобки
        contentType: Terrasoft.ContentType.RICH_TEXT, //основной атрибут, который нам нужно добавить
        "layout": {column: 0, row: 0, colSpan: 24},
        "labelConfig": {
            "visible": false
        },
        "controlConfig": {  //здесь и ниже код для того, чтобы в примечания можно было добавлять картинки
            "imageLoaded": {
                "bindTo": "insertImagesToNotes"
            },
            "images": {
                "bindTo": "NotesImagesCollection"
            }
        }
    }
}

 

Нравится

Поделиться

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

Вопрос

Необходимо вывести дашборды на плазму, но все они не помещаются. Как добавить автоматическую прокрутку страницы?

Ответ

Можно создать свой «виджет» в котором описать всю необходимую логику на языке javascript. Инициировать ее в методе init() виджета. Потом добавить его на страницу виджетов.

Для этого необходимо:

1) В конфигурации  создать модуль (не указывать родительский) - например UsrDashboardHelper.

2) Сохранить модуль и перезагрузить приложение.

3) Выбрать виджет в режиме редактирования отчетности.

Пример простого виджета, который каждые 5 секунд автоматически прокручивает страницу отчетов вверх и вниз:

define("UsrDashboardHelper", ["ext-base", "terrasoft", "sandbox"], function(Ext, Terrasoft, sandbox) {
  var getView = function() {
    var config = {
      id: "UsrDashboardHelper",
      selectors: {
        wrapEl: "#UsrDashboardHelper"
      },
      items: []
    };
    return Ext.create("Terrasoft.Container", config);
  };
  return {
    timerId: 0,
    flag: 0,
    myTimer: function() {
      console.log("tik.");
      if (this.flag === 0) {
       window.scrollTo(0,800);
       this.flag = 1;
      } else {
       window.scrollTo(0,0);
       this.flag = 0;
      }
    },
    init: function() {
      console.log("UsrDashboardHelper init in: " + sandbox.id);
      this.timerId = setInterval(this.myTimer, 5000);
    },
    render: function(renderTo) {
      var view = getView();
      view.render(renderTo);
    },
    destroy: function() {
      console.log("UsrDashboardHelper is offline.");
      clearInterval(this.timerId);
    }
  };
});

 

Нравится

Поделиться

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