Как сделать, чтобы при нажатии на флаг во вкладке Набор групп (1) текущий набор групп добавлялся в связи активности (2) http://prntscr.com/gwfa8a. Например, как в вкладке Контакты http://prntscr.com/gwfbo5

Пыталась сделать вот так: 

Кусочек в схеме

	modules: /**SCHEMA_MODULES*/{
			"ActionsDashboardModule": {
				"config": {
				"isSchemaConfigInitialized": true,
				// Имя схемы.
				"schemaName": "BtcGroupActionsDashboard",
				"useHistoryState": true,
				"parameters": {
					"viewModelConfig": {
						"entitySchemaName": "BtcInterest",
						"dashboardConfig": {
							"Activity": {
								"masterColumnName": "Id",
								"referenceColumnName": "BtcGroupInContact"
							}
						}
					}
					}
				}
			}
		}/**SCHEMA_MODULES*/,

Структура активности:

http://prntscr.com/gwfdic

Нравится

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

Добрый день, Татьяна.

Код схемы, на взгляд, написан верно. Скорей всего вы не добавили колонку BtcGroupInContact в деталь Связи для Активности.

Вам необходимо выполнить следующие шаги:

1) Открыть метаданные объекта Activity.

2) Найти UId колонки BtcGroupInContact. Пример для колонки UsrTest на прикрепленном скриншоте.

3) Выполнить следующий скрипт:

insert into EntityConnection (SysEntitySchemaUId, ColumnUId) values ('C449D832-A4CC-4B01-B9D5-8A12C42A9F89', '4847cb25-c29b-44e5-9b7c-1829e2a2f6b4')

Где вместо 4847cb25-c29b-44e5-9b7c-1829e2a2f6b4 будет UId вашей колонки. 

4) Перезайти в систему.

http://prntscr.com/gydvit - взяла uid

http://prntscr.com/gydszn - сделала запрос. Перезашла в систему, почистила кеш и куки

http://prntscr.com/gydtfu - ничего не поменялось (

Терещук Сергей,

именно текущий не добавляется 

Татьяна, добрый день! Значения по умолчанию заполняются в методе getDefaultValues из SectionActionsDashboard. Для того, чтобы ваше поле автоматически добавилось в связи активности, вам необходимо заместить этот метод. Мы зарегистрировали пожелание на доработку  функционала в будущих версиях продукта чтобы данные действия можно было выполнить через интерфейс.

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

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

К примеру, есть некоторый контрол, наследующийся от Terrasoft.Component. Как я понимаю, сам процесс генерации непосредственно HTML-кода происходит на этом этапе:

 

renderComponent: function(buffer, renderData) {
		var self = renderData.self;
		if (self.html) {
			Ext.DomHelper.generateMarkup(self.html, buffer);
			return;
		}
		var tpl = self.getTpl();
		var tplData = self.getTplData();
		tpl = self.processTemplate(tpl, tplData);
		var template = new Ext.XTemplate(tpl);
		self.prepareTpl(template, tplData);
		template.applyOut(tplData, buffer);
	},

(взято отсюда: https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.controls.Compon…)

Собственно, вопрос такой: можно ли сюда вставить какой-либо запрос, типа getEntityCollection? Задача по сути - надо внести некоторые изменения в tplData, получить данные для которых можно только запросом.

Если я делаю запрос после строки var tplData = self.getTplData(); а последующее - переношу внутри функции-обработчика результата запроса, то в консоль вываливается ошибка: Uncaught Terrasoft.ItemNotFoundException: Элемент не создан

Внутрь самой getTplData, понятно, запрос тоже не добавить - там функция возвращает return.

Можно ли вообще реализовать такую штуку с запросом?

Нравится

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

Добрый день. Да, вы можете воспользоваться esq в данном методе. Однако в момент вызова функции обратного вызова часть внутренних переменных контрола будет уже недоступна. Вам стоит смотреть в сторону реализации взаимодействия контрола с моделью, как это реализовано в базовых контролах системы. Пример реализации вы можете посмотреть в SDK https://academy.terrasoft.ru/sites/default/files/documents/docs/technic… стр. 672.

