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

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

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

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

Место указал. Подскажите как это делается и почему не отражается. Добавил поле во всех 3-х видах мини-карточки - "Добавление" "Редактирование" и "Просмотр", но не помогло. Куда дальше смотреть не знаю.

Нравится

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

Александр, перезапуск, чистка Redis и кэша браузера не помогли?

Как именно добавили для разных видов?

Зверев Александр, Добавил через мастер раздела, в редактировании мини-карточки сначала. А затем нашёл вот такой код:  

Но и с его помощью получилось добиться лишь такого результата: 

 

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

 

Что Вы имеете в виду под «мини-версией этой мини-карточки», режим просмотра (третий в мастере)?

Если так, то зачем там вообще возможность редактирования?

У Вас проблема, что поля нет или что оно заблокировано?

 

Если открыть в мастере стандартную карточку, например, контакта, видно, что в режиме просмотра нет большинства добавленных в мастере полей, а есть разработанные кодом блоки, например, JobInfoContainer. В схеме ContactMiniPage в пакете UIv2 видно его логику:

{
	"operation": "insert",
	"name": "JobInfoContainer",
	"parentName": "MiniPage",
	"propertyName": "items",
	"values": {
		"id": "JobInfoContainer",
		"visible": {"bindTo": "isViewMode"},
		"selectors": {"wrapEl": "#JobInfoContainer"},
		"itemType": Terrasoft.ViewItemType.CONTAINER,
		"wrapClass": ["jobinfo-mini-wrap"],
		"items": [],
		"layout": {
			"column": 0,
			"row": 10,
			"colSpan": 24
		}
	}
},
{
	"operation": "insert",
	"parentName": "JobInfoContainer",
	"propertyName": "items",
	"name": "JobInViewMode",
	"values": {
		"labelConfig": {
			"visible": false
		},
		"bindTo": "JobViewValue",
		"isMiniPageModelItem": true
	}
},
{
	"operation": "insert",
	"parentName": "JobInfoContainer",
	"propertyName": "items",
	"name": "AccountInViewMode",
	"values": {
		"labelConfig": {
			"visible": false
		},
		"bindTo": "Account",
		"isMiniPageModelItem": true
	}
},
...
/**
 * Job value in view mode.
 * @type {String}
 */
"JobViewValue": {
	"dataValueType": Terrasoft.DataValueType.TEXT,
	"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
},

В них для чтения отображается либо текст обычного поля (Account), либо вычисляемого при открытии в onEntityInitialized виртуального поля JobViewValue.

 

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

 

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

 

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

 

Проверил по стандартным разделам, таких карточек просмотра с редактируемыми полями не встречается.

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

Как обновить эту часть через js после нажатия на кнопку выбора?

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

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

 

 

Есть такой код, фильтрация добавляется нормально, данные обновляются только после использования любого другого фильтра(по типу "Ответственного").

stageFilterCallBack : function(args) {
    this.selectedRows = args.selectedRows.getItems();
    var selectdIds = [];
 
    this.selectedRows.forEach(function(item) {
      selectdIds.push(item.value);
    }, this);
 
    this.set("CurrentStageFiltersSelectedItems", selectdIds);
 
	const filters = this.get("SectionFilters");
    var filialFilter = this.Terrasoft.createColumnInFilterWithParameters("Stage.Id", selectdIds);
    filialFilter.comparisonType = this.Terrasoft.ComparisonType.EQUAL;
 
    filters.removeByKey("stageFilter");
    filters.add("stageFilter", filialFilter);
 
    this.updateDetail(
    {
	  detail: "UsrSchema4Detailf84a3cb6",
      reloadAll: true
    }
  );
}

 

Нравится

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

Для обновления реестра следует использовать метод

this.reloadGridData();

updateDetail работает только для деталей

Для обновления реестра следует использовать метод

this.reloadGridData();

updateDetail работает только для деталей

Показать все комментарии
var config = {
  entitySchemaName: "OpportunityStage",
  multiSelect: true,
  columns: ["Name"]
	};
 
