Есть задача: при изменении ответственного в продаже предоставить доступ к этой продаже ответственному и роли, в которую он входит

 

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

Таким образом построен бизнес-процесс: реагируем на событие изменения ответственного, читаем данные ответственного, читаем данные пользователя из "объекта администрирования", читаем роль из "вхождения пользователя в роли" где пользователь=читать данные пользователя.Id, а роль равна одной из необходимых нам. Далее, даём права ответственному и через исключающее "ИЛИ" проверяем: если роль из "вхождения пользователя в роли" == Guid.Empty, то выходим из процесса, иначе даём права роли.



После обновления на 7.16.2 в этой проверке "если роль из "вхождения пользователя в роли" == Guid.Empty" начала возникать ошибка: Uncaught TypeError: Cannot read property '1' of null 

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

Нравится

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

Константин, было бы понятнее, если бы привели пример кода или настройки, которые работали под старой версией и перестали под 7.16.2. А заодно указали, с какой версии было обновление. Движок процессов неоднократно менялся.

 

Далее, не очень понятно, зачем сравнивать значение с Guid.Empty, это же {00000000-0000-0000-0000-000000000000}.  Почему бы не считать количество записей в выборке из объекта «Вхождение пользователя в роли» с нужным условием? А потом сравнивать, ноль или больше.

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

Павел, может, тоже зависит от количества считываемых в элементе записей (0 или больше)?

Зверев Александр, вот на такого рода условия ругаются, вместо Guid.Empty может быть что-то другое. Ругается именно на первую часть условия. Если его заменить на допустим сравнение с переменной процесса, то ошибки нет.

Считайте количество записей.

Зверев Александр, при чем считать кол-во записей? А если в условии идет сравнение с каким-то справочным значением, а не с Guid.Empty? в этом случае тоже процесс не сохранится. Посмотрю, изменилось ли что-то в версии 7.16.3, если нет, то опишу проблему в саппрорт.

Для получения верного результата нужно не сравнивать Null с Guid.Empty, а подсчитать, есть ли в базе >0 записей, соответствующих условию.

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

  Всем доброго времени суток! Подскажите, возможно ли использовать анонимный ws в качестве веб-хука, например для Telegram-bot?

Благодарю.

Нравится

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

1. Создаем анонимный сервис.

2. Добавляем в него метод по аналогии с HandleWebHookEvents в MandrillService:

[OperationContract]

        [WebInvoke(Method = "*", UriTemplate = "HandleWebHookEvents")]

        public void HandleWebHookEvents(Stream mandrill_events) {

}

Он принимает stream, и может ничего не возвращать. 



Как читать raw поста можно погуглить либо взять из того же метода пример.

Алексей, по поводу веб-хуков см. в этом обсуждении. Там упоминаются готовые примеры в системе и сторонних дополнениях.

1. Создаем анонимный сервис.

2. Добавляем в него метод по аналогии с HandleWebHookEvents в MandrillService:

[OperationContract]

        [WebInvoke(Method = "*", UriTemplate = "HandleWebHookEvents")]

        public void HandleWebHookEvents(Stream mandrill_events) {

}

Он принимает stream, и может ничего не возвращать. 



Как читать raw поста можно погуглить либо взять из того же метода пример.

Чтобы быстро понять, что приходить в вебхуке и как это парсить, используйте https://webhook.site/. 

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

Доброго времени суток! Я пытаюсь создать процесс, как в статье. В соответствии с инструкцией был создан процесс "Add New External Contact".Изображение удалено. Были добавлены параметры "Contact Name" и "Contact Phone" Изображение удалено.("Contact Phone" имеет полностью аналогичные параметры).

Задание-сценарий "Add contact" имеет имя "ScriptTaskAddContact" и код

