Добрый день! Стокнулся со следующей проблемой в верси 7.17: при загрузке страницы управлния конфигурацией, приложение не находит языковые json файлы en-US.json и ru-RU.json.

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

Из-за этого записи на странице управления конфигурацией выглядит некорректно :

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

У пользователя IIS есть полный доступ к ресурсам приложения.

Подскажите, возможно кто-то сталкивался с подобной прблемой?

Нравится

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

Проблема  решилась добавлением mimeMap для json-файлов. Во внешнем web.config в секции <system.webServer> необходимо добавить:

&lt;staticContent&gt;
      &lt;mimeMap fileExtension=".json" mimeType="application/json" /&gt;
&lt;/staticContent&gt;   

 

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

Это проблема кэширования Angular, сталкиваюсь с таким постоянно после обновлений когда введи Angular. Лечится полным сносом приложения сайта (прямо все папки, но не базы, на всякий случай предупреждаю), и развертыванию его заново (с архива дистрибутива а не того что Вы себе могли делать копии вашего приложения, даже если он той же версии). После это компилируете все и должно устранить проблему



Добрый день! У пользователя IIS полный доступ к папке с сайтом.

Александр Тыра,сносил  с сервера и удолял физическую папку. Ставил новую версию распакованую из архива. К сожалению это не помогло. Пробовал 7.17.1, 7.17.2, аднако проблема остается.

Проблема  решилась добавлением mimeMap для json-файлов. Во внешнем web.config в секции <system.webServer> необходимо добавить:

&lt;staticContent&gt;
      &lt;mimeMap fileExtension=".json" mimeType="application/json" /&gt;
&lt;/staticContent&gt;   

 

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

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

Например, AccountDuplicate пустая, хотя система нашла много дубликатов

Нравится

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

Вопрос какая у вас версия. В старом поиске это таблица AccountDuplicateSearchResult. И еще рекомендую посмотреть таблицу DeduplicateExecLog нет ли у вас там ошибок при поиске дублей.

Вопрос какая у вас версия. В старом поиске это таблица AccountDuplicateSearchResult. И еще рекомендую посмотреть таблицу DeduplicateExecLog нет ли у вас там ошибок при поиске дублей.

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

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

Есть класс SideBar и я создал модуль NrbSideBarWithCountersModule который наследуется от него. 

define("NrbSideBarWithCountersModule", ["terrasoft", "ext-base"], function() {
	Ext.define("Terrasoft.controls.NrbSideBarWithCountersModule", {
		extend: "Terrasoft.SideBar",
		alternateClassName: "Terrasoft.NrbSideBarWithCountersModule",
		Ext: null,
		sandbox: null,
		Terrasoft: null,
		itemTplMap: [
			"caption",
			"imageUrl",
			"href",
			"domAttributes",
			"availableEntities"
		],
 
		itemTpl: [
			"<tpl if=\"visible != false\">",
			"<li data-item-index=\"{itemIndex}\"",
			"<tpl if=\"isSelected == true\">",
			"class=\"ts-sidebar-selected-item\"",
			"</tpl>",
			">",
			"<span class=\"vertical-strip\"></span>",
			"<tpl if=\"href\"><a target=\"_self\" class=\"sidebar-item-link\" href=\"{href}\"></tpl>",
			"<div id=\"sidebar-item-wrapper-{itemIndex}\" class=\"ts-sidebar-item-wrapper\">",
			"<div id=\"sidebar-item-image-{itemIndex}\" class=\"ts-sidebar-item-image\" data-item-marker=\"{caption}\" " +
			"style=\"background-image:url({imageUrl})\" <tpl foreach=\"domAttributes\">{$}=\"{.}\"</tpl>></div>",
			"<div id=\"sidebar-item-text-{itemIndex}\" class=\"ts-sidebar-item-text\"> {caption} ",
			"<div id=\"sidebar-item-counter-{itemIndex}\" class=\"ts-sidebar-item-counter\"> {availableEntities} ",
			"</div>",
			"</div>",
			"<tpl if=\"href\"></a></tpl>",
			"</li>",
			"</tpl>"
		],
 
	});
	return Terrasoft.NrbSideBarWithCountersModule;
});

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