Терещук Сергей,

Сергей, доброго дня.

Спасибо за ответ, хотя вопрос в общем-то уже решён.. но появился следующий: можно ли в контролах использовать миксины (подключить другой контрол с доступом к его функциям)? Есть пара контролов, в которых используются похожие функции, хотелось бы вынести их отдельно, чтобы не плодить копипасту.

Может тоже есть, где посмотреть примеры?

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

Добрый день.

Как мне из схемы конфигурации ActivityMiniPage получить данные привязанного лида ?

При наведении на активность в боковой панели вызываю функцию getEmail. В ней пытаюсь получить сначала id лида, потом по этому id получить объект из БД. Как это правильно сделать?

    

getEmail: function() {
     var id = ??;
     var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
            rootSchemaName: "Lead"
         });
     esq.addColumn("Id");
     esq.addColumn("Email");
     esq.getEntity(id, function(result) {
         this.console.log(result.entity.get("Email"));
     }, this);

 

Нравится

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

" При наведении на активность в боковой панели вызываю функцию "

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

Если он всё-таки вызывается в миникарточке, то

var id = this.get("Lead") ? this.get("Lead").value : null;

Если в другой схеме, то тут надо реализовывать логику через сообщения

 

я пробовала уже так. постоянно null, даже когда лид привязан. функцию вызываю тут: 

{
"operation": "insert",
"name": "ContactEmailButton",
"parentName": "ActivityGeneralInfoContainer",
"propertyName": "items",
"values": {
			"itemType": Terrasoft.ViewItemType.LABEL,
		    "caption": {"bindTo": "getEmail"},
 
	},
"visible": {
			"bindTo": "isIconVisible"
    }
}

 

>Т.е вы наводите на активность, появляется миникаточка, и тут где-то в недрах комм. панели происходит вызов функции

да

Ужас какой smiley

1) ActivityGeneralInfoContainer, есть в ActivityMiniPage. Всё-таки туда вы добали esq, а не в комм.панель. 

2) "caption": {"bindTo": "getEmail"}. Не сработает. Кепшн биндится на статичную переменную, а не асинхронную функцию.

Попробуйте добавить аттрибут,  тип текст. В diff кепшн биндите на этот аттрибут, а на onEntityInitialized запускайте свою функцию (там лид скорее всего будет известен) и после того как вытащите из лида email перенесите его в аттрибут 

или ещё легче.

это в аттрибуты

"Lead": {
	"lookupListConfig": {
		"columns": ["Email"]
	}
},
"MyLabelCaption": {
	dataValueType: 1,
	value: ""
}

это в методы

onEntityInitialized: function(){
	this.callParent(arguments);
	this.set("MyLabelCaption", this.get("Lead") ? this.get("Lead").Email : "лид не найден");
}

это в дифф

{
    "operation": "insert",
    "name": "ContactEmailButton",
    "parentName": "ActivityGeneralInfoContainer",
    "propertyName": "items",
    "values": {
			"itemType": Terrasoft.ViewItemType.LABEL,
		    "caption": {"bindTo": "MyLabelCaption"},
            "visible": {"bindTo": "isIconVisible"}
    }
}

 

спасибо огромное

а не подскажите еще, пожалуйста, как мне этот имейл сделать в таком вот виде  http://prntscr.com/gwf5yb ? или хотя бы как обработать клик по элементу ?

это кнопка, с пустым кэпшеном, стиль - "transparent", наложена иконка с изображением, ну и с каким-то обработчиком.

при нажатии на имейл надо чтобы открывало окно с отправкой имейла. делаю вот так : 

    onTypeIconButtonClick: function() {
		var value = this.get("Lead").Email;
		if (value) {
			var path = this.getLinkUrl(value);
			this.console.log(path);
			if (path) {
				this.onLinkClick(path.url)
			  }
			}
		},
		getLinkUrl: function(value) {
		    if (!value || Ext.isEmpty(value)) {
			    return {};
		    }
		    var emailUrl = EmailHelper.getEmailUrl(value);
		    if (Ext.isEmpty(emailUrl)) {
					return {};
		    } 
		    return {
			    url: emailUrl,
			    caption: value
		    };
		    return {};
	    },
		onLinkClick: function(path) {
			window.location.href = path;
		},

