Исходные данные.

Два типа пользователей системы: сотрудник компании, пользователь портала.

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

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

Вопрос.

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

Нравится

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

Дамиан, эта логика реализована в схеме HtmlEditModule, в функции:

updateToolbar: function() {
	var id = this.id;
	var toolbar = this.toolbar;
	var memo = this.memo;
	if (!toolbar || !memo) {
		return;
	}
	var plainTextMode = this.plainTextMode;
	var enabled = this.enabled;
	var enabledInRichTextMode = !plainTextMode && enabled;
	var enabledInPlainTextMode = plainTextMode && enabled;
	var hideModeButtons = this.hideModeButtons;
	toolbar.fontFamily.setEnabled(enabledInRichTextMode);
	toolbar.fontSize.setEnabled(enabledInRichTextMode);
	toolbar.fontStyleBold.setEnabled(enabledInRichTextMode);
	toolbar.fontStyleItalic.setEnabled(enabledInRichTextMode);
	toolbar.fontStyleUnderline.setEnabled(enabledInRichTextMode);
	toolbar.fontColor.setEnabled(enabledInRichTextMode);
	toolbar.hightlightColor.setEnabled(enabledInRichTextMode);
	toolbar.numberedList.setEnabled(enabledInRichTextMode);
	toolbar.bulletedList.setEnabled(enabledInRichTextMode);
	toolbar.maximized.setEnabled(enabledInRichTextMode);
	toolbar.indentList.setEnabled(enabledInRichTextMode);
	toolbar.outdentList.setEnabled(enabledInRichTextMode);
	toolbar.justifyLeft.setEnabled(enabledInRichTextMode);
	toolbar.justifyCenter.setEnabled(enabledInRichTextMode);
	toolbar.justifyRight.setEnabled(enabledInRichTextMode);
	toolbar.image.setEnabled(enabledInRichTextMode);
	toolbar.link.setEnabled(enabledInRichTextMode);
	toolbar.htmlMode.setEnabled(enabledInPlainTextMode);
	toolbar.plainMode.setEnabled(enabledInRichTextMode);
	toolbar.htmlMode.setPressed(enabledInRichTextMode);
	toolbar.plainMode.setPressed(enabledInPlainTextMode);
	toolbar.htmlMode.setVisible(!hideModeButtons);
	toolbar.plainMode.setVisible(!hideModeButtons);
	memo.setReadonly(!enabled);
	var extToolbar = Ext.get(id + "-" + this.controlElementPrefix + "-toolbar");
	if (extToolbar) {
		extToolbar.dom.style.display = !enabled ? "none" : "table-cell";
	}
	var extHtmlEdit = Ext.get(id + "-" + this.controlElementPrefix + "-htmltext");
	if (extHtmlEdit) {
		extHtmlEdit.dom.style.display = plainTextMode ? "none" : "table-cell";
	}
	var extPlainText = Ext.get(id + "-" + this.controlElementPrefix + "-plaintext");
	if (extPlainText) {
		extPlainText.dom.style.display = !plainTextMode ? "none" : "table-cell";
	}
	var editor = this.editor;
	if (editor) {
		// TODO: 200083
		try {
			editor.setReadOnly(!enabled);
		} catch (e) {
			if (editor.document) {
				editor.document.getBody().$.contentEditable = enabled;
			}
		}
		if (extHtmlEdit) {
			extHtmlEdit.dom.style.backgroundColor = enabled ? "#ffffff" : "#f9f9f9";
		}
	}
},

Проверка условий видимости панели делается в 10 и 11 строках. То есть либо у поля установлено свойство plainTextMode, либо он неактивен. Если у Вас не было никаких доработок, вероятнее всего, вторая причина. По умолчанию в разделе базы знаний для портальных пользователей записи доступны только для чтения, и это, и другие поля просто заблокированы. В таком случае панель форматирования и не нужна. Чтобы она появилась, надо портальным пользователям дать права на создание/изменение статей БЗ:

Выставил права доступа согласно рекомендациям - не помогло.

Дамиан, как оказалось, свойство «enabled» не относится к правам, а задаётся непосредственно кодом в схеме карточки.

 

В PortalKnowledgeBasePage у трёх полей (название, тип и заметки) оно определено как false:

{
	"operation": "merge",
	"name": "Name",
	"values": {
		"enabled": false
	}
},
{
	"operation": "merge",
	"name": "Type",
	"values": {
		"enabled": false
	}
},
{
	"operation": "merge",
	"name": "Notes",
	"values": {
		"layout": {
			"column": 0,
			"row": 0,
			"colSpan": 24,
			"rowSpan": 1
		},
		"enabled": false
	}
},

Если в пакете Custom переопределить эту страницу, поменять на true, то поля (или только заметки, если менять лишь последнее) разблокируются. 

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

Создал замещающую схему страницы портального раздела "Базы знаний" (PortalKnowledgeBasePage). Внутри неё в блоке diff прописал ваш код для заметок. Всё заработало, панель с кнопкой "развернуть во весь экран" появилась.

diff: /**SCHEMA_DIFF*/[
// Заметки.
{
  "operation": "merge",
  "name": "Notes",
  "values": {
    "layout": {
      "column": 0,
      "row": 0,
      "colSpan": 24,
      "rowSpan": 1
    },
    "enabled": true
  }
},
]/**SCHEMA_DIFF*/

 

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

Добрый день!

Сегодня возникла проблема с подключением к веб-сокету Terrasoft Messaging Service из браузера Chrome с использованием защищенного соединения. Возникает ошибка ERR_SSL_OBSOLETE_VERSION. 

Вероятно Terrasoft Messaging Service использует протокол TLS версии ниже 1.2, которые Chrome перестал поддерживать.

Возможно ли в файле Terrasoft.Messaging.Service.exe.config указать версию TLS?

Нравится

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

Проблему для себя решили следующим образом:

1) Обновили TMS до последней актуальной версии.

2) В конфиге указали security="Tls12"

Так же столкнулся с этой проблемой, вопрос адресовал еще в ТП террасофта, если там дадут ответ раньше, продублирую сюда.

Литвинко Павел пишет:

Так же столкнулся с этой проблемой, вопрос адресовал еще в ТП террасофта, если там дадут ответ раньше, продублирую сюда.

Chrome обновил политику безопасности и требует использование более новой версии SSL сертификатов. 

Поэтому, если у Вас старый алгоритм шифрования на сертификате.



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



Тут необходимо обновить сертификат SSL на сервере с TMS. 

Как обходное решение, можно открыть в соседней вкладке браузера адрес https://[адрес TMS]:2013 

После разрешить переход на небезопасный сайт и обновить вкладку с Creatio. 

Дело может быть не только в сертификате. Если наблюдается с нормальным сертификатом, попробуйте обновить версию TMS. Либо же на уровне сервера отключена поддержка 1.2.

Проблему для себя решили следующим образом:

1) Обновили TMS до последней актуальной версии.

2) В конфиге указали security="Tls12"

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

А кто-нибудь пользовался https://marketplace.terrasoft.ru/app/kanban-view-creatio ? А то их техподдержка не отвечает.

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

Нравится

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

Алексей, привет!

 

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

 

Список колонок, которые отображаются в представлении канбан, можно настроить следующим образом: перейдите в представление канбан - в меню Вид выберите пункт Настроить колонки. В одном ряду должна быть указана только одна колонка.

 

Отображение фото не настраивается. Если в разделе добавлено поле с точным названием Owner и ссылается на раздел Контакты, тогда отобразится фото контакта.

Ирина Лазоренко,

Отображение фото не настраивается. Если в разделе добавлено поле с точным названием Owner и ссылается на раздел Контакты, тогда отобразится фото контакта.

Это я нашел в ваших исходниках, но не отображается всё равно.

Алексей, привет!

 

пришлите скриншот с настройками поля Owner в конфигурации.

 

Укажите также продукт Creatio и его версию.

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

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

Подскажите, пожалуйста, есть базовый функционал, в котором можно зафиксировать стоимость доставки?

Как правильно организовать решение такого кейса?

Нравится

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

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

 

Можно в мастере раздела открыть раздел «Заказ» и добавить требуемое дробное поле в основную часть карточки или на вкладку «Доставка». Но нужно учесть, что в объекте этого раздела много логики на встроенных БП разных пакетов и в отдельных схемах (вроде ProductEntryUtils, OrderCalculator, OrderAmountHelper и др.), нужно будет всё это проанализировать и при необходимости доработать с учётом нового поля. Например, сейчас состояние заказа меняется в зависимости от ненулевого значения «Сумма оплаты» или совпадения его с «Итого».

