Вопрос

В методе схемы JS требуется сделать паузу.
Какие у вас используются методы?
Я пока нашёл вот такой подход.

wait: function (ms) {
    var start = new Date().getTime();
    var end = start;
    while (end < start + ms) {
        end = new Date().getTime();
    }
},

Вызов метода: this.wait(1000);

Нравится

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

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

В JS есть готовые функции таймера, куда параметром передают обработчик. См. статью.

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

window.setTimeout(function, 1000);
function myFunction() {
  alert('Hello');
}

Аналогично и с регулярным запуском, вместо setTimeout написать setInterval.

А тут пример его использования в Creatio.

Спасибо за пример. Но пока не разобрался как быть с методом с параметрами.

// Вызовы.
setTimeout(this.foo1, 1000);
setTimeout(this.foo2("some"), 1000);
// Методы.
foo1() {
  console.info("foo1");  // есть ожидание
},
foo2(args) {
  console.info("foo2 with args");  // нет ожидания
},

 

Разобрался. Вот так будет вызов с аргументами и ожиданием.

let dt = new Date();
console.info("start: " + dt.getMinutes() + "." + dt.getSeconds() + "." + dt.getMilliseconds() + ".");
setTimeout(this.foo1, 1000);
setTimeout(this.foo.bind(this, "some"), 1000);
foo1() {
  console.info("foo1");
  let dt = new Date();
  console.info("foo1: " + dt.getMinutes() + "." + dt.getSeconds() + "." + dt.getMilliseconds() + ".");
},
foo2(args) {
  console.info("foo2(" + args + ")");
  let dt = new Date();
  console.info("foo2: " + dt.getMinutes() + "." + dt.getSeconds() + "." + dt.getMilliseconds() + ".");
},

 

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

Добрый день, какое свойство отвечает за сохранение с игнорированием обязательных полей на js
я знаю что есть такое на c# entity.save(false)
Мне надо нечто подобное

Нравится

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

Попробуйте 

this.save({isSilent: true});

 

