Всем привет!

Добавила в бизнес правилах такие условия редактирования поля: 

При наступании на активный рядок в консоли появляется ошибка "Product.UsrBasicPriceExist" была удалена или переименована. Но поле в Продуктах(UsrBasicPriceExist) точно существует. Кто-то пробовал делать что-то подобное в бизнесс правилах? Возможно лучше переписать условие кодом?

Нравится

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

Анастасия, здравствуйте.

Для исправления необходимо включить фичу LoadLookupColumnsInEditGrid, скрипт во вложении.

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

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

 

Скрипт включения фичи ниже.

 

DECLARE @featureCode varchar(max) = 'LoadLookupColumnsInEditGrid',
 @featureId uniqueidentifier;
set @featureId = (select top 1 Id from Feature where Code = @featureCode);
IF @featureId is null
BEGIN
 insert into Feature
  (Name, Code)
 values
  (@featureCode, @featureCode);
 set @featureId = (select top 1 Id from Feature where Code = @featureCode);
END;
delete from AdminUnitFeatureState where FeatureId = @featureId;
insert into AdminUnitFeatureState
 (SysAdminUnitId, FeatureState, FeatureId)
values
 ('A29A3BA5-4B0D-DE11-9A51-005056C00008', 1, @featureId),
 ('720B771C-E7A7-4F31-9CFB-52CD21C3739F', 1, @featureId);

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

Всем привет! Кто-нибудь делал горизонтальную прокрутку в продуктах(детали)? Саму прокрутку сделала через css(overflow-x: scroll; и width), но теперь возникла проблема если много продуктов, не видно полосу прокрутки для самых первых(так как полоса находится в самом низу).  Возможно есть идеи как зафиксировать полосу прокрутки что она всегда была видна внизу  или  что-то другое? Заранее спасибо!

Нравится

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

Добрый день

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

Добрый день

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

спасибо, работает!

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

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

Есть Бп в кором я выбираю коллекцию записей из Продукт в счете, для того чтоб потом их передать в 1с в формате json. Мне нужно выбрать поле "Code" из Продуктов чтоб потом записать  его отдельно. Выбрать я его смогла, проблема в том что я не понимаю в каком формате его нужно передать (коллекция записей?).  Буду благодарна за помощь.

Нравится

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

Добрый день, Анастасия.

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

Реализовать Вашу бизнес задачу пользовательскими средствами не получится. Для реализации необходимо использовать элемент скрипттаску и внутри кодом вычитывать значения из коллекций, соединять их по нужному признаку и передавать в веб-сервис как единую коллекцию. Либо же изменить веб-сервис таким образом, чтобы он принимал 2 разные коллекции. 

Подготовил несколько полезных ссылок с академии, в которых происходит работа с коллекциями внутри скрипттаски. Вы можете получать две такие коллекции, а потом с помощью C# создать свою коллекцию кастомных объектов(предварительно создав этот объект в конфигурации), где и объединять их. После записать данную коллекцию кастомных объектов в параметр процесса и с него брать значения для сервиса. Таким образом у Вас будет только один источник данных.
Либо же прямо в скрипттаске использовать запросы к БД, например, через EntitySchemaQuery и внутри вызывать веб-сервис с параметрами.

https://community.terrasoft.ru/questions/rabota-s-kollekciyami-v-bp
https://academy.terrasoft.ru/docs/7-16/developer/back-end_development/operatsii_s_dannymi_back_end/dostup_k_dannym_cherez_orm#reference-2158

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

Всем доброго дня! 

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

Нравится

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

Попробуйте может через CompositeObject получить коллекцию
Get<ICompositeObjectList<ICompositeObject>>("Ваш_параметр.ResultCompositeObjectList")

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

Попробуйте может через CompositeObject получить коллекцию
Get<ICompositeObjectList<ICompositeObject>>("Ваш_параметр.ResultCompositeObjectList")

Здравствуйте,  получилось немного не так:

 

var list = Get<ICompositeObjectList<ICompositeObject>>("Units");
foreach (ICompositeObject item in list) {
    
    if (item.TryGetValue<string>("Name", out string value)) {
        Set<string>("ProcessSchemaParameter1", value);
   }

}

Спасибо за помощь!)

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

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

Нравится

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

Добрый день.

 

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

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

 

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

Ivan Kuchma,

Такой вопрос, можно ли добавить уже созданную деталь просто на форму мини-карточки при помощи разработки? И обязательно ли создавать под это контейнер с полями tabs?

Глеб Макаров,

рекомендую обратить внимание на похожую тему  для миникарточки с детали, а также на статью о реализации сообщений между деталями через sandbox.
Детальнее работе с sandbox можете ознакомится в статье: https://academy.terrasoft.ua/docs/7-18/developer/front-end_development/…

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

почему при добавлении фильтра нельзя использовать значение поля NrbCity.Name?

                                    esqResult.AddAllSchemaColumns();
                                    esqResult.AddColumn("NrbCity.Name");           
                        var entity = esqResult.GetEntity(UserConnection, purchaseId);

этот код выполняется без ошибок.

а вот дальше:

esqMatching.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrCity", entity.GetColumnValue("NrbCity.Name").ToString());
ругается что 

Terrasoft.Common.ItemNotFoundException: 'Значение с именем "NrbCity.Name" не найдено'
что не так-то? как использовать значение этого поля дальше в другом фильтре?

Нравится

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

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

 

Для работы с такой колонкой можно сохранить её название в переменную и потом обращаться по нему:

string cityColumnName = esqResult.AddColumn("NrbCity.Name").Name;
...
entity.GetColumnValue(cityColumnName).ToString();

