Добрый день.

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

- для ElasticSearch

- для компонентов глобального поиска

- для сервис массового поиска дублей.

Если с первыми двумя пунктами все понятно (разные серверы), то вот с сервисом массового поиска дублей не совсем понятно куда его устанавливать.  В мануалах информации не нашел.

Нравится

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

Добрый день

Столкнулся с точно такой же ситуацией. В мануалах очень плохо описаны такие тонкости. Более есть еще и ошибки - будьте внимательны при настройке сервисов глобального поиска и дедупликации.

По серверам я сделал только 2 сервера. Creatio-ES - для ElasticSearch и Creatio-DD - для сервисов глобального поиска и дедупликации. Есть нюанс. Я выделил только 30 ГБ места на Creatio-DD и сегодня получил предупреждение что свободно только 20% места. Так что думаю лучше выделять больше свободного места.

Добрый день

Столкнулся с точно такой же ситуацией. В мануалах очень плохо описаны такие тонкости. Более есть еще и ошибки - будьте внимательны при настройке сервисов глобального поиска и дедупликации.

По серверам я сделал только 2 сервера. Creatio-ES - для ElasticSearch и Creatio-DD - для сервисов глобального поиска и дедупликации. Есть нюанс. Я выделил только 30 ГБ места на Creatio-DD и сегодня получил предупреждение что свободно только 20% места. Так что думаю лучше выделять больше свободного места.

Поиск дублей ставится на любой сервер, он не связан с другими сервисами.

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

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

 

Подскажите есть ли возможность сохранять реестр для нескольких культур разом?

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

Нравится

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

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

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



Уже зарегистрировано пожелание на отдел разработки для рассмотрения реализации функциональности настроек колонок для всех культур. 

 

при сохранении настройки колонки идёт обращение к сервису /0/DataService/json/SyncReply/UserProfile, там передаётся в поле profileCultureId ссылка на Id конкретной культуры:

{
   "key":"AccountSectionV2GridSettingsGridDataView",
   "data":"{\"tiledColumnsConfig\":\"{}\",\"listedColumnsConfig\":\"{}\",\"DataGrid\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":2,\\\"columns\\\":24},\\\"items\\\":[{\\\"column\\\":0,\\\"caption\\\":\\\"Название\\\",\\\"metaPath\\\":\\\"Name\\\",\\\"isTitleText\\\":true,\\\"width\\\":8,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Name\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":8,\\\"row\\\":1},\\\"isCaptionHidden\\\":true,\\\"isURLType\\\":false,\\\"columnType\\\":\\\"title\\\",\\\"captionConfig\\\":{\\\"visible\\\":false},\\\"type\\\":\\\"title\\\"},{\\\"column\\\":8,\\\"caption\\\":\\\"Web\\\",\\\"metaPath\\\":\\\"Web\\\",\\\"isTitleText\\\":false,\\\"width\\\":6,\\\"bindTo\\\":\\\"Web\\\",\\\"position\\\":{\\\"column\\\":8,\\\"colSpan\\\":6,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":14,\\\"caption\\\":\\\"Основной телефон\\\",\\\"metaPath\\\":\\\"Phone\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Phone\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":19,\\\"caption\\\":\\\"Тип\\\",\\\"metaPath\\\":\\\"Type\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Type\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":0,\\\"caption\\\":\\\"Основной контакт\\\",\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"isTitleText\\\":false,\\\"width\\\":8,\\\"dataValueType\\\":10,\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":8,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"columnType\\\":\\\"text\\\",\\\"captionConfig\\\":{\\\"visible\\\":true},\\\"type\\\":\\\"text\\\"},{\\\"column\\\":8,\\\"caption\\\":\\\"Адрес\\\",\\\"metaPath\\\":\\\"Address\\\",\\\"isTitleText\\\":false,\\\"width\\\":6,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Address\\\",\\\"position\\\":{\\\"column\\\":8,\\\"colSpan\\\":6,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":14,\\\"caption\\\":\\\"Город\\\",\\\"metaPath\\\":\\\"City\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"City\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":19,\\\"caption\\\":\\\"Страна\\\",\\\"metaPath\\\":\\\"Country\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Country\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[{\\\"column\\\":0,\\\"caption\\\":\\\"Название\\\",\\\"metaPath\\\":\\\"Name\\\",\\\"isTitleText\\\":false,\\\"width\\\":9,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Name\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":9,\\\"row\\\":1},\\\"columnType\\\":\\\"text\\\",\\\"isURLType\\\":false,\\\"type\\\":\\\"text\\\"},{\\\"column\\\":9,\\\"caption\\\":\\\"Тип\\\",\\\"metaPath\\\":\\\"Type\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"Type\\\",\\\"position\\\":{\\\"column\\\":9,\\\"colSpan\\\":5,\\\"row\\\":1}},{\\\"column\\\":14,\\\"caption\\\":\\\"Основной телефон\\\",\\\"metaPath\\\":\\\"Phone\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"Phone\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":1}},{\\\"column\\\":19,\\\"caption\\\":\\\"Основной контакт\\\",\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":1}}]}\",\"isTiled\":true,\"type\":\"tiled\",\"key\":\"AccountSectionV2GridSettingsGridDataView\"},\"DataGridVerticalProfile\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":5,\\\"columns\\\":24},\\\"items\\\":[{\\\"bindTo\\\":\\\"Name\\\",\\\"caption\\\":\\\"Название\\\",\\\"type\\\":\\\"title\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":1},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Name\\\",\\\"captionConfig\\\":{\\\"visible\\\":false}},{\\\"bindTo\\\":\\\"Type\\\",\\\"caption\\\":\\\"Тип\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":2},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"Type\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"caption\\\":\\\"Основной контакт\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":3},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Phone\\\",\\\"caption\\\":\\\"Основной телефон\\\",\\\"type\\\":\\\"text\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":4},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Phone\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[]}\",\"key\":\"AccountSectionV2GridSettingsGridDataView\",\"isTiled\":true,\"type\":\"tiled\"},\"key\":\"AccountSectionV2GridSettingsGridDataView\",\"Filters\":{},\"isTiled\":true,\"MobileDataGrid\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":7,\\\"columns\\\":24},\\\"items\\\":[{\\\"bindTo\\\":\\\"City\\\",\\\"caption\\\":\\\"Город\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":1},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"City\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Web\\\",\\\"caption\\\":\\\"Web\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":2},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Web\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Address\\\",\\\"caption\\\":\\\"Адрес\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":3},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Address\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"ModifiedBy\\\",\\\"caption\\\":\\\"Изменил\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":4},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"ModifiedBy\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"AlternativeName\\\",\\\"caption\\\":\\\"Альтернативные названия\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":5},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"AlternativeName\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"AdditionalPhone\\\",\\\"caption\\\":\\\"Дополнительный телефон\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":6},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"AdditionalPhone\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"City\\\",\\\"caption\\\":\\\"Город\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":7},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"City\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[]}\",\"isTiled\":true,\"type\":\"tiled\"},\"profileCultureId\":\"1a778e3f-0a8e-e111-84a3-00155d054c03\"}",
   "isDef":false
}