this.openLookup(config, this.stageFilterCallBack, this);

Создаю справочник с множественным выбором в разделе таким образом. 

Но при открытии еще раз, выбранные элементы в прошлое открытие не остаются. Как это можно реализовать? Возможно есть что-то типо "selectedTypes: [выбранные id]" в конфиге?

Нравится

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

Надо было всего лишь добавит в конфигурацию openLookup код ниже.

var currentStageFilters = this.get("CurrentStageFiltersSelectedItems");
 
var config = {
  entitySchemaName: "OpportunityStage",
  multiSelect: true,
  columns: ["Name"],
  selectedValues: currentStageFilters,
};
 

Где "currentStageFilters" это список выбранных Id справочника.

Надо было всего лишь добавит в конфигурацию openLookup код ниже.

var currentStageFilters = this.get("CurrentStageFiltersSelectedItems");
 
var config = {
  entitySchemaName: "OpportunityStage",
  multiSelect: true,
  columns: ["Name"],
  selectedValues: currentStageFilters,
};
 

Где "currentStageFilters" это список выбранных Id справочника.

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

Всем добрый день!

Возник такой вопрос:

Существуют в системе Directum Типовые маршруты где необходимо работать с документами, то есть есть возможность прямо на серверном уровне открывать документ Word и Excel и его редактировать, затем после редактирования  все правки сохраняются в тех же файлах. А есть ли подобный функционал в Creatio или плагин.

Нравится

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

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

  • File X (Расширенная работа с файлами: просмотр, редактирование и версионность);
  • File core (Расширенные возможности работы с файлами через интеграцию с Google Suite. Создание / редактирование / просмотр файлов в интерфейсе Creatio);
  • Sharepoint connector (Хранение и совместная работа с файлами с помощью SharePoint);
  • Files extended (Предпросмотр, совместное онлайн-редактирование и версионность файлов);
  • Docs (Система управления корпоративной информацией на платформе Creatio).

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

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

  • File X (Расширенная работа с файлами: просмотр, редактирование и версионность);
  • File core (Расширенные возможности работы с файлами через интеграцию с Google Suite. Создание / редактирование / просмотр файлов в интерфейсе Creatio);
  • Sharepoint connector (Хранение и совместная работа с файлами с помощью SharePoint);
  • Files extended (Предпросмотр, совместное онлайн-редактирование и версионность файлов);
  • Docs (Система управления корпоративной информацией на платформе Creatio).

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

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

Добрый день!



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

 

Например:

1. Счёт

     1.1. Категория продукта 1

         1.1.1. Продукт 1

         1.1.2. Продукт 2

     1.2 Категория продукта 2

         1.2.1. Продукт 3

         1.2.2. Продукт 4



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

Нравится

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

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

Или не view, а записи в специальной таблице, наполняемой программно для каждого построения отчёта.

Идея  о возможности выводить табличные части в виде иерархического (древовидного) реестра уже заведена и принята.

View не годится, так как у разных уровней разное форматирование в Word'e.



Как я понимаю, тогда только в Fast report?

Либо чисто программно формировать в скрипте документ Word с каким угодно форматированием при помощи библиотеки  DocumentFormat.OpenXml.dll, которая загружена в систему и используется и в стандартных схемах ReportService, WordReportingDesignWorker, WordReportUtility и WordReportGenerator.

Но перед этим проверьте в маркете существующие движки отчётов, нет ли там такого формата, который Вам нужен.

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

Здравствуйте. Есть задача, для разных ролей выводить разный набор колонок, для раздела. Нашёл метод "initializeProfile" в схеме "BaseSchemaViewModel", в котором проставляется значение переменной "Profile". Я добавляю свою колонку, но в итоге она не выводится в реестр, хотя например если зайти в настройку колонок реестра, то там видна моя добавленная колонка, тогда не понятно почему она не видна в реестре раздела. Как вообще правильно сделать эту таску?