define("NrbSectionMenuModule", ["ServiceHelper", "NrbSectionMenuModuleResources", "ModuleUtils", "MaskHelper",
		"LeftPanelUtilitiesV2", "CheckModuleDestroyMixin"],
	function (resources, ModuleUtils, ServiceHelper, MaskHelper, LeftPanelUtilities) {
		Ext.define("Terrasoft.configuration.NrbSectionMenuModule", {
			alternateClassName: "Terrasoft.NrbSectionMenuModule",
			override: "Terrasoft.SectionMenuModule",
			render: function (renderTo) {
				if (!Ext.isEmpty(viewModel) && !Ext.isEmpty(sideBar)) {
					sideBar.destroy();
				}
				sideBar = Ext.create("Terrasoft.NrbSideBarWithCountersModule", Terrasoft.deepClone(sideBarConfig));
				sideBar.bind(viewModel);
				sideBar.render(renderTo);
				MaskHelper.HideBodyMask();
			},
			getSideBarItems: function () {
				var config = [];
				var moduleStructure = Terrasoft.configuration.ModuleStructure;
				var modules = info && info.modules ? info.modules : Object.keys(moduleStructure);
				if (!modules) {
					return;
				}
				var availableSections = info.AvailableSections;
				var defaultIconUrl = Terrasoft.ImageUrlBuilder.getUrl(resources.localizableImages.DefaultIconSvg);
				modules.forEach(function (module) {
					if (module.moduleId !== Terrasoft.GUID_EMPTY) {
						var moduleName = module.moduleName ? module.moduleName : module;
						var moduleConfig = moduleStructure[moduleName];
						if (moduleConfig.hide !== "true") {
							if (!Ext.isArray(availableSections) || availableSections.indexOf(moduleName) >= 0) {
								var caption = moduleStructure[moduleName].moduleCaption;
								var tag = ModuleUtils.getModuleTag(moduleName);
								var imageId = moduleStructure[moduleName].imageId;
								var imageUrl = imageId ? getImageUrl(imageId) : defaultIconUrl;
								var itemUrl = Terrasoft.workspaceBaseUrl + "/Nui/ViewModule.aspx#" + tag;
								var count = this.getCountOfAvailableProjects();
								var itemConfig = {
									caption: caption,
									tag: tag,
									imageUrl: imageUrl,
									href: itemUrl,
									domAttributes: { "module-name": module.moduleName },
									availableEntities: count
								};
								if (!Terrasoft.Features.getIsEnabled("SectionMenuLink")) {
									itemConfig.href = null;
								}
								config.push(itemConfig);
							}
						}
					}
				});
				return config;
			},
 
			getCountOfAvailableProjects: function () {
				var requestConfig = {
					serviceName: "NrbProjectCounterService",
					methodName: "GetNumberOfAvailableProjects",
					callback: this.showResult
				};
				this.callService(requestConfig, this);
			},
 
			showResult: function (result) {
				console.log(result);
			},
		});
 
		return Terrasoft.NrbSectionMenuModule;
	});

Переопределение не даёт нужного результата и возник такой вопрос. Правильно ли тут использовать переопределение или лучше использовать наследование? 

И как я понял мне надо будет переопределить все модули которые взаимодействовали с SectionMenuModule и поменять на NrbSectionMenuModule?

Нравится

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

Модули не замещаются как карточки. То что создали свой модуль NrbSideBarWithCountersModule это ваш модуль. А левую панель так и продолжает выводить SectionMenuModule.

Динар, для того, чтобы Ваш класс заменил стандартный, нужно в нём указать override и название того, что он замещает. А затем упомянуть название Вашего модуля в замещённом BootstrapModulesV2, который загружается при старте. Более подробно о таком подходе см. пример в этой теме.

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

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



DaysInMonth() редактору формул не нравится

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

Нравится

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

Сделайте скриншот формулы с текстом ошибки.

Можно попробовать добавить System в Namespace.

И посмотрите еще раз пример.