Настройка задаётся для себя с isDef =  false или для всех с isDef =  true.

Стандартно для отправки настроек в другой культуре функции нет, нужно делать доработку: либо отправлять ещё один запрос к сервису с указанием другой культуры и того же значения key, либо менять (или добавлять, если нет) в базе значения в таблице SysProfileData, отфильтровав там по Key и SysCultureId.

Сами настройки хранятся в поле ObjectData, его значение можно увидеть, написав в SQL-запросе «cast(ObjectData as varchar(max))».

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

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

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



Уже зарегистрировано пожелание на отдел разработки для рассмотрения реализации функциональности настроек колонок для всех культур. 

 

при сохранении настройки колонки идёт обращение к сервису /0/DataService/json/SyncReply/UserProfile, там передаётся в поле profileCultureId ссылка на Id конкретной культуры:

{
   "key":"AccountSectionV2GridSettingsGridDataView",
   "data":"{\"tiledColumnsConfig\":\"{}\",\"listedColumnsConfig\":\"{}\",\"DataGrid\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":2,\\\"columns\\\":24},\\\"items\\\":[{\\\"column\\\":0,\\\"caption\\\":\\\"Название\\\",\\\"metaPath\\\":\\\"Name\\\",\\\"isTitleText\\\":true,\\\"width\\\":8,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Name\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":8,\\\"row\\\":1},\\\"isCaptionHidden\\\":true,\\\"isURLType\\\":false,\\\"columnType\\\":\\\"title\\\",\\\"captionConfig\\\":{\\\"visible\\\":false},\\\"type\\\":\\\"title\\\"},{\\\"column\\\":8,\\\"caption\\\":\\\"Web\\\",\\\"metaPath\\\":\\\"Web\\\",\\\"isTitleText\\\":false,\\\"width\\\":6,\\\"bindTo\\\":\\\"Web\\\",\\\"position\\\":{\\\"column\\\":8,\\\"colSpan\\\":6,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":14,\\\"caption\\\":\\\"Основной телефон\\\",\\\"metaPath\\\":\\\"Phone\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Phone\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":19,\\\"caption\\\":\\\"Тип\\\",\\\"metaPath\\\":\\\"Type\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Type\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":1},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":0,\\\"caption\\\":\\\"Основной контакт\\\",\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"isTitleText\\\":false,\\\"width\\\":8,\\\"dataValueType\\\":10,\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":8,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"columnType\\\":\\\"text\\\",\\\"captionConfig\\\":{\\\"visible\\\":true},\\\"type\\\":\\\"text\\\"},{\\\"column\\\":8,\\\"caption\\\":\\\"Адрес\\\",\\\"metaPath\\\":\\\"Address\\\",\\\"isTitleText\\\":false,\\\"width\\\":6,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Address\\\",\\\"position\\\":{\\\"column\\\":8,\\\"colSpan\\\":6,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":14,\\\"caption\\\":\\\"Город\\\",\\\"metaPath\\\":\\\"City\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"City\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"column\\\":19,\\\"caption\\\":\\\"Страна\\\",\\\"metaPath\\\":\\\"Country\\\",\\\"isTitleText\\\":false,\\\"width\\\":5,\\\"bindTo\\\":\\\"Country\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":2},\\\"isCaptionHidden\\\":false,\\\"isURLType\\\":false,\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[{\\\"column\\\":0,\\\"caption\\\":\\\"Название\\\",\\\"metaPath\\\":\\\"Name\\\",\\\"isTitleText\\\":false,\\\"width\\\":9,\\\"dataValueType\\\":1,\\\"bindTo\\\":\\\"Name\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":9,\\\"row\\\":1},\\\"columnType\\\":\\\"text\\\",\\\"isURLType\\\":false,\\\"type\\\":\\\"text\\\"},{\\\"column\\\":9,\\\"caption\\\":\\\"Тип\\\",\\\"metaPath\\\":\\\"Type\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"Type\\\",\\\"position\\\":{\\\"column\\\":9,\\\"colSpan\\\":5,\\\"row\\\":1}},{\\\"column\\\":14,\\\"caption\\\":\\\"Основной телефон\\\",\\\"metaPath\\\":\\\"Phone\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"Phone\\\",\\\"position\\\":{\\\"column\\\":14,\\\"colSpan\\\":5,\\\"row\\\":1}},{\\\"column\\\":19,\\\"caption\\\":\\\"Основной контакт\\\",\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"width\\\":5,\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"position\\\":{\\\"column\\\":19,\\\"colSpan\\\":5,\\\"row\\\":1}}]}\",\"isTiled\":true,\"type\":\"tiled\",\"key\":\"AccountSectionV2GridSettingsGridDataView\"},\"DataGridVerticalProfile\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":5,\\\"columns\\\":24},\\\"items\\\":[{\\\"bindTo\\\":\\\"Name\\\",\\\"caption\\\":\\\"Название\\\",\\\"type\\\":\\\"title\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":1},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Name\\\",\\\"captionConfig\\\":{\\\"visible\\\":false}},{\\\"bindTo\\\":\\\"Type\\\",\\\"caption\\\":\\\"Тип\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":2},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"Type\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"PrimaryContact\\\",\\\"caption\\\":\\\"Основной контакт\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":3},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"PrimaryContact\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Phone\\\",\\\"caption\\\":\\\"Основной телефон\\\",\\\"type\\\":\\\"text\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":4},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Phone\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[]}\",\"key\":\"AccountSectionV2GridSettingsGridDataView\",\"isTiled\":true,\"type\":\"tiled\"},\"key\":\"AccountSectionV2GridSettingsGridDataView\",\"Filters\":{},\"isTiled\":true,\"MobileDataGrid\":{\"tiledConfig\":\"{\\\"grid\\\":{\\\"rows\\\":7,\\\"columns\\\":24},\\\"items\\\":[{\\\"bindTo\\\":\\\"City\\\",\\\"caption\\\":\\\"Город\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":1},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"City\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Web\\\",\\\"caption\\\":\\\"Web\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":2},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Web\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"Address\\\",\\\"caption\\\":\\\"Адрес\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":3},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"Address\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"ModifiedBy\\\",\\\"caption\\\":\\\"Изменил\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":4},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"ModifiedBy\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"AlternativeName\\\",\\\"caption\\\":\\\"Альтернативные названия\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":5},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"AlternativeName\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"AdditionalPhone\\\",\\\"caption\\\":\\\"Дополнительный телефон\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":6},\\\"dataValueType\\\":1,\\\"metaPath\\\":\\\"AdditionalPhone\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}},{\\\"bindTo\\\":\\\"City\\\",\\\"caption\\\":\\\"Город\\\",\\\"position\\\":{\\\"column\\\":0,\\\"colSpan\\\":24,\\\"row\\\":7},\\\"dataValueType\\\":10,\\\"metaPath\\\":\\\"City\\\",\\\"captionConfig\\\":{\\\"visible\\\":true}}]}\",\"listedConfig\":\"{\\\"items\\\":[]}\",\"isTiled\":true,\"type\":\"tiled\"},\"profileCultureId\":\"1a778e3f-0a8e-e111-84a3-00155d054c03\"}",
   "isDef":false
}

