Привет,

При попытке компиляции функционала получил ошибку, видимую в веб интерфейсе конфигуратора, а именно: Не удалось привести тип объекта "Newtonsoft.Json.Linq.JObject" к типу "Newtonsoft.Json.Linq.JArray".

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

В логах искал, "C:\Windows\Temp\BPMonline\BPMOnline" - там нет ничего ,если искать, например Newtonsoft или JObject или JArray

Возможно логгирование можно включить? 

Нравится

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

Ошибка скорее всего из-за того, что хоть пакет и накатывается на 7.15, но разрабатывался он на более новой версии (7.16.3+).

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

У Вас именно версия 7.15? Было такое в 7.16.3, устранено в 7.16.4.

Проблема возникает из-за бага версии 7.16.3, в метаданных схемы некорректно генерируется встроенный бизнес-процесс объекта из-за чего возникает ошибка при парсинге.

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

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

Версия 7.15.2.501

Возможно, тоже при обновлении устранится. Или поможет обходной способ из сообщения выше.

Ошибка скорее всего из-за того, что хоть пакет и накатывается на 7.15, но разрабатывался он на более новой версии (7.16.3+).

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

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

Добрый день!

 

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

Если вставить просто макрос со ссылкой на многострочное поле, то шаблон не находит
и \n в тексте и считает, что переноса строк нет, хотя они и есть.

Возможно есть вариант заменять переносы строк на \n в рамках бизнес-процесса?

Нравится

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

   Отправка письма

 var emailSendService = new EmailSendService(context.UserConnection);

    

    var activityId = Guid.NewGuid();

    var insertActivity = new Terrasoft.Configuration.Activity(context.UserConnection);

    insertActivity.Id = activityId;

    insertActivity.SetDefColumnValues();

    insertActivity.Title = "Тема письма";

    insertActivity.Recepient = email;

    insertActivity.Sender = senderEmail;

    insertActivity.PriorityId = new Guid("D625A9FC-7EE6-DF11-971B-001D60E938C6");

    insertActivity.IsHtmlBody = true;

    insertActivity.Body = "<div>Тело письма</div>";

    insertActivity.TypeId = new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6");

    insertActivity.MessageTypeId = new Guid("7F6D3F94-F36B-1410-068C-20CF30B39373");

    insertActivity.Save();

    

    emailSendService.Send(activityId.ToString());

Нормально манипулировать текстом письма можно только используя C#. Делает ScriptTask в нем отправку письма на C# и собираете любое тело письма которое вам нужно.

Полозюков Евгений Петрович,

Спасибо! Подскажите, где можно подробнее прочитать про отправку письма по скрипту?

   Отправка письма

 var emailSendService = new EmailSendService(context.UserConnection);

    

    var activityId = Guid.NewGuid();

    var insertActivity = new Terrasoft.Configuration.Activity(context.UserConnection);

    insertActivity.Id = activityId;

    insertActivity.SetDefColumnValues();

    insertActivity.Title = "Тема письма";

    insertActivity.Recepient = email;

    insertActivity.Sender = senderEmail;

    insertActivity.PriorityId = new Guid("D625A9FC-7EE6-DF11-971B-001D60E938C6");

    insertActivity.IsHtmlBody = true;

    insertActivity.Body = "<div>Тело письма</div>";

    insertActivity.TypeId = new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6");

    insertActivity.MessageTypeId = new Guid("7F6D3F94-F36B-1410-068C-20CF30B39373");

    insertActivity.Save();

    

    emailSendService.Send(activityId.ToString());

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

Добрый день, имеется объект Product в пользовательском пакете. Он наследуется от Product (base). Также в пакете ProductCatalogue тоже содержится Product, у которого определён эвент на после сохранения. Подскажите, как можно переопределить этот эвент.

Нравится

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

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

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

Полозюков Евгений Петрович,

Дело в том, что Product из ProductCatalogue вносит нежелательную логику после сохранения продукта в пользовательском пакете. 

Пробовал переопределить OnSaved, но в данный метод поток даже не заходит.

    [EntityEventListener(SchemaName = "Product")]
    public class UsrProductEntityEventListener : BaseEntityEventListener
    {
        public override void OnSaved(object sender, EntityAfterEventArgs e)
        {
            var entity = (Entity)sender;
            var currencyColumn = entity.Schema.Columns.GetByName("Currency");
            var currencyId = entity.GetTypedColumnValue&lt;Guid&gt;(currencyColumn);
 
            if(currencyId == Guid.Empty)
                return;
 
            var taxColumn = entity.Schema.Columns.GetByName("Tax");
            var TaxId = entity.GetTypedColumnValue&lt;Guid&gt;(taxColumn);
 
            if(TaxId == Guid.Empty)
                return;
 
            base.OnSaved(sender, e);
        }
    }

 

