Вопрос

Мы обнаружили, что пользователей системы можно создать только для контактов, у которых в поле контрагент указана "Наша компания". Однако ввиду специфики оргструктуры организации клиента нам необходимо, чтобы была возможность создавать пользователей для контактов, контрагент которого является, допустим, дочерним для "Нашей компании". Есть ли возможность включить таких контактов в список сотрудников, который выдается при создании пользователя?

Ответ

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

Логика фильтра в поле «Сотрудник» карточки пользователя задаётся в функции «PrepareEmployeeEditFilter» страницы «UserEditPage».

Вы можете модифицировать (или вообще отключить) фильтры, ограничивающие выбор контакта.

Нравится

Поделиться

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

Вопрос

Не отображаются активности типа "Звонок" в разделе история

Ответ

Начиная с версии 7.7.0, на детали "Активности" в разделе "История" добавлена фильтрация отображаемых записей по типам, в результате которой на данной детали не отображаются активности с типом "E-mail" и "Звонок", которые могли быть созданы в предыдущих версиях. Данная особенность связана с выделением для этих сущностей отдельных разделов и деталей.

Для того, чтобы на детали «Активности» вкладки «История» отображались ранее созданные активности с типом «Звонок», необходимо создать замещающий клиентский модуль для схемы ActivityDetailV2 и переопределить в нём метод getFilters() следующим образом, удалив фильтрацию по звонкам:

getFilters: function() {
    var filters = this.callParent(arguments);
    filters.removeByKey("NotCallFilter");
    return filters;
}

 

Нравится

Поделиться

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

Вопрос

Не устанавливается Silverlight в браузере на mac os

Ответ

Для решения задачи рекомендуем использовать последнюю версию браузера Safari (для mac os). Также хотим обратить внимание, что Google Chrome с версии 45.x не поддерживает Silverlight. Вы можете использовать Firefox Mozilla, Internet Explorer (для Windows).

Нравится

Поделиться

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

Симптомы

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

Причина

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

Решение

1. Убедиться что метод отключен в IIS. В структуре IIS выбрать сайт, перейти в меню Authentication. Включены только Anonymous, Forms Authentications.

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

2. Убедиться, что версия .Net Framework соответствует значениям из таблицы. Определить версию можно в регистре, ознакомившись со статьей https://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx

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

3. Перезапустить сайт.

Необходимые условия и возможные ограничения

Доступ к IIS, доступ к регистру.

Нравится

Поделиться

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

Вопрос

Как добавить поле типа web (как в детали средства связи), чтобы при клике в другой вкладке открывалась эта ссылка.

Ответ

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

{
    "operation": "insert",
    "name": "AdditionalExpenses",
    "values": {
 
        // -->
        "showValueAsLink": true,
        "controlConfig": {
            "enabled": true,
            "href": {
                "bindTo": "getAdditionalExpensesLink"
            },
            "linkclick": {
                "bindTo": "onExternalLinkClick"
            }
        },
        // <--
 
        "layout": {
            "colSpan": 12,
            "rowSpan": 1,
            "column": 0,
            "row": 3,
            "layoutName": "Tab07720f4eTabLabelGridLayout691629ea"
        },
        "labelConfig": {},
        "enabled": true,
        "bindTo": "AdditionalExpenses"
    },
    "parentName": "Tab07720f4eTabLabelGridLayout691629ea",
    "propertyName": "items",
    "index": 5
},

А в секцию methods страницы добавить:

methods: {
 
    getAdditionalExpensesLink: function() {
        return this.getLink(this.get("AdditionalExpenses"));
    },
    onExternalLinkClick: function() {
        return;
    },
    getLink: function(value) {
        if (Terrasoft.isUrl(value)) {
            return {
                url: value,
                caption: value
            };
        }
    }
},

После этого поле будет со ссылкой, если указать её в правильном ссылочном формате, или скопировать из браузера. Клик из контекстного меню "Открыть в новой вкладке" откроет ссылку в новом окне, по клику первой кнопкой мыши, откроет в текущем:

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

Чтоб ссылка открывалась в новом окне, нужно дополнить метод onExternalLinkClick():

onExternalLinkClick: function() {
    var value = this.get("AdditionalExpenses");
    if (!Ext.isEmpty(value)) {
        window.open(value, "_blank");
    }
    return false;
},

 

Нравится

Поделиться

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

Кейс

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

Цель

Корректная работа кнопки "Закрыть" окно.

Необходимые условия

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

Выполнение

Данное поведения наблюдается в случае, если пользователь нажимает на стрелочку, справа от поля с выпадающим списком. Если открывать окно “Раздел”, нажимая на центр поля, кнопка “Закрыть” работает корректно. 

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