Настройка задаётся для себя с isDef =  false или для всех с isDef =  true.

Стандартно для отправки настроек в другой культуре функции нет, нужно делать доработку: либо отправлять ещё один запрос к сервису с указанием другой культуры и того же значения key, либо менять (или добавлять, если нет) в базе значения в таблице SysProfileData, отфильтровав там по Key и SysCultureId.

Сами настройки хранятся в поле ObjectData, его значение можно увидеть, написав в SQL-запросе «cast(ObjectData as varchar(max))».

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

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

Спасибо

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

Добрый день, коллеги подскажите пожалуйста как по ролям настраивается коммуникационная панель? перестали запускать процессы по нажатию на кнопки, запускаются только под Supervisor подскажите куда капать пробовал выставлять роль системного администратора процессы так же не запускаются. Остальные бизнес процессы запускаются  

Нравится

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

Дмитрий, не очень понятно, Вы что-то настраивали в правах и после этого перестало? О каких именно процессах и кнопках речь? Что-то при нажатии пишется в консоли браузера?

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

Руководствуясь постом https://community.terrasoft.ru/articles/kak-skryt-knopku-zapustit-process#comment-81452 пробую убрать кнопку. Но учитывая что в посте только указано как теоретически это должно работать, с примером замещения модуля не имеющего отношения к теме, решил сделать сам, но видимо что-то не учел.

