Добрый день. Подскажите, пожалуйста, возможно ли средствами Creatio использовать формулу в дашборде "Показатель" на главной странице? Например, в представлении "Итоги" для определенного раздела это можно сделать при помощи дашборда "Список" и сводной таблице.

Нравится

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

Добрый день,

 

К сожалению, в дашборд "Показатель" нет возможности использовать формулу. 

 

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

 

Всего хорошего!

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

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

Нравится

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

Добрый день,

 

Мы подумали как можно это реализовать и возможный вариант такой:

 

1) В схеме детали нужно создать два аттрибута:

attributes: {
			"GridDataCollectionAttr": {
				dataValueType: Terrasoft.DataValueType.COLLECTION,
				value: {}
			},
 
			"ClickNumber": {
				dataValueType: Terrasoft.DataValueType.INTEGER,
				value: 0
			},
		},

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

 

2) В схеме детали нужно написать два метода (один - переопределение базового метода onGridDataLoaded, второй - кастомный метод, который будет динамически менять список реестра):

onGridDataLoaded: function() {
				this.callParent(arguments);
				const gridData = this.getGridData();
				if (gridData && gridData.collection.length > 0) {
					// var test = {...gridData};
					var gridDataCollectionClone = gridData.collection.clone();
					// var test = Ext.clone(gridData);
					this.set("GridDataCollectionAttr", gridDataCollectionClone);
					gridData.clear();
					// test.collection.addAll(gridDataCollectionClone.items);
					var copiedGridData = this.get("GridDataCollectionAttr");
					var originalKey = copiedGridData.keys[0];
					var originalItem = copiedGridData.getAt(0);
					gridData.insert(0, originalKey, originalItem);
				}
			},
 
			onContactAddressLoadButtonClick: function() {
				var copiedGridData = this.get("GridDataCollectionAttr");
				var copiedGridDataLength = copiedGridData.length;
				if (copiedGridDataLength != 0) {
					var numberOfClicks = this.get("ClickNumber");
					numberOfClicks += 1;
					this.set("ClickNumber", numberOfClicks);
					if (copiedGridData.length == numberOfClicks) {
						this.set("ClickNumber", 0);
						numberOfClicks = 0;
					}
					const gridData = this.getGridData();
					var keyToAdd = copiedGridData.keys[numberOfClicks];
					var itemToAdd = copiedGridData.getAt(numberOfClicks);
					gridData.clear();
					gridData.insert(0, keyToAdd, itemToAdd);
					console.log(copiedGridData);
				}
			}

3) В diff добавить саму кнопку:

 {
                "operation": "insert",
                "name": "ShowNextRecordButton",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.ShowNextRecordButtonCaption"},
                    "click": {"bindTo": "onContactAddressLoadButtonClick"},
                    "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                }
            }

И добавить локализируемую строку ShowNextRecordButtonCaption в схему детали.

 

Задумка такая, что при первичной загрузке реестра выполняется проверка на то, есть ли в реестре записи или нет. Если их нет, то кастомизация ничего не сделает, реестр просто завершит загрузку. Если же реестр не пустой, то мы копируем его в аттрибут GridDataCollectionAttr, оригинальный реестр очищаем, из аттрибута берем первый элемент коллекции и записываем его в оригинальный реестр. По нажатию на кнопку мы проходим по копии и по номеру нажатия выбираем соответствующий элемент из копии, очищаем оригинальный грид и пишем выбранный из копии элемент в оригинальный грид. Если кол-во кликов по кнопке становится равным длине копии (аттрибута) - обнуляем счетчик и начинаем сначала.

 

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

Добрый день,

 

Мы подумали как можно это реализовать и возможный вариант такой:

 

1) В схеме детали нужно создать два аттрибута:

attributes: {
			"GridDataCollectionAttr": {
				dataValueType: Terrasoft.DataValueType.COLLECTION,
				value: {}
			},
 
			"ClickNumber": {
				dataValueType: Terrasoft.DataValueType.INTEGER,
				value: 0
			},
		},

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

 

2) В схеме детали нужно написать два метода (один - переопределение базового метода onGridDataLoaded, второй - кастомный метод, который будет динамически менять список реестра):