public virtual bool ChangeStatus() {
	if (Entity.StoringState == StoringObjectState.New) {
return true;
	}
	List<string> changedColumnNames = Entity.GetChangedColumnValues()
	.Where(cv=>cv.Value != cv.OldValue)
	.ToList().ConvertAll(cv => cv.Column.Name);
	NeedFinRecalc = changedColumnNames.Intersect(new[] {"CurrencyRate", "Currency"}).Any();
	var securityEngine = UserConnection.DBSecurityEngine;
	bool hasRight = securityEngine.GetIsEntitySchemaColumnEditingAllowed("Order", "PaymentStatus");
	if (changedColumnNames.Intersect(new[] {"Amount", "PaymentAmount"}).Any() && hasRight) {
		var amount = Entity.GetTypedColumnValue<decimal>("Amount");
		var paymentAmount = Entity.GetTypedColumnValue<decimal>("PaymentAmount");
		if (amount > 0 && amount == paymentAmount) {
			Entity.SetColumnValue("PaymentStatusId", OrderPackage.Constants.Order.OrderPaymentStatus.Paid);
		} else if (paymentAmount > 0) {
			Entity.SetColumnValue("PaymentStatusId", OrderPackage.Constants.Order.OrderPaymentStatus.PartiallyPaid);
		}
	}
	return true;
}

Если появится новое поле, стоит либо в «Итого» и подобных полях считать сумму по продуктам уже вместе с добавленной доставкой, или сравнивать с суммой двух полей.

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

Пытаюсь сделать так

var update = this.Ext.create("Terrasoft.UpdateQuery", {rootSchemaName: this.entitySchemaName});
update.filters.add("IdFilter", this.Terrasoft.createColumnFilterWithParameter("Id", selectedRows));
update.setParameterValue("B2BClient", Terrasoft.GUID_EMPTY, Terrasoft.DataValueType.GUID);
update.execute(function() {
	this.updateDetail({reloadAll: true});
}, this);

Упорно ничего не работает. 