Александр Тыра
не подходит(

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

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

Добрый день! Бьюсь уже 2 неделю и никак не могу найти информацию о том, как можно динамические регулировать количество полей на модальном окне, либо мини-карточке.

 

Задача: открывать модальное окно с параметрами из объекта Specification (Характеристика), что бы просто показать информацию из него.

 

Но проблема в том, что для каждой сущности, которая привязана к Характеристике необходимо в зависимости от типа данных выставить тип поля, а от количества этих сущностей - вывести поля.

Нравится

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

Тимофей, насколько понимаю, простых решений нет, слишком базовые схемы надо переопределять, которые являются модулями.

 

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

 

Либо, если нужно только смотреть, можно создать многострочное поле, где вывести в каждой строке название и содержимое каждого параметра. А синхронизировать с деталью можно в БП на событиях её объекта.

 

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

Добрый день.

 

Не могу понять в чем дело, среда настроена на разработку в файловой системе файлы .cs выгружаются без проблем в папку  Autogenerated\Src, но файлы .js почему то нет. Можете помочь разобраться в чем дело?

Нравится

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

Здравствуйте! Вам не эта папка нужна, а Pkg. Разблокируйте пакет и в интерфейсе Конфигурации, сделайте действие - Выгрузить пакеты в файловую систему. Данный пакет выгрузится в данную папку. 

Нигрескул Алексей,

Нет, я именно про те которые выгружаются в 

Autogenerated\Src там обычно хранятся файлы из тех пакетов которые недоступны для редактирования, у меня туда перестали выгружатся js файлы

 

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

Михаил, Вы делаете то же, что автор этой темы?

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

Нет. я просто включил разработку в файловой системе.

Михаил, уточнил у разработчиков функциональности:

Если надо посмотреть код js схемы это надо делать через веб-интерфейс, а смотреть его в Autogenerated\Src это лайфхак, а не фича.

Как включить генерацию js кода в Autogenerated\Src (Обходное решение):

  1. Создается новый временный пакет
  2. В нем создается новая временная js схема
  3. Нажать на кнопку "Выгрузить в файловую систему" и в папке Autogenerated\Src появятся js файлы.
  4. Затем временный пакет со схемой можно удалить

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

Спасибо большое

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

Доброго времени суток.

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

В случае, если на карточке редактирования присутствует вкладка с определенным ключом - необходимо "привязать" к ней деталь из diff (код ниже)
В случае, если вкладка найдена не была - добавить вкладку с привязкой детали (то есть выполнить процедуру вставки на основе diff)

Есть ли возможность динамически изменить свойство "parentName" у детали? (или как получить объектное представление детали для изменения свойства)

define("SomeModuleName", [], function() {
    return {
    details: {
        "DetailName": {
            "schemaName": "schemaName",
            "entitySchemaName": "entitySchemaName",
            "filter": {
                "detailColumn": "detailColumn",
                "masterColumn": "Id"
            }
        }
    },
    diff: /**SCHEMA_DIFF*/[ 
        {
            "operation": "insert",
            "name": "AddedTabName",
            "values": {
                "items": [],
                "caption": {
                    "bindTo": "Resources.Strings.AddedTabNameCaption"
                },
            },
            "parentName": "Tabs",
            "propertyName": "tabs",
            "index": 1
        },
    {
        "operation": "insert",
        "name": "CardDetail",
        "values": {
            "itemType": this.Terrasoft.ViewItemType.DETAIL,
            "visible": { "bindTo": "CardDetailVisible" }
        },
        "parentName": "AddedTabName",
        "propertyName": "items",
        "index": 0
        },
    ]/**SCHEMA_DIFF*/,
    methods: {
        onEntityInitialized: function() {
            this.callParent(arguments);
            // myMethodToUpdateVisibility();
        },
        }
    };
});

Вкладка (tab) на которую надо перенести деталь также динамически (также из кода клиентского модуля) добавляется сторонним пакетом.

Спасибо

Нравится

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

Добрый день! Возможно, проще добавить 2 детали на разные вкладки, и в зависимости от условий ненужное скрывать, чем динамически вставлять\перемещать

Добрый день! Возможно, проще добавить 2 детали на разные вкладки, и в зависимости от условий ненужное скрывать, чем динамически вставлять\перемещать

Лопатин Константин,

Спасибо за ваш вариант, попробую такой подход.

или как предложил Лопатин Константин или технически есть возможность закидывать и изымать элемент через ext, если вам вдруг не хватает геморроя в вашем проекте)

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

Добрый день, сообщество!

 

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

Для этого выбран один из вариантов: отобразить ActionsDashboard продажи в активности.

Приведенный в конце (без лишних частей) код модуля ActivityPageV2 дает в консоли ошибку:


SectionActionsDashboard.js:2051 Uncaught (in promise) TypeError: Cannot read property 'name' of undefined
    at i._findVisaManagerItem (SectionActionsDashboard.js:2051)
    at i.<anonymous> (SectionActionsDashboard.js:501)
    at i.e (all-combined.js:7)
    at Object.callback (all-combined.js:6)
    at all-combined.js:7

 

Ошибка приводит нас к тому, что в функции _findVisaManagerItem не находится свойство this.get("EntitySchema").name.

 

Подскажите, пожалуйста, как справиться с этой ошибкой (и вообще отобразить кейс)

 

 

 

Код модуля:

define("ActivityPageV2", ["OpportunityConfigurationConstants","ServiceHelper","ProcessModuleUtilities","MaskHelper"], 
function(OpportunityConfigurationConstants, ServiceHelper,ProcessModuleUtilities,MaskHelper) {
  return {
    entitySchemaName: "Activity",
    modules: /**SCHEMA_MODULES*/{
      "ActionsDashboardModule": {
        "config": {
          "isSchemaConfigInitialized": true,
          "schemaName": "OpportunityActionsDashboard",
          "useHistoryState": false,
          "parameters": {
            "viewModelConfig": {
              "entitySchemaName": "Opportunity",
              "actionsConfig": {
                "schemaName": "OpportunityStage",
                "columnName": "Stage",
                "colorColumnName": "Color",
                "filterColumnName": "ShowInProgressBar",
                "orderColumnName": "Number",
                "innerOrderColumnName": "End",
                "decouplingConfig": {
                  "name": "OppStageDecoupling",
                  "masterColumnName": "CurrentStage",
                  "referenceColumnName": "AvailableStage"
                }
              },
            //  "useDashboard": false,
            //  "contentVisible": false,
            //  "headerVisible": true
              "dashboardConfig": {
                "Activity": {
                  "masterColumnName": "Opportunity",
                  "referenceColumnName": "Opportunity"
                }
              }
            }
          }
        }
      }
    }/**SCHEMA_MODULES*/,
    diff: /**SCHEMA_DIFF*/[
      {
        "operation": "insert",
        "name": "ActionsDashboardModule",
        "values": {
          "classes": {
            "wrapClassName": [
              "actions-dashboard-module"
            ]
          },
          "itemType": 4
        },
        "parentName": "ActionDashboardContainer",
        "propertyName": "items",
        "index": 0
      }
    ]/**SCHEMA_DIFF*/
  };
});

 

Нравится

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

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

Кисловский Михаил Андреевич,

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

Так что тут подошла бы кнопка "Перейти на следующую стадию". Может быть, у вас есть идеи на тему того, как достать id следующей стадии кейса, в котором находится продажа? Это бы сильно помогло.

 

Мария, согласно академии:

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

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

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

Всем доброго времени суток!

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

Нравится

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

Или же необходимо после синхронизации делать редирект на preview страницу сохраненного Заказа.

Terrasoft.Configuration.WaSync = function(model, pageConfig) {
	Terrasoft.MobileSettingsPageControllerSyncManager.synchronize({
		exportOnly:false ,
		checkForPredefinedDatabase: false,
		redirect: function() {
			//Terrasoft.util.openPreviewPage(model, pageConfig);
		}
	});
};
 
Terrasoft.sdk.Model.setModelEventHandler("Order", 
	Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.After].update, 
	function(config){
		debugger;
		var model = "Order";
		var record = config.scope.eventConfig.records[0];
		var pageConfig = {
			recordId: record.data.Id
		};
		Terrasoft.Configuration.WaSync(model, pageConfig);
	});

Terrasoft.util.openPreviewPage - не срабатывает!

См. документацию по расширению синхронизации.

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

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

Написано:

Модули синхронизации являются внутренними (internal) классами и не подлежат расширению. Но часто возникает необходимость ограничить передаваемые во время синхронизации данные в соответствии с определенными правилами. Для этого была добавлена возможность управления этапами синхронизации с помощью класса управления.

Если возможностей синхронизации Вам не хватает, можно самостоятельно разработать логику, например, работая с основным сайтом по OData или обращаясь к самодельному веб-сервису, реализующему нужную логику, вроде сервиса оценки обращения.

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

Всем доброго времени суток.

Возможно ли настроить конфигурацию мобильного приложения следующим образом, что бы при срабатывании бизнес правила и обработки модели текущей записи возможно было доставать значения данных из связанных записей? В данном случае меня интересует Контакт - http://prntscr.com/o5yxe7. Без написания запроса. или запрос нужно писать в любом случае? Стоит задача при изменении Контакта необходимо в заказе перезаписывать контактный номер телефона, как лучше реализовать?

Нравится

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

Стоит задача при изменении Контакта необходимо в заказе перезаписывать контактный номер телефона, как лучше реализовать?

Мне кажется, такое нужно делать не в мобильной версии, а на стороне сервера при синхронизации. Ведь новые данные контакта могут прийти с разных сторон, например, их может исправить пользователь, работающий в веб-версии, интеграция с сайтом, 1С или ещё чем-то. Если менять будут при помощи класса EntitySchemaQuery, можно реализовать логику во встроенном или обычном процессе.

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

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

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

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