Илья Белов,

Вы не можете переопределить логику которая в родителях продукта.

Полозюков Евгений Петрович,

Я понимаю, теперь я пытаюсь вызвать метод на событие ProductSaved.

Но в автогенерируемом файле, в методе ProcessQueue очередь всегда пустая и следовательно мой SetPrices никогда не выполнится. Однако, в Product из ProductCatalogue метод SetPrices вызывается. Я не очень понимаю, мой пакет не зависит от Product из ProductCatalogue, более того в моём пакете создан свой замещающий объект Product. Моя очередь событий в ProcessQueue пустая, а в Product из ProductCatalogue нет.

protected override bool ProcessQueue(ProcessExecutingContext context) {
	bool result = base.ProcessQueue(context);
	if (context.QueueTasks.Count == 0) {
		return result;
	}
	switch (context.QueueTasks.Peek()) {
		case "EventSubProcess1":
			context.QueueTasks.Dequeue();
			break;
		case "ProductSaved":
			context.QueueTasks.Dequeue();
			context.SenderName = "ProductSaved";
			result = ProductSaved.Execute(context);
			break;
		case "SetPrices":
			context.QueueTasks.Dequeue();
			context.SenderName = "SetPrices";
			result = SetPrices.Execute(context, SetPricesExecute);
			break;
	}
	if (!result &amp;&amp; context.QueueTasks.Count &gt; 0) {
		ProcessQueue(context);
	}
	return result;
}

 

Илья Белов,

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

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

Добрый день, проблема в том, что на каждый запрос к базе прикручивается left join таблицы Sys*Lcz. Отключение локализуемых строк в свойствах объекта отключало этот механизм. Есть ли возможность отключить локализуемые строки у объектов на уровне приложения? 

Нравится

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

Это не проблема это система так работает.

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

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

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

мы питаемся в Бизнес процесс добавить подпроцесс, и когда передает только значение Лида, все ок,

но в подпроцессе у нас есть параметр, текстовый, и на него вылетает ошибка:

"Значение не может быть неопределенным. Имя параметра: format"

Пробовали и заполнять этот параметр значением по умолчанию в подпроцессе, и передавать значение с процесса, 

если он присутствует всегда одна и та же ошибка.



Версия: 7.15.4.3055

Прикрепленные файлы

Нравится

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

Уточните, у Вас параметр назвается format или Name? Или это два разных параметра?

Здравствуйте, параметр называется - Name, с названием format у меня ничего нет.

Уверены, что дело именно в этом подпроцессе? Если запускать его из другого процесса, тоже такая ошибка?

Если переименовать Name как-то иначе, то тоже?

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

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

А в логи системы (стандартно в текстовом файле Error.log на веб-сервере) при этом что-то падает? В консоли браузера нет дополнительной информации в момент ошибки?

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

Добрый день, по клику на шапку колонки вызывается функция onClick в label.js, затем идёт проверка подписан ли объект на данный эвент через this.fireEvent("click", this). В Label.hasListener подписки на "click" нету и ничего не происходит. Пожалуйста подскажите, как забиндить метод на click и как передать нужные аргументы в этот метод.

 

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

/**
 * Rerenders grid header.
 * @protected
 */
reRenderGridHeader: function() {
	var captionContainer = this.Ext.getCmp("gridCaptionContainer");
	var columnsConfigs = this.getGridHeaderConfigs();
	captionContainer.items.clear();
	this.Terrasoft.each(columnsConfigs, function(columnConfig) {
		var label = this.Ext.create("Terrasoft.Label", columnConfig);
		captionContainer.items.add(columnConfig.id, label);
	}, this);
	captionContainer.reRender();
},
 
/**
 * Returns config on caption column.
 * @override
 * @param {Object} columnInfo
 * @param {String} columnInfo.name Column name.
 * @param {Number} columnInfo.colSpan Column size.
 * @param {String} columnInfo.caption Column caption.
 * @return {Object} Column control config.
 */