в консоле: http://prntscr.com/gwhngk

и на страницу с отправкой имейла не переходит

попробуйте

onTypeIconButtonClick: function() {
	var value = this.get("Lead").Email;
	if (value) {
		this.openCard("EmailPageV2", "add", Terrasoft.generateGUID());
	}
}

 

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

Как создать уведомление в коде C#?

Нравится

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

1) Если это активность, то:

var Activity = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
var EntityActivity = Activity.CreateEntity(UserConnection);
EntityActivity.SetDefColumnValues();
EntityActivity.SetColumnValue("OwnerId", contactID);
EntityActivity.SetColumnValue("Title", "Активность с уведомлением");
EntityActivity.SetColumnValue("RemindToOwner", true);
EntityActivity.SetColumnValue("RemindToOwnerDate", DateTime.UtcNow);
EntityActivity.Save(false);

2) Если другой объект системы, для которого есть  NotificationProvider, то можно сделать аналогичный инсерт в таблицу reminding. Наполнение как из скриншота (скрин из бп, переделывать под createEntity немного лень). Единственное что в поле "Объект" надо вставить ID нужного объекта из вью, в "Уник. индетификатор заголовка" - id конкретной страницы

3)  Если другой объект системы, у которого нет NotificationProvider, то обходной вариант - в активность прикреплять ссылку на ваш объект, уведомление прикреплять к активности. Или лепить собственный NotificationProvider, где-то тут на форуме уже обсуждалась данная тема.

И комментируя ваш батхёрт в соседней теме. "смотрите примеры в конфигурации" - это , пожалуй, девиз террасофта. так было полтора года назад, так осталось и сейчас. никто на форуме (за исключением 5-6 отдельных товарищей) не выкладывает отдельных решений кодом для вопрошающих.

Варфоломеев Данила,

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

 

Данько Дмитрий Леонидович пишет:

Подскажете что еще нужно?

Насколько я помню надо проверить наличие записи в Reminding (isread должно быть false), проверить, чтобы был зарегистрирован провайдер для раздела в NotificationProvider, проверить ошибки в консоли (отрабатывает ли C# код провайдера) и самое главное надо для коммуникационной панели сделать описание айтема уведомления (верный способ, что всё работает, но нет описания для уведомления — в коммуник. панели "пустое" место, нет картинки, что нет напоминаний, как на скрине)

Варфоломеев Данила,

1) в таблицу NotificationProvider добавил 1 строку - описание провайдера ClassName = 'xxxxxxxxxx' (полное название моей схемы), Type=1 (Notification)

2) в таблицу Reminder добавил уже несколько строк - все заполнены. они как бы и должны появляться в уведомлениях. но не появляются.

В коде стоит обработка исключений они не появляются, записи успешно уходят в SQL.

3) у меня выглядит так как вы выложили на фото. пусто. что означает сделать описание итема для комуник панели? подскажите пож.

Варфоломеев Данила,

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

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

Данько Дмитрий Леонидович пишет:

что означает сделать описание итема для комуник панели? подскажите пож.

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

Загляните в ReminderNotificationsSchema (в схеме из пакета nui - свалка, можете глянуть в пакете Invoice). По сути там в diff описывается как отрисовывается единичное уведомление для конкретного объекта.

Добрый день,

можно ли поподробнее про пункт "создать описание айтема уведомлений"? Что это и , где хранится? Цель создать визу для кастомного объекта через свой кастомный Approval процесс. Notification provider описан и зарегистрирован, никаких ошибок он уже больше не кидает, в конечном результате имею именно пустое, без картинки пространство в коммуникационной панели.

Видимо, речь о пункте 3 в инструкции:

3. Заместить схему вкладки напоминаний ReminderNotificationsSchema

1. Чтобы отображались напоминания по требуемому объекту, создайте в пользовательском пакете замещающую схему ReminderNotificationsSchema и добавьте в нее необходимую программную логику.

...

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

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

Желательно присутствие бывалых Одинов, которые повидали многое в данном продукте.

В продолжение предыдущего поста было принято решения не отходить от стандартной реализации отправления файла, используя FileAPI.



На данный момент были созданы на основе базовых схем, следующие схемы:

аналог FileUploadInfo,

аналог IFileUploadInfo,

KmFileUploadService - аналог сервиса FileApiService,

аналог FileUploader аналог.



Так же была заимствована логика подготовки и отправки файла до FileAPI из FileDetailV2 и ConfigurationFileApi.




При выборе некого файла (если помните ранее писал про кнопку Selec file, клик которой создает скрытый input с type = file и реализует клик по нему) после логики схем FileDetailV2 и ConfigurationFileApi файл попадает в FileAPI, где на мой взгляд происходит его подготовка и разбиение на Chunk (далее Чанки).

После всех манипуляций дынный Api посылает его в KmFileUploadService
 , который вызывает унаследованный FileUploader, конкретно метод Upload, где происходит проверка размера файла, а далее ведется проверка связанная с Чанками (!fileUploadInfo.IsChunkedUpload || fileUploadInfo.IsFirstChunk) и в зависимости от проверки запускается метод Save или AppendData.



Как только текущий Чанк попадает в Save, исходя из нашей логики я организовываю запросы на Ftp по созданию файла (ничего такого, чего нет на MSDN).

Далее как я понимаю идёт обратный запрос к FileAPI который в свою очередь отдает нам следующий Чанк, который попадает в AppendData.



Базовая реализация этого метода подразумевает вызов метода DBLobUtilities.AppendBlob.

В нашем случае мы не используем этот метод, так как сохранение файла в базу у нас не велось. Мы используем аналогичный подход как в нашем Save только указываем WebRequestMethods.Ftp.AppendFile ,который должен нам исходя из следующего Чанка дописать ранее созданный экземпляр файла. По завершению этого действия по идее должен быть обратный ответ от FileAPI, который вышлет нам следующий Чанк и так далее пока все Чанки не кончатся, но этого не происходит. См. приложенный скриншот.

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



Итак самое главное вопросы:

1. Не удалось найти реализацию базового метода DBLobUtilities.AppendBlob, т.е. что он выполняет и каким образом запросы к FileAPI не прерываются. Потому что в нашем случае весь процесс состоит из двух Чанков, + второй Чанк сильно переписывает и ломает тело файла.

2. Хотелось бы узнать существует ли возможность в наш сервис передать кастомное значение типа пункта назначения фолдера, куда сохранять файл. Есть подозрения что нужно будет расширить FileUploadInfo и интерфейс который он использует, и обязательно расширить UI методы который формируют объект для FileAPI.

 

P.s. если не использовать данный подход, а работать с обыкновенным FileReader и читать тело файла readAsDataURL то всё бы ничего, но вот если файл весит свыше 10мб у сервиса начинается батхерт со временем обработки запроса.

Нравится

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

Не понимаю зачем зарывать в такие дебри. У меня сработало так:

1) Создал миксин, обрабатывающий  клик и загрузку.