Нравится

Поделиться

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

Вопрос:

Виникла проблема при запуску БП при просроченні звернення. Базовий БП "Установка показателей просроченности обращений" встановлює логічні поля Просроченый по реакции і Просроченный по решению через базу тому ці поля важко використати для стартового сигналу запуску БП. Можливо є якісь інші методи щоб запустити БП при просроченні?

Ответ:

Для решения данной бизнес цели можно использовать стартовый сигнал вида:

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

Нравится

Поделиться

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

Задача

Необходимо создать свой виджет

Решение

В системе виджеты используются для вывода данных из встроенных в систему модулей.

Данная опция позволяет выводить данные в нестандартном виде.

Пример реализации виджета:

define('SxClientUnitTable', ['ext-base', 'terrasoft', 'sandbox', "BaseFiltersGenerateModule", 'SxClientUnitTableResources', "ChartModuleHelper", "css!SxClientUnitTableCss", "ServiceHelper"],
	function(Ext, Terrasoft, sandbox, BaseFiltersGenerateModule, resources, ChartModuleHelper, css, ServiceHelper, ConfigurationConstants) {
 
		function getViewModel() {
					return Ext.create('Terrasoft.BaseViewModel', {
				//todo SysModuleAnalyticsChart deleted
						entitySchema: 'Order',
						methods: {
							getChart: function(key) {
							debugger
								sandbox.publish('GenerateChart', key);
								var filters = this.getReportFilters();
							},
							load: function() {
 
							}
						}
					});
				};
		var result = "";
		function generateMainView(renderTo) {
 
			var resultConfig = Ext.create('Terrasoft.Container', {
				id: 'tableOtchetMetkiParamContainer',
				selectors: {
					wrapEl: '#tableOtchetMetkiParamContainer'
				},
				renderTo: renderTo
			});
			return resultConfig;
		}
		function getInfoMetki(parameters) {
 
			var serviceData = {
				site: parameters[0].toString(),
				ownerId: parameters[1].toString(),
				startDate: parameters[2].toString(),
				dueDate: parameters[3].toString(),
				countryId: parameters[4].toString()
			};
 
			ServiceHelper.callService("UsrOtchetMetkiGetCollectionConfigurationService", "GetCollectionOtchetMetki",
				function (response) {
				debugger
					if (response.status == 404) {
						this.showInformationDialog("\t Error: \n" + response.message);
					}
					else if(response.GetCollectionOtchetMetkiResult.length > 0){
						result = response.GetCollectionOtchetMetkiResult;
						var arrR = result.split(":");
						var htmlAdded = "<table><tr><th>Метка</th><th>Количество заказов</th><th>На уточнении</th><th>% уточн.</th><th>Подтвержденные</th><th>% Подтв.</th><th>Завершенные</th><th>% Заверш.</th><th>Отмены</th><th>% Отм.</th></tr>";
						for(var i = 0; i < arrR.length - 1; i++){
							//get items
							var strArr = arrR[i].split(" ");
							var metkaOne = strArr[0].replace("{","");
							var metka = metkaOne.replace("}","");
 
							htmlAdded += "<tr><td>" + metka + "</td><td>" + strArr[1].toString() + "</td><td>"  + strArr[2].toString() + "</td><td>" + strArr[3].toString() + "</td><td>" + strArr[4].toString() + "</td><td>" + strArr[5].toString() + "</td><td>" + strArr[6].toString() + "</td><td>" + strArr[7].toString() + "</td><td>"  + strArr[8].toString() + "</td><td>" + strArr[9].toString() + "</td></tr>";
						}
						//end table
						htmlAdded += "</table>";
						var el = Ext.get('tableOtchetMetkiParamContainer').setHTML(htmlAdded);
						var elemV = Ext.get('Module1');
						elemV.toggleCls('my-table');
					}
					else
						result = null;
				}, serviceData, this);
		}
		function getReplaceString(str, separator){
		debugger
		var arSt = str.split(separator);
			var res = arSt[2] + separator + arSt[1] + separator + arSt[0];
			while(res.indexOf(separator) > 0){
				res = res.replace(separator,"-");
			}
			return res;
		}
 
		var render = function(renderTo) {
 
 
			debugger
			var viewConfig = generateMainView(renderTo);
			var viewModel = getViewModel();
			var getStartD = Ext.get("fixedFilterDateView-wrap").dom.innerText;
			var getEndD = Ext.get("fixedFilterDateDueView-wrap").dom.innerText;
 
			var startD = getStartD.indexOf("Начало") > 0 ? "2016-05-01" : getReplaceString(getStartD, ".");
			var endD = getEndD.indexOf("Завершение") > 0 ? "2016-07-04" : getReplaceString(getEndD, ".");
			var ar = [];
			ar.push("all");
			ar.push("all");
			ar.push(startD);
			ar.push(endD);
			ar.push("a570b005-e8bb-df11-b00f-001d60e938c6");
			getInfoMetki(ar);
 
 
			viewConfig.bind(viewModel);
			//viewConfig.render(renderTo);
		};
		return {
			schema: 'Order',
			methods: {
				onLookupChange: function(newValue, columnName) {
 
                                this.callParent(arguments);
                                if (columnName === "UsrCityFilter") {
                                        this.set("UsrCityFilter", newValue);
                                        this.onUsrCityFilterChanged();
                                }
                        },
 
                        onUsrCityFilterChanged: function() {
                                this.reloadGridData();
                        },
				getOrdersForFilter: function(){
					var items = [];
					var selOrders = Ext.create("Terrasoft.EntitySchemaQuery", {
						rootSchemaName: "Order"
					});
					selOrders.addColumn("SxMark.Name");
					selOrders.addColumn("SxCountry.Name");
					var filterByUser = Terrasoft.createColumnFilterWithParameter(
					Terrasoft.ComparisonType.EQUAL, "SxCountry.Name", "Россия");
					selOrders.filters.addItem(filterByUser);
					selOrders.getEntityCollection(function (response) {
					debugger
						if (response.collection.collection.length > 0)
							items = result.collection.getItems();
						else
							items = null;
					}, this);
					return items;
				}
 
			},
			userCode: function() {
 
			},
			init: function() {
 
			},
			filterChanged: function( filter, eOpts ){
				debugger
				var c = [];
			},
			render: render
		};
	}
)
;

 