Создал модуль с именем "KtLeftPanelTopMenuModule" который замещает "Terrasoft.LeftPanelTopMenuModuleViewModel" в котором собираются пункты меню

define("KtLeftPanelTopMenuModule", ["LeftPanelTopMenuModule"],
	function() {
		Ext.define("Terrasoft.configuration.KtLeftPanelTopMenuModuleViewModel", {
			alternateClassName: "Terrasoft.KtLeftPanelTopMenuModuleViewModel",
			override: "Terrasoft.LeftPanelTopMenuModuleViewModel",
 
			getTopMenuConfig: function() {
				var esq = this.callParent(arguments);
				var index = esq.menuConfig.map(function(e) { return e.id; }).indexOf("menu-startprocess-button");
				if (index > -1) {
					esq.menuConfig.splice(index, 1);
				}
				return esq;
			}
		});
	}
);

И BootstrapModulesV2

define("BootstrapModulesV2", ["KtLeftPanelTopMenuModule"], function() {
	return {};
});

Но при загрузки страницы BootstrapModulesV2 не видел мой модуль KtLeftPanelTopMenuModule

Нравится

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

Александр, именно не загрузилось, не заходит в функцию этого модуля? Может, просто требуется перелогин или заход из браузера в анонимном режиме?

Александр, именно не загрузилось, не заходит в функцию этого модуля? Может, просто требуется перелогин или заход из браузера в анонимном режиме?

Спасибо. Видимо Redis не почистил)))

Нашел ответ что лучше чем убрать кнопку. Так как запустить процесс можно как минимум тремя способами если ты просто пользователь (через кнопку "Запустить процесс", через три полоски и там "Запустить процесс", и через окно поиска набрав "Запустить процесс <название процесса>"), то убрать кнопку не достаточно. Покопавшись глубже, понял что в списке что открывается находятся процессы с тегом "Buisness process", состоянием "Активен" и в текущем пространстве, то как вывод - если не хочешь что бы активные процессы попадали в список, то подписывай теги как угодно но только не "Buisness process", и все решение. Стандартные если не нужны, то или делать не активными, или создать новую версию у себя в пакете и изменить тег.

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

При попытке запустить код C# получаем ошибку "ВОЗНИКЛА ОШИБКА: The type or namespace name 'TsiDevIRunable' does not exist in the namespace 'Terrasoft.Configuration' (are you missing an assembly reference?)

   at Terrasoft.Configuration.TsiDevScriptEngine.Compile(String source, String[] assemblies)

   at Terrasoft.Configuration.TsiDevDynamicCodeExecutor.Execute(String csCode)

   at Terrasoft.Configuration.TsiDevESQDebugService.GetSQLFromCSharp(String sourceCode, Boolean onlySQL)"

 

Версия: 7.16.4 SalesEnterprise_Marketing_ServiceEnterprise Oracle ENU

Нравится

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

Добрый Александр.

Могли бы вы прислать код, который вы запускаете для выполнения?