onGridDataLoaded: function() {
				this.callParent(arguments);
				const gridData = this.getGridData();
				if (gridData && gridData.collection.length > 0) {
					// var test = {...gridData};
					var gridDataCollectionClone = gridData.collection.clone();
					// var test = Ext.clone(gridData);
					this.set("GridDataCollectionAttr", gridDataCollectionClone);
					gridData.clear();
					// test.collection.addAll(gridDataCollectionClone.items);
					var copiedGridData = this.get("GridDataCollectionAttr");
					var originalKey = copiedGridData.keys[0];
					var originalItem = copiedGridData.getAt(0);
					gridData.insert(0, originalKey, originalItem);
				}
			},
 
			onContactAddressLoadButtonClick: function() {
				var copiedGridData = this.get("GridDataCollectionAttr");
				var copiedGridDataLength = copiedGridData.length;
				if (copiedGridDataLength != 0) {
					var numberOfClicks = this.get("ClickNumber");
					numberOfClicks += 1;
					this.set("ClickNumber", numberOfClicks);
					if (copiedGridData.length == numberOfClicks) {
						this.set("ClickNumber", 0);
						numberOfClicks = 0;
					}
					const gridData = this.getGridData();
					var keyToAdd = copiedGridData.keys[numberOfClicks];
					var itemToAdd = copiedGridData.getAt(numberOfClicks);
					gridData.clear();
					gridData.insert(0, keyToAdd, itemToAdd);
					console.log(copiedGridData);
				}
			}

3) В diff добавить саму кнопку:

 {
                "operation": "insert",
                "name": "ShowNextRecordButton",
                "parentName": "Detail",
                "propertyName": "tools",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {"bindTo": "Resources.Strings.ShowNextRecordButtonCaption"},
                    "click": {"bindTo": "onContactAddressLoadButtonClick"},
                    "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                }
            }

И добавить локализируемую строку ShowNextRecordButtonCaption в схему детали.

 

Задумка такая, что при первичной загрузке реестра выполняется проверка на то, есть ли в реестре записи или нет. Если их нет, то кастомизация ничего не сделает, реестр просто завершит загрузку. Если же реестр не пустой, то мы копируем его в аттрибут GridDataCollectionAttr, оригинальный реестр очищаем, из аттрибута берем первый элемент коллекции и записываем его в оригинальный реестр. По нажатию на кнопку мы проходим по копии и по номеру нажатия выбираем соответствующий элемент из копии, очищаем оригинальный грид и пишем выбранный из копии элемент в оригинальный грид. Если кол-во кликов по кнопке становится равным длине копии (аттрибута) - обнуляем счетчик и начинаем сначала.

 

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

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

Добрый день!

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

Нравится

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

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

 

Детально данная информация описана на нашей Академии в соответствующей статье



С уважением, 

Анастасия

 

Александр, 

 

Приношу извинения за недопонимаем. Относительно сортировки в отчетах приложения Excel reports builder, на данный момент нет возможности настроить сортировку записей в данном решении.

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



С уважением, 

Анастасия

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

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

Существует ли инструкция по обновлению продуктов Creatio на ОС Linux?  Как перейти на новую версию? 

Как этот:

https://academy.terrasoft.ru/docs/release/instrukciya-po-obnovleniyu-si…

 

Нравится

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

Добрый день, Айнур!

 

Для получения инструкции и необходимых файлов для обновления на NetCore, необходимо обратиться к технической поддержке Terrasoft по адресу support@terrasoft.ru.

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

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

Нравится

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

Специального механизма массовой актуализации данных в интерфейсе нет.

 

Как вариант, можно использовать разработку в файловой системе. Если выгрузить привязки в ФС, то с помощью любого продвинутого текстового редактора и регулярных выражений можно произвести массовые изменения по файлам привязок, а потом загрузить полученные файлы обратно в БД (ну или залить в SVN). Аналогичные манипуляции можно провести напрямую в БД (таблица SysPackageSchemaData), только в таком случае процесс будет еще более сложным.

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

Добрый день. Подскажите почему может не работать пользовательский макрос в email рассылке, который делаю согласно по образу и подобию статьи на академии https://academy.terrasoft.ru/docs/developer/elements_and_components/ema…

Нравится

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

Добрый день. 



Предоставьте макрос и выгрузку из таблицы EmailTemplateMacros для данного макроса.

Mykhailo Storozhuk, 

using System;
using Terrasoft.Core;
 
namespace Terrasoft.Configuration
{  
    /// <summary>
    /// Макрос, возвращает текущую дату +n дней от текущей.
    /// </summary>
    public class NrbEmailCurrentDatePlusMacros : IMacrosInvokable
    {
 
		public UserConnection UserConnection
        {
            get;
            set;
        }
 
        public string GetMacrosValue(object arguments)
        {
            var date = DateTime.Today;
 
            if(!arguments.Equals(null))
			{
                var days = Convert.ToInt32(arguments.ToString());
                date = date.AddDays(days);
            }           
 
            return date.Date.ToString("dd.MM.yyyy");
        }
    }
}

 

Кириллов Игорь,

 

При работе с макросом возникает ошибка "Input string was not in a correct format." на этапе конвертации Convert.ToInt32(arguments.ToString()); ,так как в строке возвращается объект и id записи, которые не преобразовать в число.

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

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

Нравится

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

Добрый день, Рустем.

 

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

 

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

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