Вопрос

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

Ответ

Пример реализации функционала для схемы AddressDetail:

1) можно добавить новый метод enableDetailControls:

this.methods.enableDetailControls = function(viewConfig, enabled) {
    if (!viewConfig.items) {
        return;
    }
    viewConfig.items.forEach(function(item) {
        item.enabled = enabled;
    }, this);
};

2) далее вызвать этот метод внутри метода getCustomItemView после полного формирования конфигурации представления, добавив необходимые условия. Например, перед строкой return viewConfig:

this.methods.getCustomItemView = function(viewModel, itemKey, action, types, itemViewModel) {
    var viewConfig = {};
    ...
    var enableControls = (action === "edit") && (/*любые другие условия*/);
    this.enableDetailControls(viewConfig, enableControls);
    return viewConfig;
};

Очень желательно до этого момента уже получить значения необходимых условий, так как после выполнения getCustomItemView управление передаётся в модуль базовой детали (DetailModule), в котором уже выполняется привязка модели к представлению и рендеринг детали.

Нравится

Поделиться

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

Вопрос

OData. Как передать параметр со значением NULL

Ответ

PUT http://e-podkovka:9848/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'40f52013-48df-4009-b492-20794e6cb313')HTTP/1.1
Accept: application/atom+xml
Content-Type: application/atom+xml;type=entry;
Host: e-podkovka:9848
Content-Length: 448
Expect: 100-continue
Connection: Keep-Alive
Cookie: BPMSESSIONID=fahxnyitfahzhiryyqwx15fx; BPMLOADER=r543kelbmnri2mqivvfb5opj; .ASPXAUTH=8511A66857D2D6371FD2E76B7FB7EF2FADBC44C2E7E7D7B802171CDE3A12BF4DEB539193184F19DEEA2C9EF01B91DB2B7057748DB8BA843A7264501446C19936C63BD84AEC1E879AAD0FF24194163974B17967E5F9775ADFBD0020EC0E7D89D9E87259680E35183507555DCBF3824C2C25A1ADB44D502FBABF6F7037BC56A35DD574C85D74C0234159ABD87FC6A5E1E280B0F9137DF527A9A66854FE943E4B65E8B9E61AA6190FAB804970BC7B85A1B695528809C35B46D491D942FAC3ECE31635D29FB60481E852FF397F52C4F8AF42E4B8D3582293761C35A32B7F2D7F518D2D1E6F48BB7C1F54BF2EFE584D8FA84C9EA0EF97FAEAD656FCD2C0D48B81884A61EA26D21CC5ED5D96938370BC10B6CE6AEE62867690600013591F1A8D85C9C05CCC0660D6FE2254C7690FC7D4FD6CFF096DD56E98A0C42515BD19B37A25806BD619581FB6F966D30EB4E19EE03AA2D9883F2230C0221E9C3A61743F747F2307E2B5AE25; UserName=83|117|112|101|114|118|105|115|111|114
 
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
<content type="application/xml">
<properties
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<d:Name>New name4</d:Name>
<d:JobId m:null="true" />
</properties>
</content>
</entry>

 

Нравится

Поделиться

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

Вопрос

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

Ответ

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

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 комментариев
Показать все комментарии