getCaptionControlConfig: function(columnInfo) {
	var className = "Label";
	var id = ["caption", this._formatColumnName(columnInfo.name), className.toLowerCase()].join("-");
	var config = {
		className: "Terrasoft." + className,
		id: id,
		selectors: {wrapEl: "#" + id},
		markerValue: columnInfo.name
	};
	config.caption = columnInfo.caption;
	config.classes = {
		labelClass: ["grid-cols-" + columnInfo.colSpan,
			"gridRow" + columnInfo.name + "LabelCaption"]
	};
	return config;
},

 

Нравится

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

Это вы сильно глубоко копаете в логику системы. Находите схему ChangeAdminRightsUserTaskPropertiesPage, там есть код(функция generateChangeAdminRightsItemViewConfig) который создаете label и вещает на его нажатие функцию.

Это вы сильно глубоко копаете в логику системы. Находите схему ChangeAdminRightsUserTaskPropertiesPage, там есть код(функция generateChangeAdminRightsItemViewConfig) который создаете label и вещает на его нажатие функцию.

Полозюков Евгений Петрович,

Здравствуйте, в generateChangeAdminRightsItemViewConfig я должен передать уже созданный label? Как передать функцию, на которую я хочу повесить бинд? 

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

Подскажите пожалуйста.

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

Как добавить между полями обычный текст и ссылку?

Ну как пример:

"Инструкция здесь"

Инструкция - просто текст, "здесь" - это ссылка на локальный файл или ссылка на другой ресурс.

Нравится

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

В HtmlControl можно любой html класть. Cвойство htmlContent можно связать со строковым атрибутом или функцией которая возвращает строку или сразу положить строку

"htmlContent": "<p>some текст</p>".

 

Вот пример

{

                    "operation": "insert",

                    "name": "AcademyMessageElement",

                    "parentName": "AcademyMessageDescription",

                    "propertyName": "items",

                    "values": {

                        "itemType": Terrasoft.ViewItemType.COMPONENT,

                        "className": "Terrasoft.HtmlControl",

                        "htmlContent": {"bindTo": "AcademyHelpMessage"}

                    }

                }

В HtmlControl можно любой html класть. Cвойство htmlContent можно связать со строковым атрибутом или функцией которая возвращает строку или сразу положить строку

"htmlContent": "<p>some текст</p>".

 

Вот пример

{

                    "operation": "insert",

                    "name": "AcademyMessageElement",

                    "parentName": "AcademyMessageDescription",

                    "propertyName": "items",

                    "values": {

                        "itemType": Terrasoft.ViewItemType.COMPONENT,

                        "className": "Terrasoft.HtmlControl",

                        "htmlContent": {"bindTo": "AcademyHelpMessage"}

                    }

                }

Если нужна ссылка придется класть в HtmlControl, если нужен только текст есть Label.

{

                    "operation": "insert",

                    "name": "EmptySearchResultLabel",

                    "parentName": "EmptySearchResultContainer",

                    "propertyName": "items",

                    "values": {

                        "itemType": Terrasoft.ViewItemType.LABEL,

                        "classes": {

                            "labelClass": [

                                "description-label"

                            ]

                        },

                        "caption": {"bindTo": "Resources.Strings.EmptySearchResultMessage"}

                    }

                }

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

Имеется расширенный фильтр. Мне необходимо отобразить его лишь на чтение.

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

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

"Действия" скрываются путем передачи в модуль конфига с параметром actionsVisible: false.

В модуле FilterEditModule не нашел подобного функционала для добавления или удаления условий. 

Нашел в классе Terrasoft.controls.FilterEdit.Filter метод, возвращающий как раз таки права на удаление, выделение и т.д.

/**
	 * @inheritdoc Terrasoft.FilterEdit.Item#getAllowedManageOperations
	 * @protected
	 * @override
	 */
	getAllowedManageOperations: function() {
		var filterManager = this.filterManager;
		if (!filterManager) {
			return {
				canViewEnabled: true,
				canEditEnabled: true,
				canEditLeftExpression: true,
				canEditRightExpression: true,
				canEditComparisonType: true,
				canRemove: true,
				canSelect: true
			};
		}
		var filterManageOperations = filterManager.getAllowedFilterManageOperations(this.instance);
		var isEnableComparisonType = this._isEnableComparisonType();
		if (isEnableComparisonType !== undefined) {
			filterManageOperations.canEditComparisonType = isEnableComparisonType;
		}
		return filterManageOperations;
	},

Как я могу переопределить этот метод, если мне нужно расширить логику лишь для одного модуля, а не во всю систему.

 

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

Нравится

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

У кейса есть 2 способа решения:

1) Расширить класс  BaseFilterProvider.

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

 