// Создание экземпляра схемы объекта "Контакт".
var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
// Создание экземпляра нового объекта.
var entity = schema.CreateEntity(UserConnection);
// Установка значений по умолчанию для колонок объекта.
entity.SetDefColumnValues();
// Установка значения колонки "Name" из параметра процесса.
entity.SetColumnValue("Name", ContactName);
// Установка значения колонки "Phone" из параметра процесса.
entity.SetColumnValue("Phone", ContactPhone);
// Сохранение нового контакта.
entity.Save();
 
return true;

При попытке сохранить появляется две ошибки: 

The name 'ContactName' does not exist in the current context

и 

The name 'ContactPhone' does not exist in the current context

Пробовал переименовать параметры "Contact Name" и "Contact Phone" (ничего не дало), взять в кавычки ContactName и ContactPhone (сохранение проходит успешно, но при попытке обратиться к процессу через GET-запрос не происходит ничего, запрос завершается с кодом 200)

Нравится

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

Глеб, дело не в запуске из сервиса. Сейчас к параметрам нужно обращаться через Get и Set.

string contactName = Get<string>("ContactName");

Подробнее см. в теме.

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

Коллеги, кто нибудь вел разработку по принципу пакет-проект, из статьи мало понятно как действовать. Есть вопросы:

  1. При выгрузки пакетов ФС папка Files не создалась(кастомный пакет) - можно добавить вручную?
  2. Можно ли добавлять данное решение в существующий пакет?
  3. В папку Files добавлять ProjectName.dll или весь solution?
  4. Проект создавать как библиотеку классов + подключать в зависимости пакет Terrasoft? 

В общем что то в этом роде.

Заранее благодарен!

Нравится

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

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

 

На странице clio перечислены её команды для создания, загрузки и выгрузки пакетов.

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

с установкой пакета разобрался, теперь вот вопрос как использовать встроенные классы при разработке в ФС?

Вот пытаюсь определить переменную с данным типом -https://prnt.sc/tqf1ps

Что делаю не так?

Если брать данную dll - https://prnt.sc/tqf4n0 и вставлять во Внешние сборки(https://prnt.sc/tqf4z5) тогда смысл данного решения?

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

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

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

 

Его автор ответил по поводу того, что Вы спрашивали о смысле этого решения: 

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

Основная польза от такого решения – согласовав API, можно поставлять решение без компиляции основного приложения.

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

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

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

 

Пакет-проект - это пакет который содержит только файловый контент, который в папке пакета располагается в папке Files.

В файловом контенте расположен обычный проект .net, а компиляция у него настроена в папку Bin.

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

Приложение загружает библиотеки (dll) из папки Files\Bin и ищет в них сервисы, а найденные сервисы активирует.

В проекте не будут видны конфигурационные классы, так же как и классы из данного проекта не будут видны коду в конфигурации, это изолированные сервисы.

 

Ответы на вопросы:

 При выгрузки пакетов ФС папка Files не создалась(кастомный пакет) - можно добавить вручную?

Ее можно создать вручную

   Можно ли добавлять данное решение в существующий пакет?

Можно.

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

Для ее включения надо в Web.config загрузчика добавить

<add key="Feature-UseCompilationByNecessity" value="true" /> 

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

  В папку Files добавлять ProjectName.dll или весь solution?

Обязательно надо добавить ProjectName.dll в Files\Bin, а solution, на ваше усмотрение, обычно желательно, чтобы вы скачав пакет могли вести в нем разработку.

 Проект создавать как библиотеку классов + подключать в зависимости пакет Terrasoft?

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

Для работы с классами ядра можно к проекту подключить библиотеки из nugget:

 <PackageReference Include="BpmonlineSDK" Version="7.14.4.844-rc" />
 <PackageReference Include="Terrasoft.ServiceModel" Version="1.0.0" />
 <PackageReference Include="Terrasoft.ServiceModel.Primitives" Version="1.0.0">

 

 как использовать встроенные классы при разработке в ФС?

Как и в любом другом проекте .net.

Вот пытаюсь определить переменную с данным типом -https://prnt.sc/tqf1ps

Что делаю не так?