Всем доброго времени суток. Столкнулся со следующей проблемой:
не всегда обновляется поля в детали продукт в заказе - http://prntscr.com/o0d083
заношу туда данные следующим образом:

setDiscount: function(config){
		var orderProductRecord = Ext.clone(config.model);
		var totalAmount;
		var discountPrice;
		var totalDiscount;
		if (config.discountType ==="personal") {
			totalAmount = config.model.data.TotalAmount;
			discountPrice = this.calculateAmountWithDiscount(totalAmount, config.discount);
			totalDiscount = totalAmount-discountPrice;
			orderProductRecord.set("WaDiscountContact", config.discount, true);
			orderProductRecord.set("WaTotalDiscount", totalDiscount, true);
 
			orderProductRecord.save({
				success: function(){
					Terrasoft.Mask.hide({force: true});
					Terrasoft.PageNavigator.refreshLastPage(); 
				},
				failure: function(exception) {
					Terrasoft.Mask.hide({force: true});
					Terrasoft.MessageBox.showMessage(Ext.String.format(Terrasoft.LS.WaErrorExecutionMessage, exception));
				},
				queryConfig: Ext.create("Terrasoft.QueryConfig", {
					modelName: orderProductRecord.self.modelName,
					columns: ["WaDiscountContact", "WaTotalDiscount"]
				})
			}, this);
		}
	},

Не всегда отрабатывает Terrasoft.PageNavigator.refreshLastPage(); хотя в бд записываются данные.

Нравится

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

Попробовал, Terrasoft.PageNavigator.refreshLastPage() отрабатывает нормально, поле со значением появляется. Возможно, срабатывание не всегда связано с моментом, когда вызывают setDiscount: вдруг карточка в этот момент ещё не загрузилась или что-то подобное.

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

Коллеги всем доброго времени суток!

Стоит задача создавать новый заказ по нажатию кнопки из другого раздела.

Реализовал следующим образом

loadOrderPage: function(contact) {
				debugger;
				var requestUrl = "CardModuleV2/OrderPageV2/edit/" + Terrasoft.generateGUID();
				var params = this.sandbox.publish("GetHistoryState");
					var parameters = {
						viewModelConfig: {
							Contact: contact
						}
					};
					var stateObj = {
						operation: enums.CardStateV2.ADD,
						parameters: parameters
					};
 
					this.sandbox.publish("PushHistoryState", {
						hash: requestUrl,
						stateObj: stateObj
					});
			}

Но параметры не передаются. и не заполняются поля. Подскажите как реализовать данный кейс?
Благодарю!

Нравится

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

Алексей,

Если нужно создать сущность из карточки другой сущности, почему нельзя просто сделать esq-запрос в БД или дернуть БП/Сервис, который это сделает на бэке? Наверное, у Вас есть какие-то особые условия созданий этой сущности? 

Возможно, ему надо именно визуальное открытие карточки для ввода данных. В таком случае лучше реализовать БП c шагом открытия нужной карточки и в настройках элемента преднастроить заполнение полей.

Коллеги благодарю за помощь. Задача была без использования БП. Реализовал следующим образом. 

loadOrderPage: function(contact) {
				var openCardConfig = {
					hash: this.sandbox.id,
					id: "Id",
					operation: enums.CardStateV2.ADD,
					schemaName:"OrderPageV2",
					moduleId: this.sandbox.id + "_AddOrderSuccessAction",
					defaultValues: [
						{ name: "Contact", value: contact.value },
						{ name: "uphType", value: "1AC347DB-DC55-4BA9-AC59-EF23041E891B" }, //"B2B"
						{ name: "WaOrderType", value: "79BF282E-87CC-42CD-8A2A-E1147ECC4CB8" }, //"Физю лицо"
						{ name: "Owner", value: Terrasoft.core.enums.SysValue.CURRENT_USER_CONTACT.value },
						{ name: "CreatedOn", value: new Date() }
					]
				};
				this.sandbox.publish("OpenCard", openCardConfig, [this.sandbox.id]);
			}

 

/del

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