Пример расширенного модуля (комментарии для понимания разницы)

define("BpFilterReadonlyProvider", [],
	function() {
		/**
		 * @class Terrasoft.data.filters.FilterReadonlyProvider
		 * Readonly filters provider.
		 */
		Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", {
				extend: "Terrasoft.BaseFilterProvider",
			alternateClassName: "Terrasoft.FilterReadonlyProvider",
 
			rootSchemaName: "",
 
			canDisplayId: false,
 
			sandbox: null,
 
			// Управление операциями внутри фильтра (для каждого фильтра по отдельности).
			getAllowedFilterManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Возможность изменения левой части выражения.
					canEditLeftExpression: false,
					// Возможность изменения правой части выражения.
					canEditRightExpression: false,
					// Возможность изменения условия сравнения.
					canEditComparisonType: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбрать отдельный фильтр.
					canSelect: false
				};
			},
 
			// Управление группами фильтров.
			getAllowedFilterGroupManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Видимость типа группы ("И" / "ИЛИ").
					canViewGroupType: true,
					// Возможность редактирования типа группы.
					canEditGroupType: false,
					// Видимость кнопки "Добавить условие".
					canAddFilters: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбора группы фильтра.
					canSelect: false
				};
			}
 
		});
		return Terrasoft.FilterReadonlyProvider;
	}
);

 

Передача конфига модулю

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
        // Объект
	    rootSchemaName: "SxCandidate",
        // Колонка со значением фильтра
		filters: this.$RequirementFilterValue,
        // Видимость кнопки "Действия"
		actionsVisible: false,
        // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом)
		filterProviderClassName: "Terrasoft.FilterReadonlyProvider"
   };
}

 

2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.

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

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
	    rootSchemaName: "SxCandidate",
		filters: this.$RequirementFilterValue,
		actionsVisible: false,
        entitySchemaFilterProviderConfig: {
		    canDisplayId: true,
		    shouldHideLookupActions: true,
			isColumnSettingsHidden: true,
			getAllowedFilterManageOperations: function() {
			    return {
				    canViewEnabled: true,
					canEditEnabled: false,
					canEditLeftExpression: false,
					canEditRightExpression: false,
					canEditComparisonType: false,
					canRemove: false,
					canSelect: false
				};
			},
			getAllowedFilterGroupManageOperations: function() {
				return {
					canViewEnabled: true,
					canEditEnabled: false,
					canViewGroupType: true,
					canEditGroupType: false,
					canAddFilters: false,
					canRemove: false,
					canSelect: false
				};
			}
		}
   };
}

 

В обоих случаях результат будет идентичен.

Можно наложить фильтр в раздел и пользователь его вообще не увидит в расширенных фильтрах.

https://community.terrasoft.ru/questions/interesuet-kak-sozdat-filtr-v-…

https://community.terrasoft.ru/questions/vidimost-sotrudnikov-v-kontakt…

https://community.terrasoft.ru/questions/bystryy-filtr-po-celochislenno…

Полозюков Евгений Петрович,

задача в другом. Допустим, менеджер заполняет фильтрацию внутри карточки (аналогично фильтрам в карточке раздела "Модели машинного обучения"). Затем, этот фильтр мне нужно отобразить  оператору только для чтения уже в совершенно другом месте.

 

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

Подкопаев Михаил Олегович,

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

У кейса есть 2 способа решения:

1) Расширить класс  BaseFilterProvider.

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

 

Пример расширенного модуля (комментарии для понимания разницы)

define("BpFilterReadonlyProvider", [],
	function() {
		/**
		 * @class Terrasoft.data.filters.FilterReadonlyProvider
		 * Readonly filters provider.
		 */
		Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", {
				extend: "Terrasoft.BaseFilterProvider",
			alternateClassName: "Terrasoft.FilterReadonlyProvider",
 
			rootSchemaName: "",
 
			canDisplayId: false,
 
			sandbox: null,
 
			// Управление операциями внутри фильтра (для каждого фильтра по отдельности).
			getAllowedFilterManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Возможность изменения левой части выражения.
					canEditLeftExpression: false,
					// Возможность изменения правой части выражения.
					canEditRightExpression: false,
					// Возможность изменения условия сравнения.
					canEditComparisonType: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбрать отдельный фильтр.
					canSelect: false
				};
			},
 
			// Управление группами фильтров.
			getAllowedFilterGroupManageOperations: function() {
				return {
					// Видимость признака "Активен".
					canViewEnabled: true,
					// Возможность изменения признака "Активен".
					canEditEnabled: false,
					// Видимость типа группы ("И" / "ИЛИ").
					canViewGroupType: true,
					// Возможность редактирования типа группы.
					canEditGroupType: false,
					// Видимость кнопки "Добавить условие".
					canAddFilters: false,
					// Видимость кнопки удаления ('X').
					canRemove: false,
					// Возможность выбора группы фильтра.
					canSelect: false
				};
			}
 
		});
		return Terrasoft.FilterReadonlyProvider;
	}
);

 