По скриншотам сказать что-то сложно, пришлите пакет, мы тогда объясним что там идет не так.

Если брать данную dll - https://prnt.sc/tqf4n0 и вставлять во Внешние сборки(https://prnt.sc/tqf4z5) тогда смысл данного решения?

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

 

Мотков Илья,

Можно ли при использовании данного решения как-то избежать конфликт библиотек Google? А то пока не получается...

 

Мотков Илья,

Мотков Илья пишет:

В проекте (

т.е. я не смогу добавить более новые библиотеки Google.Apis, Google.Analytics.V3, Google.Apis.Core (latest stable version) и т.д.? И затем без проблем использовать?

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

 

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

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

Мотков Илья,

здравствуйте, ссылку на скачивания пакета скидывал Вам в личном сообщении

Мотков Илья пишет:

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

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

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

Что касается clio и инсталяции cliogate в результате выполнения команды возникает следующая ошибка - https://prnt.sc/ttvziv 

Алексей, в соседней теме это Ваш же случай?

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

да, уже и систему переустанавливал, не помогает

 

Алексей, по поводу конфликта версий, всё как обычно с библиотеками: им или залить себе ту же версию, что у «в коробке» (более старую), или аргументировать, чтобы обновили «в коробке» до более новой. Если используется не самая новая версия системы, прежде всего попробовать обновить, возможно, в актуальной библиотеку тоже обновили.

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

Добрый день.

Есть очень большой цикл который выполняется на протяжении 2-3 недель реального времени.

Хочется прикрутить его остановку через кэш. Но изменение кэша красивее было бы сделать через консоль.

Кто-нибудь делал что то подобное например как с командой в консоле:

Terrasoft.SysSettings.postPersonalSysSettingsValue("IsDebug", true)

Нравится

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

Андрей, не вполне понятно, что вообще подразумеваете под «остановкой через кэш» и «изменением кэша через консоль» и зачем такое нужно.

 

В логике БП при помощи элемента чтения данных можно читать значения в том числе и из таблицы SysSettingsValue, отфильтровав по Id настройки и пользователя. Узнать Id настройки по коду можно из таблицы SysSettings.

 

То есть Вы можете создать новую системную настройку, менять её таким же способом, а в цикле проверять её текущее значение. Но опять же, это очень нестандартный способ управления системой, ту же системную настройку можно просто менять в разделе (но он доступен только администраторам). Или сделать небольшие вспомогательные БП для управления основным и запускать пользовательскими средствами их.

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

Коллеги всем доброго времени суток! Подскажите, как правильно добавлять системную настройку кодом и есть ли такая возможность? При добавлении через БП она создаётся но значение не сохраняется. Благодарю.

Нравится

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

Нигрескул Алексей,

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

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

Системная настройка хранится в таблице SysSettings, а её значения в SysSettingsValue.

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

здравствуйте, я это знаю, тут дело в другом, переменная создается, но значение не присваивается, по крайней мере через ui в системной настройке в поле значение по умолчанию пусто, и когда заполняеш вручную, то значение не сохраняется.

Нигрескул Алексей,

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

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

Доброго дня, коллеги!

 

Я столкнулся с такой проблемой, что после обновления названий лидов (переопределения UpdateLeadName()) у меня при переводе в продаже, автоматически название формируется как [Клиент] / [Количество зарегистрированных по клиенту продаж + 1].

 

Если что, название лида у меня выглядит сейчас так: [Тип потребности] / [ФИО контакта], [Дополнительное название] (кастомная строка)

 

А я хочу сделать так, чтобы при формировании названия в качестве второго параметра передавалась моя строка, а не [Количество зарегистрированных по клиенту продаж + 1], как это сделать? То есть, результат должен выглядеть так: [Клиент] / [Дополнительное название].

 

Заранее спасибо!

Нравится

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

Примерно так 

Название продажи устанавливается в процессе LeadToOpportunity780



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

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

А можете рассказать поподробнее, как это реализовать?

Примерно так 

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

Всем доброго времени суток! Столкнулся с такой проблемой. При добавлении БП в раздел "съезжает" ранее добавленная кнопка - https://prnt.sc/tn9xut.

Как с этим бороться?

Заранее благодарю.

Нравится

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

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

Вадим Косарев,

	diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "ActionButtonsContainer",
				"propertyName": "items",
				"name": "SimpleInfoButton",
				"values": {
					"layout": { "column": 1, "row": 6, "colSpan": 1},
					"itemType": Terrasoft.ViewItemType.INFORMATION_BUTTON,
					"content": { "bindTo": "Resources.Strings.InfoButtonCaption" }
				}
			}
		]/**SCHEMA_DIFF*/,

 