initializeProfile: function(callback, scope) {
				this.requireProfile(function(profile) {
					var profileColumnName = this.getProfileColumnName();
					if (profile && profile.DataGrid && profile.DataGrid.tiledConfig) {
						var prifileDataGrid = JSON.parse(profile.DataGrid.tiledConfig);
						prifileDataGrid.items.pop();
						prifileDataGrid.items.push({
							"bindTo": "PlaceOfBirth",
							"caption": "Место рождения",
							"position": {
							  "column": 17,
							  "colSpan": 7,
							  "row": 2
							},
							"dataValueType": 1,
							"metaPath": "PlaceOfBirth",
							"path": "PlaceOfBirth",
							"captionConfig": {
							  "visible": true
							}
						});
						profile.DataGrid.tiledConfig = JSON.stringify(prifileDataGrid);
					}
					this.set(profileColumnName, profile);
					Ext.callback(callback, scope);
				}, this);
			}

 

Нравится

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

Александр, добрый день!

 

Реализовать вашу задачу можно добавив в таблицу SysProfileData записи с определёнными ключами и правильным содержанием ObjectData и переопределив метод получения Profile получать нужное содержание по сформированному ключу по вашему условию.

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

А вы не слишком заморочились? Не проще ли научить пользователей менять состав колонок? 

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

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

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

Изображение удалено.Не хватает настройки формата: минута и час

Нравится

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

И "Год и неделя"

Дамиан, Владимир, спасибо за информацию, завели такую идею.

Логика наполнения этого выпадающего списка реализована в схеме ChartDesigner:

/**
 * Returns the object of types of date.
 * @private
 * @return {Object} Returns the object of types of date.
 */
getDateTimeFormatDefaultConfig: function() {
	const dateTimeFormatDefaultConfig = {
		"Year": {
			value: "Year",
			displayValue: this.get("Resources.Strings.DateTimeFormatYear")
		},
		"Month;Year": {
			value: "Month;Year",
			displayValue: this.get("Resources.Strings.DateTimeFormatMonthYear")
		},
		"Month": {
			value: "Month",
			displayValue: this.get("Resources.Strings.DateTimeFormatMonth")
		},
		"Week": {
			value: "Week",
			displayValue: this.get("Resources.Strings.DateTimeFormatWeek")
		},
		"Day;Month;Year": {
			value: "Day;Month;Year",
			displayValue: this.get("Resources.Strings.DateTimeFormatDayMonthYear")
		},
		"Day;Month": {
			value: "Day;Month",
			displayValue: this.get("Resources.Strings.DateTimeFormatDayMonth")
		},
		"Day": {
			value: "Day",
			displayValue: this.get("Resources.Strings.DateTimeFormatDay")
		},
		"Hour": {
			value: "Hour",
			displayValue: this.get("Resources.Strings.DateTimeFormatHour")
		}
	};
	return dateTimeFormatDefaultConfig;
},

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

У меня так получилось, когда подменил одно из значений на:

{value:"Week;Year", displayValue: "Неделя и год"}

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

Формат для часов и минут, увы, не подобрал. Вероятно, такой фильтрации в ESQ и нет.

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

Создал веб-сервис опроса погоды. В выходных данных есть поля дат. Эти даты надо сконвертировать из int в DateTime.Изображение удалено.

Не могу понять, как обратиться к параметрам веб-сервиса из задания-сценария?

Set("dt", GetDt(Get<int>("WebService1.dt")));
Set("sys_sunrise", GetDt(Get<int>("WebService1.sys_sunrise")));
Set("sys_sunset", GetDt(Get<int>("WebService1.sys_sunset")));
return true;

 

Нравится

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

Можно точнее? Что значит из int в DateTime?

public DateTime GetDt(int unixDate)
{
    var dt = new DateTime(1970,1,1,0,0,0,0, DateTimeKind.Utc);
    dt = dt.AddSeconds(unixDate).ToLocalTime();
    return dt;
}

Стандартный метод преобразования unix long в DateTime.