int daysInJuly = System.DateTime.DaysInMonth(2021, 7);

Владимир, у меня всё работает:

В процесс дополнительно ничего не добавлял.

Зверев Александр пишет:

Андрей, у меня всё работает:

Очень интересно! Я проверил в облаке - действительно, работает.

А на on-site - выдаёт ошибку.



В чём может быть разница? 

Может, версия отличается? Я пробовал на 7.17.2.

Зверев Александр пишет:

развернули Marketing 7.17.2 PostgreSQL на Windows - то же самое...

Чистка кэша браузера и Redis не помогает?

В «инструментах разработчика» браузера есть более подробная информация об ошибке?

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

Значит, есть ещё какие-то различия между системами, где работает, и где нет. А если на одном сайте создать БП, выгрузить схему в файл и загрузить на другой сайт, тоже перестаёт работать?

Зверев Александр пишет:

Значит, есть ещё какие-то различия между системами, где работает, и где нет. А если на одном сайте создать БП, выгрузить схему в файл и загрузить на другой сайт, тоже перестаёт работать?

Проверил ещё на парочке on-site (которые ставили не мы) - везде повторяется такая же ошибка.. 

При переносе схемы БП с этой функцией на такой сайт тоже? А в логах, куда пишутся стеки ошибок в серверном коде, ничего не появляется?

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

Вернулся к этому вопросу. Если перенести схему из облака, то процесс успешно выполняется. 

Однако при попытке его редактировать, снова та же ошибка.



В логах не нашли ничего подозрительного

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

Есть анонимный веб сервис(разработанный мной). Спустя примерно пол часа после последнего обращения к нему новый запрос обрабатывается 30+ секунд а последующие запросы обрабатываются менее одной секунды. 

Такое ощущение, что веб сервис переходит в спящий режим 

 

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

Нравится

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

Да, приложение при простое засыпает.

В iis в ApplicationPools есть пул вашего приложения в AdvancedSettings есть настройка Idle Time-out(minutes) в ней укажите 0 и приложение не будет засыпать.

Да, приложение при простое засыпает.

В iis в ApplicationPools есть пул вашего приложения в AdvancedSettings есть настройка Idle Time-out(minutes) в ней укажите 0 и приложение не будет засыпать.

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

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

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

Под доступными подразумеваются те проекты, которые удовлетворяют следующим условиям (фиксированным фильтрам раздела + права + статусы):

Ответственный = текущий пользователь

И

текущий пользователь имеет права на чтение

И

Состояние проекта не равно (Завершён, Отменён)

 

Выглядеть должно следующим образом.

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

Я начинающий разработчик и не очень понимаю как именно это реализовать. Была идея создать визуальны модуль с счётчиком, но пока не понимаю как это сделать. Уже написан вэб-сервис, который возвращает доступное количество проектов, но пока нет понимая откуда его вызвать и как установить эти счётчики.

 

Нравится

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

Не факт что туда можно влезть. Левую панель с разделами отрисовывает модуль SideBarModule.

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

Уже есть настроенный показатель «Активных проектов», можно изменить его условие фильтрации:

Или ещё проще, настроить динамическую группу с нужным фильтром, включить в разделе итог «Отображать количество записей» и при нахождении внутри группы над реестром будет видно интересующее число.

Зверев Александр, Спасибо за предложение, но всё-таки мне требуется выводить это число в панели разделов

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

Динар, кажется, придумал ещё один способ.

Из JS доступна структура Terrasoft.configuration.ModuleStructure, где хранится информация по разделам, в том числе и названия. Если там вручную из консоли браузера сменить название, дописав цифру, то при обновлении перечня разделов, например, при смене рабочего места, она появится. Можно менять её программно, а потом вызывать перестройку списка разделов, как при смене рабочего места. Эта структура генерируется на серверной стороне в схеме ConfigurationSectionHelper.

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

Добрый день, подскажите, пожалуйста, как отрабатывает сигнал "Удаление" в бизнес процессах. Сейчас столкнулась со следующим кейсом: 