Даже если писать вместо Terrasoft.GUID_EMPTY null или  Terrasoft.DataValueType.LOOKUP, выдает Uncaught Идентификатор GUID должен содержать 32 цифры и 4 дефиса (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

Нравится

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

Лёш, проблема не там где ищешь.



Ты фильтр добавляешь selectedRows а тип фильтра используешь как для this.get("Id").

Ошибка в том что фильтр ожидает от тебя не array а GUID.



Для массива измени тип фильтра на createColumnInFilterWithParameters.



А в исходниках кстати указано что апдейте надо Null передавать, а не GuidEmpty

Добрый вечер.

 

Попробуйте написать таким образом:

update.setParameterValue("B2BClient", null, Terrasoft.DataValueType.LOOKUP);

 

Лёш, проблема не там где ищешь.



Ты фильтр добавляешь selectedRows а тип фильтра используешь как для this.get("Id").

Ошибка в том что фильтр ожидает от тебя не array а GUID.



Для массива измени тип фильтра на createColumnInFilterWithParameters.



А в исходниках кстати указано что апдейте надо Null передавать, а не GuidEmpty

В конфигурации встречается и работает нормально null и с Terrasoft.DataValueType.GUID тоже. Например, в FileDetail:

var update = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: this.entitySchema.name
});
update.enablePrimaryColumnFilter(itemId);
update.setParameterValue("LockedOn", currentDateTime, Terrasoft.DataValueType.DATE_TIME);
if (isLocked) {
	update.setParameterValue("LockedBy", Terrasoft.SysValue.CURRENT_USER_CONTACT.value,
		Terrasoft.DataValueType.GUID);
} else {
	update.setParameterValue("LockedBy", null, Terrasoft.DataValueType.GUID);
}
update.execute(function(response) {
...

 

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

Добрый день!

Появляется ошибка при добавлении почты Exchange в профиле BPM. При этом происходит бесконечная загрузка и почта не добавляется.

Ошибка на скриншотеИзображение удалено.

Нравится

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

Здравствуйте, Николай!

Если у Вас версия 7.16.1, то IMAP-почта может не добавляться из-за ошибки использования STARTTLS в пакете OldEmailIntegration. Возможно, и с Exchange причина та же. 

Исправление включено в  7.16.2.

Для версий 7.16.1 нужно установить новую версию пакета OldEmailIntegration через Дизайнер системы - Установка и удаление приложений. Пакет можно получить, обратившись в службу поддержки.

Мотков Илья,

Добрый день!

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

У нас установлена версия 7.13

Здравствуйте, Николай!

В  таком случае, у Вас причина в другом.

Николай, судя по версии, у Вас сайт развёрнут локально. Значит, можно зайти в логи сервера в Error.log за нужный день и посмотреть, что там происходит в момент 500 ошибки. Может быть более подробная информация об ошибке и стек функций.

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

Всем привет!

 

Столкнулся со странным поведением: не всегда отрабатывает метод this.reloadEntity(); в карточке. Заметил, что при открытии страницы в режиме редактирования он отрабатывает корректно, но если создавать новую сущность и сохранить карточку ("тихое" сохранение без выхода их карточки через isSilent) метод не отрабатывает: поля не обновляются, ошибок в консоле нет. Вижу, что контекст отличается от контекста страницы в режиме редактирования, но как это победить непонятно. Кто-нибудь сталкивался?

 

Заранее благодарен за ваши ответы.

Нравится

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

Дмитрий, а если воспользоваться вместо reloadEntity способом из дополнения, упомянутого в этой теме? Там в итоге получили нужное поведение.

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

Добрый день!

В среде разработки команда ClassFactory.Get("Word"); вылетает с ошибкой. 

Команда ClassFactory.Get(); успешно выполняется.

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

Нравится

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

Возможно кто-то сталкивался с таким кейсом - в бизнеспроцессе открывается страница редактирования, в ней кнопка "Сохранить" при нажатии сразу закрывает страну. Про не закрывание страницы при добавлении на делать даных есть описание кейса на странице академии https://academy.terrasoft.ru/documents/technic-sdk/7-16/kak-sohranyat-ne-zakryvaya-otkrytuyu-biznes-processom-stranicu-redaktirovaniya , но ножно ли сделать что бы поля на странице можно быть сохранить не закрывая страницу? Другими словами при нажатии "Сохранить" страница не закрывалась а кнопка заменялась на "Закрыть"?

Нравится

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

Александр, в статье по той ссылке в начале предлагается, как такое сделать:

Если необходимо сохранить запись несколько раз, не закрывая страницу редактирования, то необходимо методу this.save() в качестве аргумента передавать конфигурационный объект со свойством isSilent равным true. Например:

this.save({isSilent : true});

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

Александр, в статье по той ссылке в начале предлагается, как такое сделать:

Если необходимо сохранить запись несколько раз, не закрывая страницу редактирования, то необходимо методу this.save() в качестве аргумента передавать конфигурационный объект со свойством isSilent равным true. Например:

this.save({isSilent : true});

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

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

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

Допустим, у меня есть раздел "Автомобили" с возможностью добавления новых автомобилей. В клиентской части мне необходимо отловить событие после добавления новой записи в этот раздел и добавить дополнительную логику на фронте. Думаю, должно быть что-то вроде "onItemInserted". Подскажите, пожалуйста,  как это лучше реализовать или какое название метода, который отрабатывает после вставки. Заранее благодарен.

Нравится

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

Добрый день!

 

На клиентской части в карточке редактирования Вы можете переопределить метод BasePageV2#onSaved

onSaved: function() {
	this.callParent(arguments);
},

Обратите внимание, если Вам нужно производить какие-то манипуляции с данными (пересчеты/обновления в других объектах и т.д.), то лучше использовать подход сигналов/событий объекта, тк при обработке на клиенте обрабатываться будет только "ручной" ввод, а во время импортов/интеграций/БП это логика останется "за бортом"

Добрый день!

 

На клиентской части в карточке редактирования Вы можете переопределить метод BasePageV2#onSaved

onSaved: function() {
	this.callParent(arguments);
},

Обратите внимание, если Вам нужно производить какие-то манипуляции с данными (пересчеты/обновления в других объектах и т.д.), то лучше использовать подход сигналов/событий объекта, тк при обработке на клиенте обрабатываться будет только "ручной" ввод, а во время импортов/интеграций/БП это логика останется "за бортом"

Если учитывать изменения на объекте процессами, интеграциями (или одновременно разными пользователями), лучше реализовать логику на событии вставки на уровне БП, а затем на сторону браузера передавать по ClientMessageBridge.

Лопатин Константин, Благодарю за совет! 

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