Алексей, процессы открывает кнопка ProcessRunButton. Она реализована в BaseDataView (базовой схеме раздела) кодом:

{
	"operation": "insert",
	"name": "ProcessRunButton",
	"parentName": "SeparateModeActionButtonsContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"caption": {"bindTo": "Resources.Strings.RunProsessButtonCaption"},
		"imageConfig": {"bindTo": "Resources.Images.ProcessButtonImage"},
		"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.LEFT,
		"classes": {
			"imageClass": ["t-btn-image left-12px t-btn-image-left proc-btn-img-top"],
			"textClass": ["t-btn-text t-btn-left actions-button-margin-right"]
		},
		"menu": {"items": {"bindTo": "getFilteredBySectionProcesses"}},
		"visible": {"bindTo": "getIsRunProcessButtonVisible"}
	}
},

В отличие от Вашего элемента, она входит в SeparateModeActionButtonsContainer, а уже тот —в ActionButtonsContainer:

{
	"operation": "insert",
	"name": "SeparateModeActionButtonsContainer",
	"parentName": "ActionButtonsContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.CONTAINER,
		"visible": {
			"bindTo": "IsCardVisible",
			"bindConfig": {
				"converter": function(value) {
					return !value;
				}
			}
		},
		"wrapClass": ["separate-action-buttons-container-wrapClass"],
		"items": []
	}
},

Возможно, Ваша кнопка с учётом иерархии контейнеров не там, где должна была находиться? Или дело в «"layout": { "column": 1, "row": 6, "colSpan": 1}», ведь нумерация идёт с нуля и 1 — это уже второй, с учётом видимой кнопки процессов?

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

Добрый день!

Установила с маркетплейс приложение "Advanced excel reports for Creatio"

https://marketplace.terrasoft.ru/app/advanced-excel-reports-creatio

 

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

Зашла вышла – он не появился.

 

Пробовала на версиях:

7.16.1.2135

7.16.0.4461

 

Что делать? Помогите пожалуйста

 

Нравится

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

Наталья, добрый день,

 

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

Ирина Лазоренко,

Сработало, спасибо

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

Добрый день!

Может у кого-то есть решение следующего кейса.

 

При нажатии на стандартные кнопки "Удалить" любой записи из системы (из раздела или из детали), должно произойти визирование руководителем об удалении этой же записи. 

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

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

Какие есть варианты реализации? 

Нравится

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

Навскидку: 

1. В объекте добавить Boolean поле - отметка на удаление

2. На событие в объекте Before deleting record проверять установленный факт подтверждения. Если его нет, то ставить отметку на удаление, а самое удаление отменять

3. Каким-то образом (скорее всего, отдельный раздел "Подтверждения удаления") формировать запись для визирования руководителю

4. После установки визирования снова удалять запись. Тут уже факт подтверждения есть, потому запись можно удалить в событии Before deleting record

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

 

Можно и более высокоуровнево, скрыть в разделах и деталях (можно через базовую страницу) кнопку удаления и вместо неё добавить кнопку запуска БП, который будет до реального удаления скрывать запись от нажавшего (если администрируется по записям), задавать вопрос кому нужно, а затем действительно удалять.

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