Дарья Ткач,

 Стандартный код что идет при входе в утилиту

#region usings and class definition
using System;
using Terrasoft.Configuration;
using Terrasoft.Core;
using Terrasoft.Core.DB;
using Terrasoft.Core.Entities;
 
 
// Название namespace, class и метода Run менять нельзя
namespace TsiDevTemp.ScriptCode {
 
	public class ScriptClass: Terrasoft.Configuration.TsiDevIRunable {
#endregion
		/// &lt;summary&gt; Выполнение кода &lt;/summary&gt;
		/// &lt;returns&gt; Должен возвращать текст SQL запроса&lt;/returns&gt;
		public string Run(UserConnection userConnection) {
			var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Contact") {
				RowCount = 10
			};
			esq.AddColumn("Id");
			esq.AddColumn("Name");
 
			var select = esq.GetSelectQuery(userConnection);
			select.BuildParametersAsValue = true;
			return select.GetSqlText();
		}
 
	}
 
}

 

А вообще хотел запустить

Query selectQuery = new Select(UserConnection).Top(numberCountForNumberPool)
	.Column(Column.Parameter(request)).Column(Column.Parameter(currentUserContactId))
	.Column(Column.Parameter(currentUserContactId))
	.Column("KtSimManagementInitialPoolNumbers", "KtIccid")
	.Column("KtSimManagementInitialPoolNumbers", "KtImsi")
	.Column("KtSimManagementInitialPoolNumbers", "KtMsisdn")
	.Column("KtSimManagementInitialPoolNumbers", "KtName")
	.Column(Column.Parameter(cityAndCountNumbersEntity.GetTypedColumnValue&lt;Guid&gt;(city.Name)))
	.Column(Column.Parameter(cityAndCountNumbersEntity.GetTypedColumnValue&lt;string&gt;(note.Name)))
	.Column(Column.Parameter(DateTime.UtcNow.Date))
	.Column(Column.Parameter(DateTime.UtcNow.Date
		.AddDays((int)Core.Configuration.SysSettings.GetValue(UserConnection,
			"DayCountForDedicatedPoolNumbers") + 1).AddSeconds(-1)))
	.From("KtSimManagementInitialPoolNumbers")
	.OrderByAsc("KtSimManagementInitialPoolNumbers", "KtName")
	.Join(JoinType.LeftOuter, "KtJasperFullNumberPool")
	.On("KtSimManagementInitialPoolNumbers", "KtName")
	.IsEqual("KtJasperFullNumberPool", "KtName")
	.Where("KtJasperFullNumberPool", "KtName")
	.IsNull()
	.And("KtSimManagementInitialPoolNumbers", "KtMarketCodeId")
	.IsEqual(Column.Parameter(cityForMarketCode));
	logger.Info("selectQuery: " + selectQuery.GetSqlText());
InsertSelect insertSelectQuery = new InsertSelect(UserConnection)
	.Into("KtJasperFullNumberPool")
	.Set("KtRequestId", "ModifiedById", "CreatedById", "KtIccid", "KtImsi", "KtMsisdn", "KtName", "KtCityId", "KtNote", "KtReserveDate", "KtReserveToDate")
	.FromSelect(selectQuery);
logger.Info("insertSelectQuery: " + insertSelectQuery.GetSqlText());

 

Александр Тыра,

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

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

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

Введется разработка в пользовательском пакете, нужно добавить текстовое поле в замещающий объект Файл таким образом, что бы другие объекты, такие как AccountFile, ContactFile, тоже унаследовались от моего объекта Файл и имели в себе новое текстовое поле.

Насколько я понял решение состоит в настройке зависимости пакетов, но не до конца понимаю как должна выставляться иерархия. В настройках пакета стоит зависимость от Base

Нравится

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

Илья, это разные явления,  замещение в разных пакетах схемы с одним и тем же именем и наследование (в одном или разных пакетах) одних схем от других с разными именами (например, ContactFile на основе базового File).

 

Если бы и базовая, и наследуемая схема были бы в одном пакете, после добавления поля в File было бы достаточно пересохранить AccountFile. Но у Вас схема есть только в коробочном пакете, её менять не получится.

 

Видимо, Вам нужно заместить File в пакете Custom (или другом, где разрабатываете), добавить поле, сохранить и опубликовать. Затем в том же пакете Custom заместить уже AccountFile, ContactFile, где появится и новая колонка, тоже сохранить и опубликовать, чтобы новая колонка создалась в БД.

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

Можно ли ограничить определенным ролям возможность экспорта данных в excel?

 

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

 

Позволяет ли Creatio такое, если да, то какие параметры в организации ролей за это отвечают? 

Нравится

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

Добрый день.