Нравится

Поделиться

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

Вопрос

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

Ответ

define("ContactAddressPageV2", [],
    function() {
        return {
            attributes: {
                "UsrKladrStreet": {
                    dataValueType: Terrasoft.DataValueType.LOOKUP
                },
                "UsrVirtualKladrStreet": {
                    "dataValueType": Terrasoft.DataValueType.LOOKUP,
                    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    isLookup: true,
                    caption: "virtual street",
                    referenceSchemaName: "UsrKladrStreet"
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "parentName": "Header",
                    "propertyName": "items",
                    "name": "UsrKladrStreet",
                    "values": {
                        bindTo: "UsrKladrStreet",
                        "caption": {"bindTo": "Resources.Strings.UsrKladrStreetCaption"},
                        layout: {column: 0, row: 8, colSpan: 12}
                    }
                },
                {
                    "operation": "insert",
                    "parentName": "Header",
                    "propertyName": "items",
                    "name": "UsrVirtualKladrStreet",
                    "values": {
                        bindTo: "UsrVirtualKladrStreet",
                        "caption": "virtual street",
                        layout: {column: 0, row: 9, colSpan: 12}
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

 

Нравится

Поделиться

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

Вопрос:

Можно ли в подпроцессе завершить работу главного процесса (процесса где используется этот подпроцесс)? и каким образом?

Вот что нам нужно:

1. Есть главный процесс "Приготовление чая". 

1.1 Для этого мы создаем карточку проекта (Состояние: "в работе") и создаем ряд задач.

2. Есть подпроцесс "Проверка наличия кружки", который стартует после задачи "Вода в чайнике вскипела" главного процесса.

2.1 Подпроцесс "Проверка наличия кружки" может завершиться или нахождением кружки или констатацией факта, что кружка отсутствует. 

2.2 Если кружка отсутствует - необходимо в главном процессе "Приготовление чая" изменить значение поля "Состояние" карточки Проекта на "Отменен"

3. После изменения поле "Состояние" карточки Проекта на "Отменен"  (чтение сигнала, например) завершить работу главного процесса. 

Могли бы Вы уточнить как можно решить нашу задачу? 

Ответ:

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

Подход к реализации описанной задачи следующий:



Создаем подпроцесс (условно, CupSearch) с параметром прцоесса логичское, к примеру, CupFound.

В данном подпроцессе заполняем значение параметра CupFound с помощью элемента Формула.

Завершаем процесс элементом Останов.



Создаем родительский процесс, в нем добавляем элемент Подпроцесс (название элемента, например, CupSearch1), указываем процесс = CupSearch.

Условный поток из элемента подпроцесс : [CupSearch1.CupFound] == true , продолжение выполнения процесса

Поток Иначе - переход на элемент Изменить данные, установить поле Отменен для проекта. После этого переход на элемент Останов.

Рис. 1 Основной процесс "Приготовление чая"

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

 

Рис. 2 Подпроцесс "Поиск чашки"

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

Нравится

Поделиться

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