Система формирует названия таких колонок по-другому, по-моему, через подчеркивание. Вот таким образом: 'NrbCity_Name'.

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

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

 

Для работы с такой колонкой можно сохранить её название в переменную и потом обращаться по нему:

string cityColumnName = esqResult.AddColumn("NrbCity.Name").Name;
...
entity.GetColumnValue(cityColumnName).ToString();

Система формирует названия таких колонок по-другому, по-моему, через подчеркивание. Вот таким образом: 'NrbCity_Name'.

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

entity.GetColumnValue&lt;string&gt;("NrbCity.Name").Name

 

Dima Avdoshin,

это ничем не отличается от моего варианта

entity.GetColumnValue<string>("NrbCity.Name") - не будет найден

 

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

да, спасибо! именно так все и оказалось.

Gladushkin Peter,

("NrbCity.Name").Name у вас приведение к стрингу, а у меня взято свойство Name , как Аллы показано при добавлении колонки
Показать все комментарии

в проекте Terrasoft.Configuration.sln

через метадату отображатся вот такие описания встроенных методов:

public EntitySchemaQueryColumn AddColumn(EntitySchemaQueryFunction function);
        //
        // Summary:
        //     ####### # ######### ####### # ####### ###### # ##### ####### ## ######### ####
        //     # ####### ############ ######## #####.
        //
        // Parameters:
        //   columnPath:
        //     #### # ####### ##### ############ ######## #####.
        //
        // Returns:
        //     ######### ######### #######.
        //
        // Exceptions:
        //   T:Terrasoft.Common.ArgumentNullOrEmptyException:
        //     #### # ######## ######### columnPath ######## ###### ######## ### null.

почему так и как исправить на читаемое?

Нравится

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

Добрый день.

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

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

Добрый день, коллеги! Столкнулся с такой проблемой. Создал шаблон email-сообщения. Когда я отправляю письмо в бизнес-процессе по этому шаблону, оно приходит без фона блока (в качестве фона используется картинка, а не заливка). Нашёл такую закономерность, что если картинку фона сжать до 15 КБ, то она приходит в качестве фона. Но при таком сильном сжатии (с 80 КБ до 15 КБ) сильно ухудшается качество. Картинка в base64 тега table в background. Как мне заставить Creatio отправить фон, не теряя при этом в качестве изображения?  

Нравится

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

Заикин Дмитрий, добрый день!
Фоновое изображение должно отправляться независимо от размера.
Возможно проблема в блокировках изображений\вложений\файлов со стороны почтового провайдера. 
Убедитесь, что email с которого уходят письма доверенный. Также, попробуйте проверить отправку на разные почтовые провайдеры.

Заикин Дмитрий, добрый день!
Фоновое изображение должно отправляться независимо от размера.
Возможно проблема в блокировках изображений\вложений\файлов со стороны почтового провайдера. 
Убедитесь, что email с которого уходят письма доверенный. Также, попробуйте проверить отправку на разные почтовые провайдеры.

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

Добрый день, 

 

Подскажите, есть ли в Creatio контрол для загрузки изображения в колонку типа Image? 

 

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

Нравится

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

Добрый день, можете более детально описать, что вам необходимо сделать?

У меня есть карточка раздела, в которой пользователю нужно загрузить 3 картинки. Раздел привязан к сущности, у которой есть соответственно 3 колонки с типом Image. Эти изображения потом обрабатываются в событийном процессе сущности и их удобно хранить именно в самой сущности, а не в SysImage. Поэтому хотелось бы узнать существует ли способ загрузить изображение с помощью какого либо клиентского контрола прямо в сущность.

 

 

Рекомендую ознакомиться со статьей https://academy.terrasoft.ua/docs/developer/elements_and_components/bas…. Возможно она вам поможет

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

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

Есть класс 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: [
			"&lt;tpl if=\"visible != false\"&gt;",
			"&lt;li data-item-index=\"{itemIndex}\"",
			"&lt;tpl if=\"isSelected == true\"&gt;",
			"class=\"ts-sidebar-selected-item\"",
			"&lt;/tpl&gt;",
			"&gt;",
			"&lt;span class=\"vertical-strip\"&gt;&lt;/span&gt;",
			"&lt;tpl if=\"href\"&gt;&lt;a target=\"_self\" class=\"sidebar-item-link\" href=\"{href}\"&gt;&lt;/tpl&gt;",
			"&lt;div id=\"sidebar-item-wrapper-{itemIndex}\" class=\"ts-sidebar-item-wrapper\"&gt;",
			"&lt;div id=\"sidebar-item-image-{itemIndex}\" class=\"ts-sidebar-item-image\" data-item-marker=\"{caption}\" " +
			"style=\"background-image:url({imageUrl})\" &lt;tpl foreach=\"domAttributes\"&gt;{$}=\"{.}\"&lt;/tpl&gt;&gt;&lt;/div&gt;",
			"&lt;div id=\"sidebar-item-text-{itemIndex}\" class=\"ts-sidebar-item-text\"&gt; {caption} ",
			"&lt;div id=\"sidebar-item-counter-{itemIndex}\" class=\"ts-sidebar-item-counter\"&gt; {availableEntities} ",
			"&lt;/div&gt;",
			"&lt;/div&gt;",
			"&lt;tpl if=\"href\"&gt;&lt;/a&gt;&lt;/tpl&gt;",
			"&lt;/li&gt;",
			"&lt;/tpl&gt;"
		],
 
	});
	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) &amp;&amp; !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 &amp;&amp; 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) &gt;= 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, который загружается при старте. Более подробно о таком подходе см. пример в этой теме.

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