Дамиан, Вы можете создать в БП параметры нужного типа и связать их со входящими параметрами веб-сервиса. Затем из скрипта работать уже с ними, используя Get.

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

Можете привести код или ссылки?

Дамиан, как работать с параметрами при помощи Get, есть тут.

Я имею в виду, что в дизайнере БП привязать параметр процесса к исходящему параметру веб-сервиса, а затем работать уже с ним.

 

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

Каким образом можно добавить свою кнопку, которая будет видна только администратору, запускающую БП в Дизайнер системы?

 

 

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

Нравится

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

Замещаете кл. схему SystemDesigner

В diff

{

                "operation": "insert",

                "propertyName": "items",

                "parentName": "<Название контейнера родительского блока>",

                "name": "Название Элемента ",

                "values": {

                    "itemType": Terrasoft.ViewItemType.LINK,

                    "caption": {

                        "bindTo": "Заголовок"

                    },

                    "tag": "Метод обработчик клика",

                    "click": {"bindTo": "invokeOperation"}

                }

            }

В methods добавляете 

"Метод обработчик клика": function() {

                this.openSection("Название схемы раздела");  //Например

            }

Замещаете кл. схему SystemDesigner

В diff

{

                "operation": "insert",

                "propertyName": "items",

                "parentName": "<Название контейнера родительского блока>",

                "name": "Название Элемента ",

                "values": {

                    "itemType": Terrasoft.ViewItemType.LINK,

                    "caption": {

                        "bindTo": "Заголовок"

                    },

                    "tag": "Метод обработчик клика",

                    "click": {"bindTo": "invokeOperation"}

                }

            }

В methods добавляете 

"Метод обработчик клика": function() {

                this.openSection("Название схемы раздела");  //Например

            }

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

Добрый день!

От имени пользователя добавляю запись в таблицу OpportunityFile с помощью POST запроса - все успешно. При попытке загрузить файл в поле Data с помощью запроса PUT, запрос возвращает ошибку 404. Если у пользователя повысить права до администратора, запрос успешно выполняется. Не могу понять что надо настроить чтобы запрос выполнялся от имени простого пользователя.

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

Нравится

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

Руслан, вообще, довольно странно. Если бы там было ограничено по правам то отдавало бы 403 для пользователя. Можете показать примеры запросов? Точно в обоих случаях одинаковые?

 

Также проверьте, нет ли ограничений прав на объекте OpportunityFile: на операции, записи, поле Data.

Вот такой код запроса на изменение поля Data:

curl --location --request PUT 'https://my.company.com/0/odata/OpportunityFile(f7cb87e9-dea4-4609-95f6-5ce7ca499544)/Data' \
--header 'BPMCSRF: qR7NHdxnvLVamFiF4QnCsu' \
--header 'Content-Type: application/pdf' \
--header 'Cookie: BPMLOADER=hhv02mucokh1hdvnnrrna43e; UserName=99|97|98|105|110|101|116|68|105|115|116|114|105|98|117|116|111|114; BPMSESSIONID=zxfuxvecmcjbg0vteh1ibpvh; .ASPXAUTH=45F3530449360B52EC8592892D0588D74F78D2F37E2A91893700AB56ED32E3589FE972BF81199EE6EF9DBA8D6F3A0341586187B1D5C03358262C3E0DF181FE5DE68AB65946E18A742A83EAB74BD1A5DDE5BE6A99CEA0F5EC1574FE9A746D193CB161A330A4732121728AA5F43D2F4D252D844867C0CEDD6E9BC507012C6FF202A540A311D80980E6C4290C8426EF0E0E37B73543828236BFC59E8EABB3158132B0BA2566D72649E0942BC708DDA1264793A6302875345757E32AA1F8E8688C1C8DD9A192CA06BF8B3BC077C420F46C6211B3D37BEB674450533514FF33AA21D72B616E22CEDBBC999D5AB7B66F0BF45E10290E814024AB1550A8455978A60BC124CDE2458A99E26613202F55BA2BF2381FC057CAAF0669170605291C61DD6764A25A3694999D88BE8E3ACA371C225B88D02D46F40791CB11B6928C7587231A3E04CED54910D82498580AA62AC2DBF66088F43B35E09B07ABE3F8182A9250501969C958DBC9464682AE07DEF13C7D1D4C910AEAFBD8A6C2CEE558DA3087EB956F8EE24346; BPMCSRF=qR7NHdxnvLVamFiF4QnCsu' \
--data-binary '@/D:/Docs/Pictures/kyoScan-‎4‎.‎23‎.‎2020-‎14‎.‎07‎.‎08.pdf'

