Представляем новое дополнение для Creatio – Viber for Creatio Service. Дополнение позволит вашим клиентам оставлять запросы на портале Creatio не используя Creatio. Создавать новые обращения, контролировать существующие и общаться с поддержкой прямо из Viber! С помощью уведомлений в телефоне клиенты смогут быстро реагировать, отвечать и дополнять обращения. Удобная синхронизация позволит просматривать обращения с любого поддерживающего Viber устройства Детальная информация на станице продукта Viber for Creatio Service.

Доступен тестовый 14-дневный период!

Переходите по ссылке в маркетплейс Creatio, тестируйте и наслаждайтесь удобным сервисом для Creatio!

Нравится

Поделиться

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

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

 

Подскажите, пожалуйста, возможно ли с помощью плагина "Расчет рабочих дней в бизнес-процессах" (https://marketplace.terrasoft.ru/template/raschet-rabochih-dney-v-bizne…;реализовать сценарий расчета количества рабочих дней от "Начальной даты" в обратную сторону?

Пример сценария: за 2 рабочих дня до даты необходимо отправить уведомление-напоминание. В блоке БП заполнил начальную дату и [Количество дней] = "-2". В результате в журнале процессов зафиксирована ошибка:

System.ArgumentException: Недопустимые входные параметры

   в Terrasoft.Core.Process.Configuration.GlbAddBusinessDays.InternalExecute(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessActivity.ExecuteElement(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessActivity.ExecuteItem(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

 

Заранее спасибо!

Нравится

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

Добрый день

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

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

 

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

 

Алексей Следь,

 

можете уточнить кейсы неправильного определения дней недели? Передам информацию ответственной команде. 

Лазоренко Ирина,

если календаре пятидневная неделя, то делаем +1 рабочий день от пятницы. Попадаем на субботу, а не понедельник. Насколько помню вы там используете класс в классе CalendarUtils и метод GetDayOfWeekNumber. Вот он и возвращает не корректно номер дня недели: от 1 до 7, где 1 =Пн. Далее идет сравнение с БД, где хранится дни недели от 1 до 7, где 1=Вс. 

В свое время я написал аналог этих функций с расширением функционала. В итоге не так давно решил этот вопрос. А техподдержка ответила, что CalendarUtils - это кусок старого расчета сроков, который более не поддерживается.

 

А сделать отрицательный расчет срок очень интересная идея. Сделаю у себя как найдется время)

Алексей, добрый день!

 

спасибо за описание кейса. Направила ответственной команде на рассмотрение.

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

Описание примера:

Нужно настроить редактируемый реестр в разделе. Это позволит быстро редактировать записи раздела (как в деталях с редактируемым реестром).

Алгоритм реализации:

1. Создайте замещающую модель представления для вашего раздела, например, ContactSectionV2.

2. Добавьте следующие зависимости в массив зависимостей: 

define("ActivitySectionV2", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
    function() {

3. Добавьте ConfigurationGridUtilites в блок "mixins":

mixins: {
    ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
},

4. Добавьте виртуальную колонку с типом boolean в блок "attributes":

attributes: {
    IsEditable: {
        dataValueType: Terrasoft.DataValueType.BOOLEAN,
        type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
        value: true
    }
},

5. Переопределите базовые методы схемы:

edit: function() {
    var procElId = this.getActiveRow().get("ProcessElementId");
    var recordId = this.get("ActiveRow");
    if (procElId && !this.Terrasoft.isEmptyGUID(procElId)) {
        this.sandbox.publish("ProcessExecDataChanged", {
            procElUId: procElId,
            recordId: recordId,
            scope: this,
            parentMethodArguments: null,
            parentMethod: function() {
                return false;
            }
        });
        return true;
    }
    this.editRecord(recordId);
},
editRecord: function(primaryColumnValue) {
    this.Terrasoft.chain(
        function(next) {
            var activeRow = this.findActiveRow();
            this.saveRowChanges(activeRow, next);
        },
        function() {
            var activeRow = this.getActiveRow();
            var typeColumnValue = this.getTypeColumnValue(activeRow);
            var schemaName = this.getEditPageSchemaName(typeColumnValue);
 
            var config = {
                schemaName: schemaName,
                id: primaryColumnValue,
                operation: Terrasoft.ConfigurationEnums.CardOperation.EDIT,
                moduleId: this.getChainCardModuleSandboxId(typeColumnValue)
            };
 
            this.sandbox.publish("PushHistoryState", {
                hash: Ext.String.format("{0}/{1}/{2}/{3}",
                    "CardModuleV2", schemaName, Terrasoft.ConfigurationEnums.CardOperation.EDIT, primaryColumnValue),
                silent: true
            });
            this.openCardInChain(config);
        }, this);
},
addRecord: function(typeColumnValue) {
    if (!typeColumnValue) {
        if (this.get("EditPages").getCount() > 1) {
            return false;
        }
        var tag = this.get("AddRecordButtonTag");
        typeColumnValue = tag || this.Terrasoft.GUID_EMPTY;
    }
    this.addRow(typeColumnValue);
},
copyRecord: function(primaryColumnValue) {
    this.copyRow(primaryColumnValue);
},
getGridRowViewModelConfig: function() {
    var gridRowViewModelConfig =
        this.mixins.GridUtilities.getGridRowViewModelConfig.apply(this, arguments);
    Ext.apply(gridRowViewModelConfig, {entitySchema: this.entitySchema});
    var editPages = this.get("EditPages");
    this.Ext.apply(gridRowViewModelConfig.values, {HasEditPages: editPages && !editPages.isEmpty()});
    return gridRowViewModelConfig;
},
getGridRowViewModelClassName: function() {
    return this.mixins.GridUtilities.getGridRowViewModelClassName.apply(this, arguments);
},
onRender: function() {
    this.callParent(arguments);
    if (!this.get("Restored")) {
        this.reloadGridColumnsConfig(true);
    }
},
getDefaultGridColumns: function() {
    var systemColumns = this.systemColumns;
    var allowedDataValueTypes = this.get("AllowedDataValueTypes");
    var entitySchema = this.entitySchema;
    var entitySchemaColumns = [];
    Terrasoft.each(entitySchema.columns, function(column, columnName) {
        if (Ext.Array.contains(systemColumns, columnName) ||
            !Ext.Array.contains(allowedDataValueTypes, column.dataValueType)) {
            return;
        }
        entitySchemaColumns.push(column);
    }, this);
    var primaryDisplayColumnName = entitySchema.primaryDisplayColumnName;
    entitySchemaColumns.sort(function(a, b) {
        if (a.name === primaryDisplayColumnName) {
            return -1;
        }
        if (b.name === primaryDisplayColumnName) {
            return 1;
        }
        return 0;
    }, this);
    return (entitySchemaColumns.length > 4) ? entitySchemaColumns.slice(0, 4) : entitySchemaColumns;
},
onActiveRowAction: function() {
    this.mixins.ConfigurationGridUtilities.onActiveRowAction.apply(this, arguments);
    this.callParent(arguments);
},
onActiveRowAction: function(buttonTag, primaryColumnValue) {
    switch (buttonTag) {
        case "card":
            this.edit();
            break;
        case "copy":
            this.copyRecord(primaryColumnValue);
            break;
        case "remove":
            this.deleteRecords();
            break;
        case "cancel":
            this.discardChanges(primaryColumnValue);
            break;
        case "save":
            this.onActiveRowSave(primaryColumnValue);
            break;
    }
}

6. Добавьте следующие элементы в массив "diff":

{
    "operation": "merge",
    "name": "DataGrid",
    "values": {
        "className": "Terrasoft.ConfigurationGrid",
        "generator": "ConfigurationGridGenerator.generatePartial",
        "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
        "changeRow": {"bindTo": "changeRow"},
        "unSelectRow": {"bindTo": "unSelectRow"},
        "onGridClick": {"bindTo": "onGridClick"},
        "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
        "activeRowAction": {"bindTo": "onActiveRowAction"},
        "multiSelect": {"bindTo": "MultiSelect"}
    }
},
{
    "operation": "insert",
    "name": "activeRowActionSave",
    "parentName": "DataGrid",
    "propertyName": "activeRowActions",
    "values": {
        "className": "Terrasoft.Button",
        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
        "tag": "save",
        "markerValue": "save",
        "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
    }
},
{
    "operation": "insert",
    "name": "activeRowActionCopy",
    "parentName": "DataGrid",
    "propertyName": "activeRowActions",
    "values": {
        "className": "Terrasoft.Button",
        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
        "tag": "copy",
        "markerValue": "copy",
        "imageConfig": {"bindTo": "Resources.Images.CopyIcon"}
    }
},
{
    "operation": "insert",
    "name": "activeRowActionCard",
    "parentName": "DataGrid",
    "propertyName": "activeRowActions",
    "values": {
        "className": "Terrasoft.Button",
        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
        "tag": "card",
        "markerValue": "card",
        "visible": {"bindTo": "HasEditPages"},
        "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
    }
},
{
    "operation": "insert",
    "name": "activeRowActionCancel",
    "parentName": "DataGrid",
    "propertyName": "activeRowActions",
    "values": {
        "className": "Terrasoft.Button",
        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
        "tag": "cancel",
        "markerValue": "cancel",
        "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
    }
},
{
    "operation": "insert",
    "name": "activeRowActionRemove",
    "parentName": "DataGrid",
    "propertyName": "activeRowActions",
    "values": {
        "className": "Terrasoft.Button",
        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
        "tag": "remove",
        "markerValue": "remove",
        "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
    }
},
{
    "operation": "remove",
    "name": "DataGridActiveRowOpenAction"
},
{
    "operation": "remove",
    "name": "DataGridActiveRowCopyAction"
},
{
    "operation": "remove",
    "name": "DataGridActiveRowDeleteAction"
},
{
    "operation": "remove",
    "name": "ProcessEntryPointGridRowButton"
}

Полный исходный код схемы:

define("ContactSectionV2", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
    function() {
        return {
            entitySchemaName: "Contact",
            messages: {},
            mixins: {
                ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
            },
            attributes: {
                IsEditable: {
                    dataValueType: Terrasoft.DataValueType.BOOLEAN,
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    value: true
                }
            },
            methods: {
                edit: function() {
                    var procElId = this.getActiveRow().get("ProcessElementId");
                    var recordId = this.get("ActiveRow");
                    if (procElId && !this.Terrasoft.isEmptyGUID(procElId)) {
                        this.sandbox.publish("ProcessExecDataChanged", {
                            procElUId: procElId,
                            recordId: recordId,
                            scope: this,
                            parentMethodArguments: null,
                            parentMethod: function() {
                                return false;
                            }
                        });
                        return true;
                    }
                    this.editRecord(recordId);
                },
                editRecord: function(primaryColumnValue) {
                    this.Terrasoft.chain(
                        function(next) {
                            var activeRow = this.findActiveRow();
                            this.saveRowChanges(activeRow, next);
                        },
                        function() {
                            var activeRow = this.getActiveRow();
                            var typeColumnValue = this.getTypeColumnValue(activeRow);
                            var schemaName = this.getEditPageSchemaName(typeColumnValue);
 
                            var config = {
                                schemaName: schemaName,
                                id: primaryColumnValue,
                                operation: Terrasoft.ConfigurationEnums.CardOperation.EDIT,
                                moduleId: this.getChainCardModuleSandboxId(typeColumnValue)
                            };
 
                            this.sandbox.publish("PushHistoryState", {
                                hash: Ext.String.format("{0}/{1}/{2}/{3}",
                                    "CardModuleV2", schemaName, Terrasoft.ConfigurationEnums.CardOperation.EDIT, primaryColumnValue),
                                silent: true
                            });
                        this.openCardInChain(config);
                    }, this);
                },
                addRecord: function(typeColumnValue) {
                    if (!typeColumnValue) {
                        if (this.get("EditPages").getCount() > 1) {
                            return false;
                        }
                        var tag = this.get("AddRecordButtonTag");
                        typeColumnValue = tag || this.Terrasoft.GUID_EMPTY;
                    }
                    this.addRow(typeColumnValue);
                },
                copyRecord: function(primaryColumnValue) {
                    this.copyRow(primaryColumnValue);
                },
                getGridRowViewModelConfig: function() {
                    var gridRowViewModelConfig =
                        this.mixins.GridUtilities.getGridRowViewModelConfig.apply(this, arguments);
                    Ext.apply(gridRowViewModelConfig, {entitySchema: this.entitySchema});
                    var editPages = this.get("EditPages");
                    this.Ext.apply(gridRowViewModelConfig.values, {HasEditPages: editPages && !editPages.isEmpty()});
                    return gridRowViewModelConfig;
                },
                getGridRowViewModelClassName: function() {
                    return this.mixins.GridUtilities.getGridRowViewModelClassName.apply(this, arguments);
                },
                onRender: function() {
                    this.callParent(arguments);
                    if (!this.get("Restored")) {
                        this.reloadGridColumnsConfig(true);
                    }
                },
                getDefaultGridColumns: function() {
                    var systemColumns = this.systemColumns;
                    var allowedDataValueTypes = this.get("AllowedDataValueTypes");
                    var entitySchema = this.entitySchema;
                    var entitySchemaColumns = [];
                    Terrasoft.each(entitySchema.columns, function(column, columnName) {
                        if (Ext.Array.contains(systemColumns, columnName) ||
                            !Ext.Array.contains(allowedDataValueTypes, column.dataValueType)) {
                            return;
                        }
                        entitySchemaColumns.push(column);
                    }, this);
                    var primaryDisplayColumnName = entitySchema.primaryDisplayColumnName;
                    entitySchemaColumns.sort(function(a, b) {
                        if (a.name === primaryDisplayColumnName) {
                            return -1;
                        }
                        if (b.name === primaryDisplayColumnName) {
                            return 1;
                        }
                        return 0;
                    }, this);
                    return (entitySchemaColumns.length > 4) ? entitySchemaColumns.slice(0, 4) : entitySchemaColumns;
                },
                onActiveRowAction: function() {
                    this.mixins.ConfigurationGridUtilities.onActiveRowAction.apply(this, arguments);
                    this.callParent(arguments);
                },
                onActiveRowAction: function(buttonTag, primaryColumnValue) {
                    switch (buttonTag) {
                        case "card":
                            this.edit();
                            break;
                        case "copy":
                            this.copyRecord(primaryColumnValue);
                            break;
                        case "remove":
                            this.deleteRecords();
                            break;
                        case "cancel":
                            this.discardChanges(primaryColumnValue);
                            break;
                        case "save":
                            this.onActiveRowSave(primaryColumnValue);
                            break;
                    }
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "DataGrid",
                    "values": {
                        "className": "Terrasoft.ConfigurationGrid",
                        "generator": "ConfigurationGridGenerator.generatePartial",
                        "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
                        "changeRow": {"bindTo": "changeRow"},
                        "unSelectRow": {"bindTo": "unSelectRow"},
                        "onGridClick": {"bindTo": "onGridClick"},
                        "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
                        "activeRowAction": {"bindTo": "onActiveRowAction"},
                        "multiSelect": {"bindTo": "MultiSelect"}
                    }
                },
                {
                    "operation": "insert",
                    "name": "activeRowActionSave",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "save",
                        "markerValue": "save",
                        "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                    }
                },
                {
                    "operation": "insert",
                    "name": "activeRowActionCopy",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "copy",
                        "markerValue": "copy",
                        "imageConfig": {"bindTo": "Resources.Images.CopyIcon"}
                    }
                },
                {
                    "operation": "insert",
                    "name": "activeRowActionCard",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "card",
                        "markerValue": "card",
                        "visible": {"bindTo": "HasEditPages"},
                        "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
                    }
                },
                {
                    "operation": "insert",
                    "name": "activeRowActionCancel",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "cancel",
                        "markerValue": "cancel",
                        "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                    }
                },
                {
                    "operation": "insert",
                    "name": "activeRowActionRemove",
                    "parentName": "DataGrid",
                    "propertyName": "activeRowActions",
                    "values": {
                        "className": "Terrasoft.Button",
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                        "tag": "remove",
                        "markerValue": "remove",
                        "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                    }
                },
                {
                    "operation": "remove",
                    "name": "DataGridActiveRowOpenAction"
                },
                {
                    "operation": "remove",
                    "name": "DataGridActiveRowCopyAction"
                },
                {
                    "operation": "remove",
                    "name": "DataGridActiveRowDeleteAction"
                },
                {
                    "operation": "remove",
                    "name": "ProcessEntryPointGridRowButton"
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

ВАЖНО! 

Если вы хотите реализовать редактируемый реестр для раздела Активности, вам следует закомментировать "activeRowActionCopy" в массиве "diff". Функциональности копирования не работает в разделе Активности. 

Если вы хотите реализовать редактируемый реестр в разделе Лиды, вам следует добавить следующий исходный код в  свойство values элемента DataGrid в массиве diff:

"applyControlConfig": Terrasoft.EmptyFn

 

Нравится

Поделиться

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

поправьте п.2 Не 

define("ActivitySectionV2", а 
define("ContactSectionV2", 
Показать все комментарии

Установила приложение

https://marketplace.terrasoft.ru/template/raschet-rabochih-dney-v-biznes-processah 

 

не работает 

нет Действие процесса 'Добавить рабочие дни'

нет Действие процесса 'Получить количество рабочих дней'

 

как настроить данное приложение? 

Нравится

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

Добрый день!

Уточните, пожалуйста, продукт и версию Creatio, а также в каком пакете выполняете настройку бизнес-процесса - в пакете Custom или в своем пользовательском пакете?

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

Вопрос

1) пользователи не имеют доступа на операцию

2) все справочники унаследованы от объекта "Базовый справочник"

3) при вводе текста в справочное поле пользователи видят контрол быстрого создания записей (см скрин), хотя фактически не имеют прав на редактирование справочников (читай на создание записей в справочниках)

4) по нашему представлению и, главное, по представлению клиента, пользователи НЕ должны видеть контрол быстрого создания записей, когда у них нет доступа на эту операцию

Вопрос: 1) как сделать так, чтобы пользователи видели контрол быстрого создания записей в справочном поле для справочников только тогда, когда имеют доступ на операцию CanManageLookups?

У пользователей, не имеющих прав на редактирование справочников (CanManageLookups) при вводе текста в справочное поле появляется строка быстрого создания записи, не смотря на то, что они не фактически не могут это сделать

Ответ

Данная настройка только ограничивает доступ к разделу «Справочники» (https://academy.terrasoft.ru/documents/sales-commerce/7-9/razdel-spravochniki#HT_lookups) и к справочникам, которые наследуются от объекта «Базовый справочник» (в объекте происходит проверка на данную операцию, см. «Файлы»).

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

Если ограничить права на данную операцию, то в результате отобразиться сообщение - Текущий пользователь не имеет прав на запуск администрируемой операции с кодом "CanManageLookups".

Если справочник наследуются от объекта «Базовый объект», то права распределяются на уровне объекте, т.е. если у пользователя есть доступ к разделу, то он может создавать новые значение. Если необходимо ограничить права, то это необходимо осуществлять через «Права доступа на объекты».

Если Вам необходимо, то как вариант на странице редактирования (например, для «AccountPageV2») добавить метод:

getPreventQuickAddSchemaNames: function() {
    return [
        "SysAdminUnit""VwSysSchemaInfo""VwQueueSysProcess""City""Country""AccountIndustry"
    ];
},

И перечислить в этом методе объекты, в которых необходимо убрать возможность отображения быстрого добавления записи (например «AccountIndustry» или «City»).

Наглядный скриншот:

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

Нравится

Поделиться

0 комментариев
Показать все комментарии
Публикация

Вопрос

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

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

Ответ

InsertQuery не возвращает ID записи. Как Вы уже сказали для заполнения деталей нужен ID.

Следует сперва создать сущность, получить ее идентификатор и по этом ID заполнять детали контакта.

Нравится

Поделиться

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

Симптомы

Суть проблемы: в чешской локализации невозможно добавить стандартную деталь. При сохранении изменений в консоли ошибка «Cannot read property 'name' of undefined» (версия 7.7).

 Кейс 1:

- открываем в мастере мобильного приложения «Настроить детали» в разделе «Заказы» (Objednбvky).

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

- добавляем деталь «Продукт в заказе» (Produkt v objednбvce)

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

- в результате добавления детали «Продукты в заказе» в дизайнере мобильного приложения происходит свал:

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

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

Если опять перейти в настройки детали, то caption этой детали не отображается.

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

Кейс 2:

- в мастере мобильного приложения открыть настройки стандартной детали, например, раздела «Контрагенты» (Firmy)

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

- ничего не добавляем, а только необходимо нажать на кнопку сохранить;

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

- заново открываем настройки детали раздела «Контрагенты».  Увидим, что caption снова не отображаются. Снова нажимаем на сохранить.

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

- в результате возникает такая же ошибка.

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

Доп. информация:

- На русской и английской локализации не удается воспроизвести ошибку.

- В 7.8 не удалось воспроизвести, так как нет демки с чешской локализацией.

- При создании детали нормально формируется код:

{
    "operation": "insert",
    "name": "settings",
    "values": {
        "entitySchemaName": "Order",
        "details": [],
        "columnSets": [],
        "localizableStrings": {
            "primaryColumnSetOrder_caption": "Zбkladnн informace",
            "OrderProductDetailV2StandartDetailOrder_caption": "Produkt v objednбvce"
        },
        "settingsType": "RecordPage",
        "operation": "insert"
    }
},

но у самой локализационной строки OrderProductDetailV2StandartDetailOrder_caption значение пустое. Если же туда добавить руками Produkt v objednбvce, то на странице перечня деталей карты Заказ мобильного приложения название появляется. Если же мы будем добавлять деталь сразу на страницу - то тоже самое сначала название детали видно, но после ее конфигурирования, сохранения страницы и повторного ее открытия видим undefined вместо названия. При этом никаких ошибок ни в консоли, ни в запросах нет.

Решение

Для решения проблемы необходимо:

1)      Создать замещающий клиентский модуль(Nahrazující uživatelský modul) для схемы «Mobile app module - Section designer»

Внутри написать такой код:

define("MobileSectionDesignerModule", [],
    function() {
        return {};
    }
);
Ext.define("Terrasoft.MobileDesignerSchemaManager.override", {
    override: "Terrasoft.MobileDesignerSchemaManager",
    statics: {
        getCultureValues: function(value) {
            var res = this.callParent(arguments);
            res["cs-CZ"] = value;
            return res;
        }
    }
});

 

2)      После чего, удалить проблемный раздел из конфигурации:

А) Удалить схемы

UsrMobileOrderActionsSettingsDefaultWorkplace

UsrMobileOrderGridPageSettingsDefaultWorkplace

UsrMobileOrderProductActionsSettingsDefaultWorkplace

UsrMobileOrderProductGridPageSettingsDefaultWorkplace

UsrMobileOrderProductRecordPageSettingsDefaultWorkplace

UsrMobileOrderRecordPageSettingsDefaultWorkplace

 

Б) В манифесте MobileApplicationManifestDefaultWorkplace

Удалить локализируемую строку OrderSectionTitle

И в блоке "Modules" удалить "Order"

3)      И снова добавить раздел и деталь  через дизайнер.

Нравится

Поделиться

0 комментариев
Показать все комментарии
Публикация
  1. Групповые задачи в календаре. Например, один из пользователей BPMonline создал задачу в календаре и добавил двух участников, email которых указаны у контактов в BPMonline. Он запустил синхронизацию с календарем, создалась задача, ответственным которой является тот, кто запустил синхронизацию, а на детали участники находится он и те контакты, чьи email были указаны как гости в календаре. Если два других пользователя, которые участвуют в задаче запустят синхронизацию с календарем, для них создадутся их собственные задачи, отличающиеся от предыдущей только тем, что ответственные в них будут те пользователи, которые запустили синхронизацию. Таким образом, у каждого из них будет свою копия задачи и она будет обновляться только при синхронизации с их календарями. Если задача изменится и первый из них запустит синхронизацию, то поменяется его экземпляр задачи.
  2. Сопоставление записей происходит только по ID. Если два пользователя BPMonline затянули в систему двух контактов с одинаковой фамилией, то создадутся два контакта с одинаковой фамилией. При импорте из Google Contacts не ищется запись в BPMonline по имени или по каким-либо другим признакам, она создается заново.
  3. Слияние дублей. Если потом будет обнаружено что есть дублирующиеся данные и эти два контакта не однофамильцы, а действительно дубли, их сольют слиянием дублей. При этом в таблице метаданных одной записи контакта будут находиться две записи и соответственно эта запись контакта будет при изменении попадать в оба аккаунта гугл и изменения в нее также будут приходить из двух аккаунтов.
  4. Отключение/включение синхронизации. Один пользователь BPMonline может настроить синхронизацию только с одним аккаунтом google. Но он может сначала настроить один аккаунт, потом второй. Если после этого пользователь захочет вернуться к первому, то при авторизации ему будет сказано, что он не может этого сделать. Нужно перейти по ссылке https://accounts.google.com/b/1/IssuedAuthSubTokens?hl=ru и предварительно отключить доступ к аккаунту из приложения BPMonline.
  5. 410 Gone. Ошибка возникает при попытке синхронизировать записи календаря за период более одного месяца. 
  6. Другие особенности:
  • Для синхронизации с google хранятся даты начала и окончания последней синхронизации, т.к. записи берутся измененные в период между датой начала текущей синхронизации и после даты окончания предыдущей.
  • Синхронизированные записи из календаря имеют признак "Отображать в расписании"
  • Если у записи синхронизированной с google есть более одной записи в метаданных, что может произойти при слиянии дублей, то она не удаляется до тех пор, пока не удалится из всех аккаунтов, с которыми связана. Если эта запись удалено только в одном аккаунте, то для него будет храниться признак удаления, благодаря которому запись в этом аккаунте не будет создаваться заново.

Нравится

Поделиться

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

Вопрос

Отображать на карте не стандартный раздел "Щиты". Версия 7.5.0.966

Ответ

Реализовывается данный вопрос по аналогии с его реализацией в разделе «Контрагенты». 

Пример реализации:

 

/**
* Действие "Показать на карте"
*/
openShowOnMap: function() {
    var items = this.getSelectedItems();
    var select = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "Account"
    });
    select.addColumn("Id");
    select.addColumn("Name");
    select.addColumn("Address");
    select.addColumn("City");
    select.addColumn("Region");
    select.addColumn("Country");
    select.addColumn("GPSN");
    select.addColumn("GPSE");
    select.filters.add("AcountIdFilter", this.Terrasoft.createColumnInFilterWithParameters("Id", items));
    select.getEntityCollection(function(result) {
        if (result.success) {
            var mapsConfig = {
                mapsData: []
            };
            result.collection.each(function(item) {
                var address = [];
                if (item.get("Country") && item.get("Country").displayValue) {
                    address.push(item.get("Country").displayValue);
                }
                if (item.get("Region") && item.get("Region").displayValue) {
                    address.push(item.get("Region").displayValue);
                }
                if (item.get("City") && item.get("City").displayValue) {
                    address.push(item.get("City").displayValue);
                }
                address.push(item.get("Address"));
                var dataItem = {
                    caption: item.get("Name"),
                    content: "<h2>" + item.get("Name") + "</h2><div>" + address.join(", ") + "</div>",
                    address: item.get("Address") ? address.join(", ") : null,
                    gpsN: item.get("GPSN"),
                    gpsE: item.get("GPSE"),
                    updateCoordinatesConfig: {
                        schemaName: "Account",
                        id: item.get("Id")
                    }
                };
                mapsConfig.mapsData.push(dataItem);
            });
            var mapsModuleSandboxId = this.sandbox.id + "_MapsModule" + this.Terrasoft.generateGUID();
            this.sandbox.subscribe("GetMapsConfig", function() {
                return mapsConfig;
            [mapsModuleSandboxId]);
            this.sandbox.loadModule("MapsModule", {
                id: mapsModuleSandboxId,
                keepAlive: true
            });
        }
    }, this);
},

 

Нравится

Поделиться

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

Вопрос

Можно ли сделать чтобы "JS Error Report" не ругался на отступы, To many errors. (37% scanned)

Ответ

Функциональность JSHint зашита в ядро приложения и не является отключаемой.

Данный функционал реализован для того, чтобы код, написанный разработчиками, был читабелен и легко поддерживался другими разработчиками в будущем.

Нравится

Поделиться

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