define("TmUploadMixin", ["MaskHelper", "ConfigurationFileApi"],
	function(MaskHelper) {
 
		Ext.define("Terrasoft.configuration.mixins.TmUploadMixin", {
		alternateClassName: "Terrasoft.TmUploadMixin",
 
		/**FILE_IMPORTER**/
		onFilesSelected: function(file, tag) {
			if (file.length <= 0) {
				return;
			}
			var config = this.getUploadConfig(file, tag);
			this.upload(config);
		},
		getUploadConfig: function(file, tag) {
			return {
				uploadWebServicePath: "TmFilesUploader/Upload", // "FileApiService/Upload"
				scope: this,
				columnName: "columnName",
				parentColumnName: "parentColumnName",
				parentColumnValue: "parentColumnValue",
				onFileComplete: this.onFileComplete,
				entitySchemaName: tag,
				files: file,
				isChunkedUpload: false
			};
		},
		upload: function(config) {
			MaskHelper.ShowBodyMask();
			Terrasoft.ConfigurationFileApi.upload(config);
		},
		onFileComplete: function(error, xhr, file, options) {
			MaskHelper.HideBodyMask();
			//debugger;
			var data = JSON.parse(Terrasoft.decode(xhr.responseText));
			if (data.error !== "False") {
				this.showInformationDialog("Ошибка импорта. Подробнее — в консоли");
				console.log(data.data);
			} else {
				this.showInformationDialog("Записей импортировано: "+data.data);
				//this.reloadGridData();
			}
		}
 
	});
	return Terrasoft.TmUploadMixin;
});

 

2) Создал сервис

namespace Terrasoft.Configuration.TmFilesUploader
{
	using System;
	using System.IO;
	using System.Net;
	using System.Data;
	using System.Runtime;
	using System.Collections.Generic;
	using System.Runtime.Serialization;
	using System.ServiceModel;
	using System.ServiceModel.Web;
	using System.ServiceModel.Activation;
	using System.Web;
	using System.Web.SessionState;
	using Terrasoft.Common;
	using Terrasoft.Core;
	using Terrasoft.Core.Factories;
	using Terrasoft.Core.Entities;
	using Terrasoft.Configuration.FileUpload;
	using Terrasoft.Web.Common;
 
 
	[ServiceContract]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
	public class TmFilesUploader : BaseService, IReadOnlySessionState
	{
		[Obsolete]
		public const string HeaderContentRange = "Content-Range";
		[Obsolete]
		public const string HeaderRange = "Range";
		[Obsolete]
		public const string HeaderContentDisposition = "Content-Disposition";
 