У нас есть две таблицы Кредит и Выплаты по кредиту,  необходимо, чтоб при удалении записи "Выплаты по кредиту", итоговая оставшаяся сумма кредита обновлялась в таблице "Кредит".  (При создании "выплат по кредиту" логика отрабатывает верно, мы получаем ID созданной "Выплаты", потом "ID связанного кредита", а при удалении не работает).

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

Если это так, то просьба подсказать, есть ли обходные пути решения. 

Нравится

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

Здравствуйте, Ирина.

 

Для решения Вашей задачи можно использовать событийный процесс объекта "Выплаты по кредиту".

 

Описываемую Вами логику нужно реализовать в обработчике события OnDeleting. Подробнее читайте в статье на Академии.

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

Здравствуйте, Ирина.

 

Для решения Вашей задачи можно использовать событийный процесс объекта "Выплаты по кредиту".

 

Описываемую Вами логику нужно реализовать в обработчике события OnDeleting. Подробнее читайте в статье на Академии.

Алла Савельева,

Возможно ли реализовать такое с применением low-code инструментария? Просто есть задание в экзамене на бизнес-аналитика Creatio аналогичное данному кейсу (произвести пересчёт суммы основной записи при добавлении/изменении/удалении записей на детали, относящейся к основной записи)

Реализация обработчика точно не задача бизнес-аналитика, но если такое задание имеется, то предполагается, что и решить его можно без применения серверной логики

Ирина Степанян,

Здравствуйте, Ирина!

 

Все верно, такое можно реализовать через лоу-код (бизнес-процессы). странно, что выше такого не написали..

 

При удалении записи вызывать процесс пересчета основной карточки, НО передавать ид удаленной записи и в самом пересчете дописать фильтр, чтобы не учитывать эту запись.

 

Делала такое у себя на проекте, все работает. По сигналу "удаление записи" запись все еще есть в системе и все можно из нее "вытянуть".  при пересчете она еще будет "считаться" -- поэтому ее нужно добавить в фильтр (например, ИД <> ИД_удаленной_записи)

Ольга П.,

Благодарю за ответ, но я произвела несколько проверок и запись в детали удаляется сразу после сигнала процесса Удаление записи

В чём сам кейс: у меня есть деталь Билеты и поле Стоимость билета внутри. Данная деталь относится к разделу Возвраты. В разделе Возвраты есть поле Общая стоимость, которое должно рассчитываться на базе поля детали Стоимость билета. 

Я строю процесс по 3-м сигналам (добавление/изменение/удаление), при добавлении и изменении всё отрабатывает корректно, но при удалении есть нюанс - на самом сигнале я получаю ID удалённого билета, но мне нужно пересчитать Общую стоимость по возврату, исходя из других оставшихся билетов, но при попытке считать ID возврата из объекта Билеты по ID билета, которое на сигнале мы имеем - возвращается ID возврата такого вида: 00000000-0000-0000-0000-000000000000, то бишь обычная "заглушка". В итоге с таким ID возвратов нет, и, как итог, ничего не пересчитывается

НО! Исходя из того, что Вы написали, это справедливо для случая, когда на объекте Билеты (детали) стоит событие Перед Удалением, и вот тогда в этом процессе, вместо третьей ветки с удалением мы заводим Событийный подпроцесс, который как раз работает ещё ДО того, как запись удалилась, и получаем ID возврата и всё пересчитываем (исключая, как Вы и написали, ту запись Билета, ID которой мы получили на сигнале удаления внутри событийного подпроцесса)

 

Ирина Степанян,

Странно, что у меня "вытягивается" значение, у Вас -- нет.. может, разница версий? у меня 7.18.5.1501 (.NET Core 3.1.22)

 

удаляю Участника из Активности и вытягиваю Активность, точнее, нужные поля из Активности.

 

хорошо, что Вы решили задачу через событийные подпроцессы, но все-таки мне уже самой интересно, почему разное поведение..)

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

При выделении заказа в разделе "Заказы" появляется кнопка "Копировать. Она создает новый заказ и переносит только основные поля. 

Где можно найти этот механизм, чтобы добавить в него еще копирование продуктов и цен?

Нравится

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

