var config = {
  entitySchemaName: "OpportunityStage",
  multiSelect: true,
  columns: ["Name"]
	};
 
this.openLookup(config, this.stageFilterCallBack, this);

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

Нравится

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

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

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

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

Нравится

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

Анатолий, интеграции с 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. Если у пользователя повысить права до администратора, запрос успешно выполняется. Не могу понять что надо настроить чтобы запрос выполнялся от имени простого пользователя.

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

Нравится

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

Руслан, вообще, довольно странно. Если бы там было ограничено по правам то отдавало бы 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 разрешено, а изменить нет. Неожиданно.

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

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

Добрый день!

Пытаюсь по инструкции создать запись в таблице OpportunityFile. 

При отправке запрос сервер возвращает 500 ошибку Internal Server Error. 

Подскажите, пожалуйста, что не так делаю?

Код запроса:

curl --location --request POST 'https://my.domain.com/0/odata/opportunityfile' \
--header 'BPMCSRF: mbaZawvWrbrf0jub0ayr7O' \
--header 'Content-Type: application/json' \
--header 'Cookie: UserName=username; BPMLOADER=5vurytjra4qxcy2ym1xjsfji; .ASPXAUTH=8FFC3373A07416E90889F9B924E2FFB16B7A75335673C6A585B4FBD7941A36C709548056A1C53030AA0A65C6BC5B9C1F4D5B58195B65BA3BDBFF5F34542A423746FE1329F390C67190FD230C47E8834F89E7D448FC2C14D32C46FF77C6BB64D7A47057BA009B80E4F31093730B41DFDADEF0F70DC3A1A7130D6450ACC136080AB6DACE828A8B68420B4701C983818AFD1CF38573D7DC5E127180D93C8B8D86314CBCFCB86CCEE9E7B5EB1D30248EA25B3AC465E7ADFFA0E891FAB31B2A72627E88A5520BFC625E8701DCF9F7756E1287EA7535F445C13633DE89166AB35BE431C315AD66A10F583CD0D4E31FCC6092701635AAC199D74E9B807A632D9A3BBA2AF3BF0893BB09C9CBDBD3BA110E434B9BFEC744B464D1BF833579317AE62D59D99E58C7C3E40FC03C37BB1BFC401CD958E69A12C3B132DDF1AF7DE58176B26DC6F1DCE91B10CDBDBF98464C7D4047C512010D423A074E4A9EBEC2656F2C45CC76B77EF82C241564FE95494EA754421B45B9BDF2FFAE60853A6F6B44CDA4229AB1FF557FD4; BPMCSRF=mbaZawvWrbrf0jub0ayr7O; BPMSESSIONID=0tt2ubyrc4mo2c4ci5dpwg0w' \
--data-raw '{
    "Name": "FieldValue"
}'

 

Нравится

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

Руслан, ошибка 500 означает, что более подробная информация будет в логах приложения на веб-сервере.

Но, скорее всего, просто не заполнено обязательное поле OpportunityId в объекте, по которому должна осуществляться связь с объектом раздела, куда добавляется файл.

Руслан, ошибка 500 означает, что более подробная информация будет в логах приложения на веб-сервере.

Но, скорее всего, просто не заполнено обязательное поле OpportunityId в объекте, по которому должна осуществляться связь с объектом раздела, куда добавляется файл.

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

Подскажите, пожалуйста, где находится файл логов сервиса ODATA. Самостоятельные поиски не увенчались успехом.

Такого нет, логи общие для всего сайта. Могут писаться в файлы (Error.log и подобные) или в базу, если так настроено логирование.

В файле Error.log имеется единственная запись:

2020-12-23 08:24:08,710 [1] ERROR IIS APPPOOL\BPMonline Terrasoft.Core.Entities.Events.EntityEventListenersLoader CreateListenerInstance - Error while creating entity event instance of type FileSecurityExcludedUriEventListener
Terrasoft.Core.InstanceActivationException: Error creating an instance of the "Terrasoft.Web.FileSecurity.IFileSecurityExcludedUrisProvider" class ---> Ninject.ActivationException: Error activating IFileSecurityExcludedUrisProvider using binding from IFileSecurityExcludedUrisProvider to method
Provider returned null.
Activation path:
  1) Request for IFileSecurityExcludedUrisProvider
 
Suggestions:
  1) Ensure that the provider handles creation requests properly.
 
   at Ninject.Activation.Context.ResolveInternal(Object scope)
   at Ninject.Activation.Context.Resolve()
   at Ninject.KernelBase.Resolve(IRequest request, Boolean handleMissingBindings)
   at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
   at Terrasoft.Core.Factories.ClassFactory.GetInstance[T](Func`1 action)
   --- End of inner exception stack trace ---
   at Terrasoft.Core.Factories.ClassFactory.GetInstance[T](Func`1 action)
   at DynamicInjector7f791e96d519466d85d3463387ed1a0f(Object[] )
   at Ninject.Activation.Context.ResolveInternal(Object scope)
   at Ninject.Activation.Context.Resolve()
   at Ninject.KernelBase.Resolve(IRequest request, Boolean handleMissingBindings)
   at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, String name, IParameter[] parameters)
   at Terrasoft.Core.Factories.ClassFactory.GetInstance[T](Func`1 action)
   at Terrasoft.Core.Entities.Events.EntityEventListenersLoader.CreateListenerInstance(Type classType)

Имеет ли она отношение к проблеме?

К проблеме, скорее всего, относится то, что в запросе нет значения поля OpportunityId, которое в объекте обязательное.

Или с ним будет то же самое?

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

Добрый день!

Перед мной стоит такая задача. Нужно в бизнес-процессе, который запускается периодически (раз в 10 минут), получать список Обращений (Case) по определенному критерию и затем по каждому такому Обращению отправлять письмо. Я читал, что можно сформировать список объектов и передать его каким-то образом в бизнес-процесс, который обрабатывал бы этот список и отправлял письма. К сожалению, не могу найти примеров такого решения. Возможно, кто-то может дать ссылку на описание подобного варианта? Или же есть более удобные способы решения такой задачи? Заранее спасибо за ответ.

Нравится

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

Добрый день.

 

Посмотрите описание решения подобной задачи в статье по работе с коллекциями.

Добрый день.

 

Посмотрите описание решения подобной задачи в статье по работе с коллекциями.

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

 Большое спасибо за Ваш ответ. Очень полезная ссылка.

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