		[OperationContract]
		[WebInvoke(Method = "POST", UriTemplate = "Upload", ResponseFormat = WebMessageFormat.Json)]
		public string Upload(Stream fileContent) {
			string value;
			bool error=false;
			try {
				IFileUploadInfo fileUploadInfo = new FileUploadInfo(fileContent, new HttpRequestWrapper(HttpContext.Current.Request);
				/**стрим будет валяться в fileUploadInfo.Content**/
			} catch (Exception ex) {
				value = ex.Message+"|"+ex.Source+"|"+ex.StackTrace+"|"+ex.InnerException;
				error = true;
			}
 
			return "{\"error\":\"" + error + "\",\"data\":\"" + value + "\"}";
		}
	}
}

И как бы всё... Ну единственно отрубил chunkedUpload и оставил дефолтный террасофтовский метод по проверке веса файла (думаю можно отредактировать если надо)

Варфоломеев Данила пишет:

Варфоломеев Данила

Добрый день/ночь, вот что получаем в итоге при ~20+ мб весом файла, ограничение Террасофта в настройке повысил. Понимаю что файл надо разбить каким-то образом на осмысленные части и грубо говоря из сервиса append'ить эти части между собой. Но мысли пока зашли в тупик.

Есть предположения у Вас коллега? 

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

Добрый день всем.

При попытке обращения к сервису через Js возникает 500 ошибка.

Пример объявления метода Сервиса:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "Upload", BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
   public string Upload(Stream fileContent, string fileName, string fileDestination) {

 

Пример вызова из Js:

var file = files[0];
    var reader = new FileReader();
    reader.readAsBinaryString(file);
    reader.addEventListener("load",
         function(item) {
	 var data = {
       	      fileContent: item.target.result,
	      fileName: file.name,
	      fileDestination: destinationPath
	 };
	 ServiceHelper.callService("KmFileUploadService",
	      "Upload",
     	      function(response) {
	           this.console.log(response);
	      },
	      data,
	      this
	 );
	 }.bind(this),
    false);

Кто знает, в чём конкретно может быть проблема? При попытках вызова сервиса (когда у метода всего 1 параметр) не возникает никаких проблем.

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

Нравится

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

Максим Шевченко пишет:

https://stackoverflow.com/questions/7999634/parsing-a-stream-and-a-para

 Хм, повторюсь. Я брал пример с исходников. Если там всё работает исправно то и в моем случае должно отрабатывать как часы. Тип роли не играет. Хоть 3 стринга там указать всё равно будет 500 ошибка.

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

ну, вот в данном случае как раз играет, поскольку в итоге получается WCF сервис, который имеет несколько другие нотации... тут Вам либо получать сырой поток данных и потом самому парсить, либо использовать какие-то простые типы данных для передачи в сервис... например, кодировать контент файла в BASE64 и вставлять в качестве параметра как string...

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

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

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

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

Запреты должны быть связаны со стандартными колонками Контакта DoNotUseEmail, DoNotUseCall и так далее. Их тоже вывели на страницу:

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

Далее подключил синхронизацию по схеме: https://community.terrasoft.ru/questions/sinhronizacia-kolonok-kartocki…

В атрибуты ContactPageV2 добавил вызов метода syncEntityWithCommunicationDetail, переопределил ContactCommunicationDetail, где в initMasterDetailColumnMapping добавил новые типы:

//Запреты на использование
						{
							"CommunicationType": "105728d2-d097-4dea-94be-713cd9c6f38c",
							"MasterEntityColumn": "DoNotUseEmail"
						},
						{
							"CommunicationType": "b6e11e60-8ce5-46d7-a7e9-1a356d762263",
							"MasterEntityColumn": "DoNotUseCall"
						},
						{
							"CommunicationType": "476feae6-8162-4997-904e-447a6d916371",
							"MasterEntityColumn": "DoNotUseFax"
						},
						{
							"CommunicationType": "1dc8b3d6-1028-4524-b3d8-8e05663b3bb3",
							"MasterEntityColumn": "DoNotUseSms"
						},
						{
							"CommunicationType": "71b3e7ae-efaf-474e-a76a-82d13ef376b0",
							"MasterEntityColumn": "DoNotUseMail"
						},

Проблема 1:

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

Проблема 2 (возможно, проблема 1 следует из неё):

Синхронизация, даже если она работает,то  происходит не сразу. Чтобы изменения были видны, мне нужно сохранить страницу, выйти из неё и зайти заново.

Как правильно сделать синхронизацию для чекбоксов?

Нравится

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

В процессе изучения проблемы заметил, что id у пунктов из списка запретов (см. скриншот) меняются при каждой перезагрузке страницы, а в объектах BaseCommunication, ContactCommunication записей, как-то связанных с чекбоксами нет вовсе.

Добрый день, Денис.

Метод syncEntityWithCommunicationDetail не связан с кнопками "не использовать" на детали средства связи, поскольку работает с абсолютно другой коллекцией детали. Вам стоит смотреть в сторону создания своих сообщений sandbox для работы с методом doNotUseCommunication, который добавляет элемент в коллекцию RestrictionsCollection детали. Также обратите внимание на метод getRestrictionsItemConfig, который создает конфиг для каждой кнопки, связанной с запретом на использование.

>> Синхронизация, даже если она работает,то происходит не сразу

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

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

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

При создании нового контакта обычно вызывается мини-карточка. Сейчас при нажатии на кнопку "Добавить" на странице списка контактов сделан выбор между двумя типами контактов - клиентом и сотрудником (у разных типов контактов немного разные страницы). Однако мини-карточка вызывается только при создании контакта с типом Сотрудник, если выбран тип контакта Клиент, то открывается сразу страница контакта.

В базовой схеме раздела BaseSectionV2 есть функция addRecord, где есть проверка типа:

if (this.hasAddMiniPage(typeColumnValue)) {
						this.openAddMiniPage({
							entitySchemaName: this.entitySchemaName,
							valuePairs: this.getAddMiniPageDefaultValues(typeColumnValue)
						});
					} else {
						this.openCardInChain({
							schemaName: schemaName,
							operation: ConfigurationEnums.CardStateV2.ADD,
							moduleId: this.getChainCardModuleSandboxId(typeColumnValue),
							instanceConfig: {
								useSeparatedPageHeader: this.get("UseSeparatedPageHeader")
							}
						});
					}

typeColumnValue - это guid типа контакта.

Вопрос - где искать функцию hasAddMiniPage, или быть может где-то нужно добавить тип контакта в некий список?

Попробовал в переопределении ContactSectionV2 сделать так:

hasAddMiniPage: function(typeColumnValue){
				if ( (typeColumnValue == "00783ef6-f36b-1410-a883-16d83cab0980") || (typeColumnValue == "60733efc-f36b-1410-a883-16d83cab0980") ){
					return true;
				} else {
					this.callParent(arguments);
				}
			}

На странице списка контактов, конечно, работает, но в других местах есть и отдельные детали, привязанные к объекту Contact, поэтому очевидно, что это решает проблему лишь частично.

Нравится

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

Денис, добрый день!

Информация касательно использования миникартчоки хранится в базе данных в таблице SysModuleEdit. Если для страницы редактирования используется миникарточка, то в поле MiniPageSchemaUId указывается UId схемы миникарточки.

Также, рекомендую ознакомиться со статьей: https://academy.terrasoft.ru/documents/technic-sdk/7-11/sozdanie-mini-k…

Новак Руслан,

Руслан, спасибо, но есть ещё пара вопросов:

Нашёл в базе две записи:

Id:"a4f8a54f-2794-4eae-9ce4-4f8d66061a60"
MiniPageSchemaUId:"2741dd1e-7c35-432c-915a-9aa228eb057b"
PageCaption:"Сотрудник"
 
Id:"7b055f93-bb7e-463a-a6ce-24c2730f0f8e"
MiniPageSchemaUId:""
PageCaption:"Клиент"

Судя по MiniPageSchemaUId - это они. Запросом через batch query добавил такой же id "2741dd1e-7c35-432c-915a-9aa228eb057b" и в запись для клиента. Но миникарточка всё равно не показывается.

Где-то ещё нужно поправить?

Смородинов Денис,

возможно, после добавления Uid миникарточки в запись в таблице SysModuleEdit, требуется почистить кэш, перелогиниться, и, возможно еще и redis

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

Добрый день

Как изменить данные справочника с помощью CURL запроса ? Какая должна быть ссылка и поля ?

Например, для добавления контакта используется ссылка /0/ServiceModel/EntityDataService.svc/ContactCollection/ и массив с такими полями http://prntscr.com/gqa80f

Нравится

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

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

Посмотрите здесь:

https://academy.terrasoft.ru/documents/technic-sdk/7-8/rabota-s-obektami-bpmonline-po-protokolu-odata-s-ispolzovaniem-http-zaprosov

Пункт «Изменение существующего объекта», делается это по примерно тому же урл только с методом PUT и указанием какой именно записи через нужный guid. Справочники те же объекты, так что в ссылке будет имя объекта справочника + Collection как и с разделами.

/0/ServiceModel/EntityDataService.svc/ContactCollection

тут ContactCollection, а для справочников как ?

Бохонок Татьяна,

ну, если это, например, справочник по странам (т.е. объект базы - таблица Country), то коллекция будет CountryCollection...

если справочник по типам контрактов, то ContractTypeCollection...

и т.д.

Максим Цынгаев, 

Спасибо!)

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

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

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

На отдельной вкладке изменяю модуль-схему. Сохраняю. В эмуляторе жму синхронизация.Происходит синхронизация и перезапуск приложения-эмулятора. Проверяю изменения. И в это время вкладка с модулем-схемой сообщает о системной ошибке.

Сталкивались ли вы с таким поведением? Может это как то лечится?

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

Нравится

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

попробуйте очистить Redis и перезапустить application pool

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

Спасибо за предложения.

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