Он не меняется, менял только права пользователя (повышал до админа). С админскими правами работает, без - нет. 

Вообще с самого начала все было выполнено от имени администратора (себя), чтобы исключить влияние прав и проверить работоспособность запросов. Когда все заработало от администратора, я стал проверять от имени пользователя (не себя). Запрос на добавление сработал, на изменение - нет.  Повысил права рядового пользователя до админа и запрос сработал. Вернул обратно - не работает.

Ограничения по колонкам не настроены.

У пользователя есть право на системную операцию CanUseODataService? Хотя, выше пишете, что POST у него прошёл...

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

Да, есть. 

Можно было бы понять если бы были ошибки типа 401, 403 или 406, но никак не 404. Руслан, а если завести демо-сайт в облаке и отправлять такие запросы на него, тоже воспроизводится? 

Спасибо, Александр, за подсказку. Развернул тестовую базу в облаке с версией 7.17, у нас 7.16.4. Боялся что из-за разницы в версиях ошибка не воспроизведется. Но, нет, ошибка такая же. 

Руслан, у меня на демо-сайте 7.17 не воспроизвелось: и под админом, и под пользователем файл успешно обновился. Пробовал не в curl, а в Fiddler, и на тестовом сайте не была включена проверка BPMCSRF. Пользователя в группы не включал, права на чтение и изменение записи о продаже дал вручную. Файл создал в интерфейсе, то есть на момент запроса поле Data уже было со старым содержимым.

Значит, ошибка не в «коробке», а что-то неправильно отправляете к серверу. 

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

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

У меня и под администратором, и под пользователем файл обновляется. Без точного описания, как воспроизвести, не могу сказать, что неправильно.

 

А если, как и в моём примере, файл на момент запуска PUT уже есть, у Вас тоже такая ошибка?

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

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

Вот результат запроса от имени администратора (200 Ок):

Вот результат от имени пользователя 404 (Not Found):

Выполнено на тестовой платформе - https://041470-sales-enterprise.terrasoft.ru/

Руслан, попробуйте не в Postman, а в Fiddler, как на моих скриншотах. Сейчас приведенного тестового сайта уже нет, проверить на нём не могу.

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

Ссылка на тестовую платформу устарела, сгенерировал новое тестовое приложение

Все таки дело было в правах, но оказалось что права проверялись не на таблицу OpportunityFile, а на Opportunity. Интересно получается, создать запись в таблице OpportunityFile разрешено, а изменить нет. Неожиданно.

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

Хороший вопрос, Александр. Проверял на двух площадках: тестовое приложение компании и тестовая, которая дается в рамках тест-драйва от Террасофт. Права, конечно же, были настроены по разному. На тот момент я не думал что дело было в правах, и на тестовой площадке ни чего кроме того что добавил тестового пользователя не делал. Сегодня проверил как было настроено на тестовой платформе - там вообще ни чего не было настроено по правам для тестового пользователя (у создателя тестовой площадки права администратора. Продажа принадлежит администратору). К тому же, самое важное, что я сегодня обнаружил, это то что запрос на изменение данных начинает работать если добавить права на ЧТЕНИЕ продажи, а не на изменение. Т.е. я сначала сразу добавил права на изменение продажи - не работает, добавил на чтение - заработало, убрал права на изменение (запрещающих прав нет) - все равно работает. Как то не логично, если же есть логика, дайте, пожалуйста, объяснение.

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

Либо напишите всё это в поддержку.

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