Да, это можно сделать через доступ на системную операцию [Экспорт реестра]. Ознакомиться с информацией о настройках прав доступа на системные операции Вы можете по этой ссылке.

Добрый день.

Да, это можно сделать через доступ на системную операцию [Экспорт реестра]. Ознакомиться с информацией о настройках прав доступа на системные операции Вы можете по этой ссылке.

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

Добрый день. Появилась задача добавить кнопку, аналогичную кнопке "Обработать" в почте. 

 

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

 

Пример кода, который получился:

generateEmailButtonsContainerConfig: function() {
	var buttonItems = [];
	var processEmailButtonConfig = this.generateEmailProcessedButtonConfig();
	buttonItems.push(processEmailButtonConfig);
	/** Добавляем новую кнопку */
	var skipEmailButtonConfig = this.generateSkipEmailButtonConfig();
	buttonItems.push(skipEmailButtonConfig);
	var deleteEmailButtonConfig = this.generateDeleteEmailButtonConfig();
	buttonItems.push(deleteEmailButtonConfig);
	var emailButtonContainerConfig = {
		"className": "Terrasoft.Container",
		"classes": {"wrapClassName": ["entity-item-relation-container"]},
		"items": buttonItems
	};
	return emailButtonContainerConfig;
},
/** НОВАЯ КНОПКА */
generateSkipEmailButtonConfig: function() {
	return {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.RED,
		"caption": "SKIP",
		"click": {bindTo: "onSkipEmail"},
		"markerValue": "skipingEmail"
	};
},
/** Метод обработчик кнопки*/
onSkipEmail: function (model) {
	window.console.log("It's working");
}

Но при нажатии на кнопку - появляется ошибка:

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

Возможно надо использоваться что-то похожее на fireEvent, но за все время не было необходимости в подобном функционале - поэтому плохо понимаю как и что делать. Вроде в этой статье https://community.terrasoft.ru/articles/kak-sozdat-polzovatelskii-eleme… о чем-то, что мне поможет, говорится. Но без понимая как это все устроено - это какое-то гадание на кофейной гуще.

 

Конечно, для решения моей задачи есть варианты и попроще, но менее изящные. Просто очень хочется разобраться и сделать именно первоначальную задумку:

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

 

Может кто-то реализовывал мой кейс или нечто подобное и сможет поделиться советом?

Нравится

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

Сергей, насколько понимаю, Вы пытаетесь сделать как для зелёной кнопки EmailProcessedButton, которая описана в CommunicationPanelEmailSchema:

/**
 * Creates email message action buttons container config.
 * @protected
 * @return {Object} Email message action buttons container config.
 */
generateEmailButtonsContainerConfig: function() {
	var buttonItems = [];
	var processEmailButtonConfig = this.generateEmailProcessedButtonConfig();
	buttonItems.push(processEmailButtonConfig);
	var deleteEmailButtonConfig = this.generateDeleteEmailButtonConfig();
	buttonItems.push(deleteEmailButtonConfig);
	var emailButtonContainerConfig = {
		"className": "Terrasoft.Container",
		"classes": {"wrapClassName": ["entity-item-relation-container"]},
		"items": buttonItems
	};
	return emailButtonContainerConfig;
},
 
/**
 * Creates "process message" button config.
 * @protected
 * @return {Object} "Process message" button config.
 */
generateEmailProcessedButtonConfig: function() {
	return {
		"className": "Terrasoft.Button",
		"caption": {"bindTo": "Resources.Strings.MarkAsProcessed"},
		"style": Terrasoft.controls.ButtonEnums.style.GREEN,
		"imageConfig": {"bindTo": "Resources.Images.ApplyButtonImage"},
		"enabled": {"bindTo": "IsProcessingButtonEnabled"},
		"visible": {
			"bindTo": "IsNeedProcess",
			"bindConfig": {
				"converter": "getProcessButtonVisible"
			}
		},
		"click": {bindTo: "setIsNeedProcessFalse"},
		"markerValue": "setNeedProcessFalse"
	};
},

Но там обработчик setIsNeedProcessFalse в EmailItemSchema не просто одна функция, а несколько в цепочке, одна вызывает другие:

/**
 * Sets and saves IsNeedProcess value for message.
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
setIsNeedProcessFalse: function(callback, scope) {
	this.set("IsProcessingButtonEnabled", false);
	var chain = [];
	chain.push(this.updateIsNeedProcess);
	chain.push(this._onSetIsNeedProcessFalse, function() {
		this.Ext.callback(callback, scope);
	});
 
	this.set("IsNeedProcess", false);
	this.Terrasoft.chain.apply(this, chain);
},
...
/**
 * Updates IsNeedProcess value for current user EmailMessageData instances.
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
updateIsNeedProcess: function(callback, scope) {
	var update = this.getIsNeedProcessUpdate();
	if (this.Ext.isEmpty(update)) {
		this.Ext.callback(callback, scope);
		return;
	}
	update.execute(function() {
		this.Ext.callback(callback, scope);
	}, this);
},
...
/**
 * Handle response of save entity request.
 * @private
 * @param {Object} [response] Response of save entity request.
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
_handleSaveRequestResponse: function(response, callback, scope) {
	if (response &amp;&amp; response.success) {
		this.fireEvent("entitySaved", this);
		this.set("CurrentColumnValue", null);
	}
	this.Ext.callback(callback, scope);
},
/**
 * Set IsNeedProcess to false.
 * @private
 * @param {Function} [callback] Callback function.
 * @param {Object} [scope] Callback function scope.
 */
_onSetIsNeedProcessFalse: function(callback, scope) {
	this.saveEntity(function(response) {
		this._handleSaveRequestResponse(response, callback, scope);
	}, this);
},

Если ругается на .apply, видимо, ожидает для Вашей кнопки аналогичной логики. Хотя, там же рядом справа DeleteEmailButton, там без этого всего:

/**
 * Creates "delete" button config.
 * @protected
 * @return {Object} "Delete" button config.
 */
generateDeleteEmailButtonConfig: function() {
	return {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		"imageConfig": {"bindTo": "Resources.Images.DeleteEmailButtonImage"},
		"click": {bindTo: "onDeleteEmail"},
		"markerValue": "deleteEmail"
	};
},
...
/**
 * Removes email message from emails collection.
 * @param {Terrasoft.BaseViewModel} model Email message model instance.
 */
onDeleteEmail: function(model) {
	this.unsubscribeModelEvents(model);
	var collection = this.get("EmailCollection");
	collection.remove(model);
},

Не сравнивали в отладке Вашу кнопку с кнопкой удаления?

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

Сегодня заметил, что вся логика на самом деле в другой схеме - попробую туда вписать мой метод-обработчик. Может кнопка просто не может найти нужный метод и валится в ошибку. Пока я понял что работает так - EmailItemSchema "втягивает" в себя кнопки и обрабатывает методы у себя и после уже дополняет методами из 

CommunicationPanelEmailSchema. Проверю свою догадку и отпишусь о происходящем. Просто изначально не заметил эту привязку. Даже не осознал до конца как я натолкнулся на нее. Но теперь уже немного понятно куда идти

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

Если просто Вашу функцию onSkipEmail перенести в EmailItemSchema, то всё работает, пишет в консоли «It's working».

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

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

CommunicationPanelEmailSchema (потому что надо было работать с коллекцией писем, не был уверен что смогу это провернуть в EmailItemSchema)

 

Если кому-то поможет - полученный код ниже

 

EmailItemSchema:

messages: {
	"MessageSkipEmail": {
		mode: Terrasoft.MessageMode.BROADCAST,
		direction: Terrasoft.MessageDirectionType.BIDIRECTIONAL
	}
},
methods: {
	/**
	 * Initializes starter values.
	 * @protected
	 * @overridden
	 */
	init: function () {
		this.callParent(arguments);
		// Регистрация сообщения.
		this.sandbox.registerMessages(this.messages);
	},
	onSkipEmail: function() {
		// Регистрация сообщения.
		var EmailId = this.get("Id");
		this.sandbox.publish("MessageSkipEmail", {Id: EmailId}, ["EmailItemSchema"]);
	}
},

CommunicationPanelEmailSchema