Можно убрать копирование поля, сняв в объекте у него признак копирования. Но тогда цена будет 0.



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

Возможно, с этим дополнением будет легче - https://marketplace.terrasoft.ua/app/copy-detail-records-creatio

Необходимо переопределить кнопку копировать и написать свой код который будет к примеру отправлять id заказ в ваш процесс или веб сервис и там прописать свою логику копирования.

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

Владимир, я воспользовался советом и все получилось, продукты подгружаться

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

Как можно поправить эту ситуацию, чтобы при копировании автоматически,

старые цены обновлялись на текущие?

Можно убрать копирование поля, сняв в объекте у него признак копирования. Но тогда цена будет 0.



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

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

Поясните, пожалуйста, какие параметры использовать в SQL-скриптах при установке пакета?



Конкретная ситуация: на PostgreSQL необходимо изменить длину текстового поля, но это поле используется в VIEW. Соответственно, если не предпринять ничего дополнительного, то при установке получаем ошибку:



Terrasoft.Core.DB.DBMetaActionExecuteException: Error "0A000: cannot alter type of a column used by a view or rule" occurred when updating schema structure



Логично хочется перед установкой схемы объекта удалить VIEW. Но Drop view с параметром 'Before Saving Package' не сработал - всё равно в логах та же ошибка.



Как же сделать так, чтобы один скрипт срабатывал ДО установки схем, а второй - ПОСЛЕ?

 

Нравится

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

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

Используйте тип установки, если он не работает так как вам надо и это баг пишите в техподдержку и ждите исправления в следующих версиях.

Обходной вариант разнести их в несколько пакетов и сначала поставить пакет1 потом пакет2.

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

Кроме параметра Тип установки порядок установки sql скриптов больше никак не контролируется.

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

Кроме параметра Тип установки порядок установки sql скриптов больше никак не контролируется.

А как можно заставить их выполняться в нужный момент? 

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

Используйте тип установки, если он не работает так как вам надо и это баг пишите в техподдержку и ждите исправления в следующих версиях.

Обходной вариант разнести их в несколько пакетов и сначала поставить пакет1 потом пакет2.

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

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

Иногда у клиента бывает, что в стандартные 250 символов не помещается текст, и он просит увеличить до 500... Переделывать всю логику очень лень :)



Поддержка же отмалчивается.



С пакетами идея! А как пакеты объединить потом в одно "дополнение", чтобы высылать одним файлом?

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

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

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

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

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

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

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

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

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

К примеру если вы добавляете записи с помощью insert, перед выполнение необходимо проверить наличие записи с помощью select. Если запись есть insert не выполнять.

Примеры написания скриптов есть в базовых пакетах.

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

Сделали атрибут (LOOKUP) на странице, который ссылается на SysAdminUnit (но пробовали и с другими объектами - то же самое).

"UsrCurrentUserRole": {
    "dataValueType": Terrasoft.DataValueType.LOOKUP,
    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    "isLookup": true,
    "referenceSchemaName": "SysAdminUnit"
}



Задали в бизнес-правилах его сравнение со значением Lookup. Всё сохранилось (в коде страницы тоже), всё работает корректно.



Но если зайти в это бизнес-правило, то не старые установленные значения не отображаются.

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

Что ещё надо указать, чтобы всё работало корректно? 

Нравится

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

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

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

Если вы хотите создать его в редакторе, создайте в редакторе сразу такое какое нужно.

Я не понимаю что вы такое пытаетесь сделать.

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



Проблема может быть из-за того что это системный справочник SysAdminUnit.

Создайте подобное новое правило из редактора бизнес правил и посмотрите в секции businessRules как оно будет описано.

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

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



Баг или фича?

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

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

Если вы хотите создать его в редакторе, создайте в редакторе сразу такое какое нужно.

Я не понимаю что вы такое пытаетесь сделать.

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



Проблема может быть из-за того что это системный справочник SysAdminUnit.

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

Я не понимаю что вы такое пытаетесь сделать.

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

И при этом не лезть в код.



От справочника не зависит 

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

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

 

Вообще вести серьезную разработку и не лезть в код нельзя.

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