Передача конфига модулю

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
        // Объект
	    rootSchemaName: "SxCandidate",
        // Колонка со значением фильтра
		filters: this.$RequirementFilterValue,
        // Видимость кнопки "Действия"
		actionsVisible: false,
        // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом)
		filterProviderClassName: "Terrasoft.FilterReadonlyProvider"
   };
}

 

2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.

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

updateFilterModule: function() {
    this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]);
},
 
...
 
getRequirementsModuleConfig: function() {
    return {
	    rootSchemaName: "SxCandidate",
		filters: this.$RequirementFilterValue,
		actionsVisible: false,
        entitySchemaFilterProviderConfig: {
		    canDisplayId: true,
		    shouldHideLookupActions: true,
			isColumnSettingsHidden: true,
			getAllowedFilterManageOperations: function() {
			    return {
				    canViewEnabled: true,
					canEditEnabled: false,
					canEditLeftExpression: false,
					canEditRightExpression: false,
					canEditComparisonType: false,
					canRemove: false,
					canSelect: false
				};
			},
			getAllowedFilterGroupManageOperations: function() {
				return {
					canViewEnabled: true,
					canEditEnabled: false,
					canViewGroupType: true,
					canEditGroupType: false,
					canAddFilters: false,
					canRemove: false,
					canSelect: false
				};
			}
		}
   };
}

 

В обоих случаях результат будет идентичен.

У вас настройка фильтра хранится в поле? Может, можно закрыть оператору доступ к данному полю на уровне прав доступа?

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

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

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

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

Добрый день!

 

Столкнулся с проблемой, что не регистрируются обращения с почтового ящика, которые содержат иной адрес в поле "Кому"

Например, подключен п/я help@aaa.ru, на него на уровне Exchange настроена переадресация (алиас) писем, отправленных на help.old@aaa.ru.

Письма отображаются в списке поступивших писем, не не регистрируются, т.к. в поле Кому help.old, а не help, хоть это и получено в подключенном ящике, прописанном в справочнике "Почтовые ящики для регистрации писем".

Как добиться регистрации писем без подключения к системе самого help.old?

Нравится

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

Попробуйте добавить еще одну запись в справочник "Список почтовых ящиков для регистрации обращений" и в значении почтовый ящик пересылки указать help.old@aaa.ru

Попробуйте добавить еще одну запись в справочник "Список почтовых ящиков для регистрации обращений" и в значении почтовый ящик пересылки указать help.old@aaa.ru

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

Спасибо за ответ! 

Добавил тот же ящик domain\help только с указанием адреса help.old@aaa.ru в строке "Название пересылки" и это сработало!

Спасибо!

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

Необходимо обновить систему до версии 7.16.1, в гайде на академии описано только обновление до последней версии.

Так как же обновиться до определенной версии?

Нравится

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

Добрый день.

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

Обратите внимание, что обновляться нужно с версии на версию последовательно, не пропуская версии, которые идут между ними!

И ещё важный момент, если например, Вы обновляетесь с версии 7.16.1 на 7.16.3, а потом хотите с версии 7.16.3 на 7.16.4, то в папке с обновлениями должны находиться только дистрибутивы версий, которые идут после текущей и включительно до той, на которую Вы обновляетесь.

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

Ну, а вообще, как пожелание, можно в утилиту по скачиванию дистрибутивов добавить ещё один параметр, в котором указывать нужную версию.

Добрый день.

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

Обратите внимание, что обновляться нужно с версии на версию последовательно, не пропуская версии, которые идут между ними!

И ещё важный момент, если например, Вы обновляетесь с версии 7.16.1 на 7.16.3, а потом хотите с версии 7.16.3 на 7.16.4, то в папке с обновлениями должны находиться только дистрибутивы версий, которые идут после текущей и включительно до той, на которую Вы обновляетесь.

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

Ну, а вообще, как пожелание, можно в утилиту по скачиванию дистрибутивов добавить ещё один параметр, в котором указывать нужную версию.

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