messages: {
	"MessageSkipEmail": {
		mode: Terrasoft.MessageMode.BROADCAST,
		direction: Terrasoft.MessageDirectionType.BIDIRECTIONAL
	}
},
methods: {
	init: function () {
		this.callParent(arguments);
		// Регистрация сообщения.
		Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onMyBpFinish, this);
		this.sandbox.subscribe("MessageSkipEmail", function(args) { this.skipingEmail(args.Id);},
			this, ["EmailItemSchema"]);
	},
	skipingEmail: function(EmailId) {
		var collection = this.get("EmailCollection");
		var foundItem = collection.collection.items.find(item =&gt; item.id === EmailId);
		var args = {
		// Имя процесса, который необходимо запустить.
			sysProcessName: "UsrSkipEmail",
		// Объект со значением входящего параметра ContactParameter для процесса CustomProcess.
			parameters: {
				ID: EmailId
			}
		};
				// Запуск пользовательского бизнес-процесса.
		ProcessModuleUtilities.executeProcess(args);
		collection.remove(foundItem); /** Выкидываем уже обработанное письмо из списка*/
	},
	generateEmailButtonsContainerConfig: function() {
		var buttonItems = [];
		var processEmailButtonConfig = this.generateEmailProcessedButtonConfig();
		buttonItems.push(processEmailButtonConfig);
		/** Добавляем новую кнопку */
		var skipEmailButtonConfig = this.generateSkipEmailButtonConfig();
		buttonItems.push(skipEmailButtonConfig);
		var deleteEmailButtonConfig = this.generateDeleteEmailButtonConfig();
		buttonItems.push(deleteEmailButtonConfig);
		var emailButtonContainerConfig = {
			"className": "Terrasoft.Container",
			"classes": {"wrapClassName": ["entity-item-relation-container"]},
			"items": buttonItems
		};
		return emailButtonContainerConfig;
	},
	/** НОВАЯ КНОПКА */
	generateSkipEmailButtonConfig: function() {
		return {
			"className": "Terrasoft.Button",
			//"style": 
			"caption": "Игнорировать",
			"click": {bindTo: "onSkipEmail"},
			"markerValue": "skipingEmail",
			"enabled": {"bindTo": "IsProcessingButtonEnabled"},
			"visible": {
				"bindTo": "IsNeedProcess",
				"bindConfig": {
					"converter": "getProcessButtonVisible"
				}
			},
		};
	},

А в самом БП происходит магия изменения БД, чтобы не запустились скрытые процессы, привязанные к "IsNeedProcess" в EmailMessageData

 

Вроде теперь все работает как надо, но надо провести обильное тестирование на большом количестве писем. А то письма после обработки все равно привязывались к обращениям и переоткрывали их. Теперь такие письма можно пропускать.

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

Добрый день, подскажите в чем может быть проблема есть БП в котором открываются кастомные страницы по нажатию на кнопки, через раз стопорится на элементе ПРИВЯЗАТЬ ПРОЦЕСС К ОБЪЕКТУ в журнале пишет что выполняется на диаграмме показывает что остановился на этом элементе при это переход по страницам не происходит вечный спинер и в консоли ошибка :

Uncaught TypeError: Cannot set property 'showNextPrcEl' of undefined

Нравится

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

На привязке стопорится, если Id, который привязывается, не определён. 

На привязке стопорится, если Id, который привязывается, не определён. 

Дмитрий, слишком мало информации, чтобы сходу назвать причину. Для начала, проверьте, дело в элементе привязки или в визуальных с окнами и кнопками, разнеся их отдельно. Возможно, действительно, как пишет Владимир, некорректно передаётся Id в элемент привязки.

 

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

if (EntitySchemaId == Guid.Empty || EntityId == Guid.Empty) {
	return false;
}
Guid sysSchemaId;
var entitySchemaIdParameter = new QueryParameter(EntitySchemaId);
var sysSchemaViewSelect = new Select(UserConnection).
		Top(1).
		Column("UId").
	From("VwSysSchemaInWorkspace").
	Where("Id").IsEqual(entitySchemaIdParameter).
	Or("UId").IsEqual(entitySchemaIdParameter) as Select;
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
	using (var reader = sysSchemaViewSelect.ExecuteReader(dbExecutor)) {
		while (reader.Read()) {
			sysSchemaId = UserConnection.DBTypeConverter.DBValueToGuid(reader[0]);
			UserConnection.IProcessEngine.LinkProcessToEntity(Owner, sysSchemaId, EntityId);
		}
	}
}
return true;

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

 

Можно попробовать отладиться или добавить в код действия логирование, чтобы выяснить, доходит ли вообще до вызова LinkProcessToEntity.

 

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

Владимир Соколов,

спасибо за подсказку буду проверять

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

Если в бизнес-правиле описать сравнение со статусом из справочника, то оно срабатывает.

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

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

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

Как победить такую ситуацию, если нужно полями управлять на разных стадиях (полей много, параметрами стадий должен управлять сам клиент)?

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

Нравится

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

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



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



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



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

A.Sorotiuk пишет:

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

Есть и такое правило, но тоже не срабатывает. Если посмотрите на screenshot, то по идее должны отобразится оба поля (и оба стать обязательными), так как стадия конечная. Однако, отображается и становится обязательным только то поле, для которого БП настроен по сравнению с конкретным значением справочника, а не с параметром

 

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

 

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

Последняя демка с сайта:



https://080799-crm-bundle.terrasoft.ua

support/support



В разделе "Продажи" настраивал для тестов



Причём, заметил ещё одну особенность:

Если перевести на стадию "завершена с проигрышем", то одно поле не отображается и не становится обязательным

А если потом открыть эту запись, то мы видим это обязательное поле.

Явно не срабатывает в момент перевода на новую стадию

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

Александр, прошу прощения. Сейчас выдал права

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

 

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

 

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

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