Добрый день! Подскажите, пожалуйста, можно ли создать какой-то класс, методы которого можно будет вызывать из бизнес-процессов и сервисов? Например, для записи в объект логов определенных событий в серверной части

Нравится

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

Можно

В БП вы можете использовать элемент Сценарий для выполнения c# кода, а в сервисах напрямую подключать ваш код.

Можно

В БП вы можете использовать элемент Сценарий для выполнения c# кода, а в сервисах напрямую подключать ваш код.

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

Григорий Чех,

Тут вопрос в том, как организовать вызов кода, чтобы не копипастить его в каждом процессе или сервисе. То есть это можно было бы решить через внешнюю библиотеку, но она должна будет иметь ссылки на библиотеки Terrasoft, поэтому придется переделывать её, например, при обновлении подключенных библиотек до новой версии framework. Этого делать не хотелось бы. Может быть, есть более правильное решение

Если взаимодействовать не через C#-код, а чисто как с веб-сервисом, вызов по URL и получение ответа, то ссылки не потребуются.

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

Добрый день. Подскажите как можно отфильтровать справочник контактов по группе? Смысл в том что при выборе из справочника в списке должны быть сотрудники только определенной группы (у нас тебе группа "телефермеры")

Нравится

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

Александр Тыра,

1. Можно сделать эту группу не функциональной, а организационной ролью.

2. Можно попробовать написать свое представление и для фильтрации нужных контактов завязаться на это представление.

Доброе утро.

Ваша группа 'Телефермеры' - это группа администрирования или какая-то другая?

Телефермеры — это как телепузики?smiley

Если это группа администрировования, см. тут. Если группа контактов, то условие фильтра будет даже проще, только по полю FolderId в таблице ContactInFolder. 

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

"Организационные роли"

Александр Тыра,

Посмотрите решение по ссылке выше, которое привел Александр Зверев.

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

"Организационные роли" работают, а вот "Функциональные роли" нет

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

Спасибо, решение отличное, но только работают так только 

"Организационные роли", а вот "Функциональные роли" нет

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

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

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

Если есть доступ к базе, напишите SQL-запрос, обращающийся к Contact, SysAdminUnit, SysUserInRole и SysAdminUnitInRole и получающий нужную Вам выборку контактов, а затем адаптируйте его под синтаксис с квадратными скобками.

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

спасибо за совет, попробую

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

Select * from "Contact" INNER JOIN "SysAdminUnit" ON "Contact"."Id" = "SysAdminUnit"."ContactId"
where "SysAdminUnit"."Id" IN (Select "SysAdminUnitId" from "SysAdminUnitInRole" where "SysAdminUnitRoleId" = '{C7C2A8E0-C54A-485B-A7A7-6FE3590E769B}')

так работает, только теперь не могу перевести в код, не срабатывает у меня

 

filterGroup.add("IsGroupAccess",
    Terrasoft.createColumnFilterWithParameter(
    Terrasoft.ComparisonType.EQUAL,
    "[SysAdminUnit:Contact].[SysAdminUnitInRole:SysAdminUnit].SysAdminUnitRole.Id",
    "{C7C2A8E0-C54A-485B-A7A7-6FE3590E769B}"));

так пробую - не работает

Александр Тыра,

1. Посмотрите sql-профайлером, какой запрос формируется в базу данных при вызове Ввшего кода.

2. Также посмотрите статьи по принципам построения путей к колонкам вот эту и эту.

 

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

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

https://community.terrasoft.ua/questions/esq-sintaksis-zaprosa-pri-cepo…

Александр Тыра,

1. Можно сделать эту группу не функциональной, а организационной ролью.

2. Можно попробовать написать свое представление и для фильтрации нужных контактов завязаться на это представление.

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

Задача в том что бы скрыть группу полей. Осталось только вернуть значение true или false для функции visibleReasons но не как не доходит как, сделал но понимаю что так не работает это

isAutoActivity: function(callback, scope){
	var recordId = this.get("PrimaryColumnValue");
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Activity"
	});
	esq.addColumn("KtIsAutoActivity", "KtIsAutoActivity");
	esq.getEntity(recordId, function(result) {
		this.set("IsAutoActivity", result.entity.get("KtIsAutoActivity"));
		if (callback) {
			callback.call(scope || this);
		}
	}, this);
},
visibleReasons: function() {
	Terrasoft.chain(
		function(next) {
			this.isAutoActivity(next, this);
		},
		function(){
			if (this.get("IsAutoActivity")) {
				return false;
			}
			return true;
		},
		this);
}

 

Нравится

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

А если просто при открытии карточки выполнить 

isAutoActivity и дальше забиндится на 
IsAutoActivity которое при открытии будет проиницилизировано!

А если просто при открытии карточки выполнить 

isAutoActivity и дальше забиндится на 
IsAutoActivity которое при открытии будет проиницилизировано!

Григорий Чех, 

Сработало с init, только теперь вопрос - есть ли смысл делать такую конструкцию?

init: function(callback, scope) {
	this.callParent([function() {
		this.Terrasoft.chain(
			function(next) {
				this.isAutoActivity(next, this);
			},
			function(){
				if (callback) {
					callback.call(scope || this);
				}
			},this);
	}, this]);
},
isAutoActivity: function(callback, scope){
	var recordId = this.get("PrimaryColumnValue");
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Activity"
	});
	esq.addColumn("KtIsAutoActivity", "KtIsAutoActivity");
	esq.getEntity(recordId, function(result) {
		this.set("IsAutoActivity", result.entity.get("KtIsAutoActivity"));
		if (callback) {
			callback.call(scope || this);
		}
	}, this);
}

или достаточно сделать?

init: function(callback, scope) {
	this.callParent([function() {
		var recordId = this.get("PrimaryColumnValue");
		var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "Activity"
		});
		esq.addColumn("KtIsAutoActivity", "KtIsAutoActivity");
		esq.getEntity(recordId, function(result) {
			this.set("IsAutoActivity", result.entity.get("KtIsAutoActivity"));
			if (callback) {
				callback.call(scope || this);
			}
		}, this);
	}, this]);
}

 

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

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

При параллельном сохранении Entity.Save() с использованием параллельных потоков Parallel.ForEach получаю ошибку:

System.Data.SqlClient.SqlException: A trigger returned a resultset and/or was running with SET NOCOUNT OFF while another outstanding result set was active.



Как установить NOCOUNT ON для объекта Entity при сохранении?

Нравится

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

Проблема возникает из-за того, что в каком-то триггере в базе данных для таблицы, связанной со схемой Entity не установлен SET NOCOUNT ON.

Для решения проблемы Вам нужно определить, что это за триггер и внести в него изменения.

У меня, например, такая проблема воспроизводилась при попытке удалить бизнес-процесс из конфигураци и возникала для объекта Contact. Для этой таблицы в БД есть триггер завязанный на изменение (UPDATE), но в нем не было установлено SET NOCOUNT ON.

Возможно, что у Вас также проблема именно в этом триггере.

Суть ошибки я понимаю. Вопрос в другом имеем ли мы право вносить правки в системные триггер.

 

Добрый день, Игорь.

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

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

Узнать, что это за триггер, можно, наблюдая запросы в профайлере.

Мотков Илья,

Илья, Добрый день.

проблема в базовых триггерах таблиц Contact и Account

Это стандартная логика, связанная с поиском дублей и полем-изображением. Из трёх триггеров на событии вставки и изменения работает только один, обновляющий изображение.

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

Коновалов Игорь пишет:

Суть ошибки я понимаю. Вопрос в другом имеем ли мы право вносить правки в системные триггер.

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

Если это ошибка, тогда хотелось бы получить от поддержки Terrasoft решение.

Решением будет удаление некорректных сторонних доработок, которые ломают стандартную логику триггеров раздела. В конфигурации вообще использование Parallel.ForEach минимально, только один раз при работе с сервисом рассылок.

Илья, вопрос к триггерам таблицы

- Контрагент:

TRILqybnWrGVlAZ250EZZORaS6GAIU

TRILqybnWrGVlAZ250EZZORaS6GJAD

TRAccountID

- Контакт:

TRContactID

TRILE9Mk5tdkf4ii5Xu52IJW7JlLAD



Все они являются базовыми и все содержат строку

SET NOCOUNT ON

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

Мотков Илья,

Я обрабатываю большой объем данных. Без применения

Parallel.ForEach данная выгрузка займет несколько дней.

Базовые триггеры прерывают данный процесс.



 

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

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

Подскажите где копать. Пакеты были привязаны к svn серверу, но потом решили изменить его на другой (что бы разделить разработку разных групп разработчиков на два svn). Через базу данных в пакетах были изменены Id svn сервера, но при попытке зафиксировать пакет в новом svn он стучится все равно в старый адрес

Нравится

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

Добрый день. Схожий вопрос обсуждался здесь:

https://community.terrasoft.ru/questions/izmenenie-zablokirovanogo-pake…

Если кратко, то посмотрите следующие скрипты:

--Решение проблемы при изменении хранилища
update syspackage set IsChanged = 1, IsLocked = 1 where InstallType=0
update SysSchema set IsChanged = 1, IsLocked = 1 where syspackageid in (select id from syspackage where InstallType=0)
update syspackageschemadata set IsChanged = 1, IsLocked = 1 where syspackageid in (select id from syspackage where InstallType=0)

 

Пащенко Александр Сергеевич,

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

Добрый день.

Если не меняли аттрибут sourceControlAuthPath в ConnectionStrings, то зайдите по пути C:\Windows\Temp\%номер сайта% (номер сайта можно узнать в IIS,нажав "Дополнительные параметры"  на нужном сайте. Удалите эту папку, очистите кэш redis и переавторизуйтесь в хранилище.

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

Дмитрий А.,

не помогает тоже

Александр Тыра пишет:

Дмитрий А.,

не помогает тоже

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

Дмитрий А.,

удалил все и почистил редис - не помогло

Александр Тыра,

Подскажите, удалось решить проблему? Если да, то как? Столкнулись с такой же.

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

Добрый день.

Интересуют лучшие практики по поводу следующего вопроса.

Велась разработка (в большей степени через дизайнер) в своем пакете и переносили пакет через SVN, но в следствии неопытности много косяков и артефактов появилось, в том числе и в SVN. Сейчас есть задача по кардинальным изменениям и хочу организовать это в новом пакете и в перспективе наследовать объекты сразу от базовых. Но есть НО.

Есть лид с двумя страницами (и артефактами) нужно чтобы пользователь по результату нового проекта получил лид с тремя страницами (2 старые и 1 новая), но избавится от артефактов и чтобы они не оказались в новом пакете. И остальные объекты (БП, схемы) должны остаться в функционале.

Кто подскажет как лучше организовать чтобы старым лидом и новым не было конфликтов и они правильно легли друг на друга (порядок пакетов, наследование объектов, зависимости, как лучше в хранилище сделать или новое)?

 

Спасибо

Нравится

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

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

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

Как можно из клиентского модуля обновить полоску "бизнес-кейса"?

Суть такая - в бизнес процессе выполняется действие, он переводит на другой статус продажу отправляя в конце сообщение которое ловит продажа и проверяет на номер. Если номер продажи совпадает он обновляет полоску "бизнес-процесса". Так вопрос, с сообщением понятно, а вот как заставить принудительно обновить полоску?

Нравится

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

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

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

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

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

Нравится

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

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

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

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

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

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

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

О компании

Book Box — сервис чтения для компаний с ежедневной доставкой книг в офисы. Компания была основана в 2015 году как сервис личного подбора литературы. После прохождения швейцарского бизнес-акселератора MassChallenge компания изменила бизнес-модель, и с 2017 года Book Box начал работу как сервис чтения по подписке в сегменте B2B. Пользователи на сайте оформляют заказ на книгу и уже на следующий день могут забрать ее на специальном стеллаже в офисе. Для того, чтобы вернуть прочитанную книгу, достаточно положить ее на стеллаж обратно.

Предпосылки внедрения bpm’online

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

Задачи внедрения bpm’online:

  • Адаптировать раздел [Продукты] для ведение всех книг и экземпляров. Настроить автоматическое присвоение идентификаторов для новых книг и экземпляров.
  • Автоматизировать процесс создания доставок на основании заказов. Настроить синхронизацию с сайтом.
  • Интегрировать печать штрих-кодов на стикеры по собранным заказам с минимальным участием оператора.
  • Построить процесс учета активности пользователей в рамках календарного месяца.
  • Разработать логику, которая позволит индивидуально настроить по каждому контрагенту условия дней доставки, количество книг на руках, активность читателей.
  • Автоматизировать просчет биллинга клиентов по уникальным договоренностям.
  • Настроить аналитику, которая отображала бы популярность книг, время чтения, предпочтения читателей по рейтингу книги, среднее время чтения книги.

Выполненные настройки

Для ведения книг и экземпляров в bpm`online используется раздел [Продукты], переименованный в [Книги]. В записях книг были добавлены новые поля, в которых фиксируется вся необходимая информация (рис.1).

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

(рис.1)

 

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

Для трекинга каждой отдельной книги, а также количества прочтений и последнего читателя добавлена деталь с экземплярами книги, на которой хранится информация о последнем читателе и где книга находится.

Для хранения информации об авторах и их книгах создан новый раздел [Авторы].  

После подтверждения заказа клиентом информация о выбранных книгах попадает в раздел [Заказы] в bpm’online. Это событие запускает бизнес-процесс подготовки заказанных книг к отправке. Задачами процесса являются: присвоение уникального идентификатора заказа, который считывается сканером штрихкода и печать стикера с информацией о читателе (рис. 2).

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

(рис. 2)

Информация о заказах и статусе доставки хранится с специально разработанном разделе [Доставка]. С помощью этого раздела осуществляется автоматическая отправка смс читателям о том, что их книга прибыла в компанию. Эта функция осуществляется с помощью коннектора Turbo SMS connector for bpm’online (рис. 3)

Изображение удалено.(рис. 3)

 

Кастомизированы разделы [Контакты] и [Контрагенты]. В карточке контакта на первый план выведена деталь с информацией по заказам читателя. Новый бизнес-процесс вычисляет активность читателя на ежемесячной основе с учетом индивидуальных настроек в карточке компании (рис. 4). Это позволяет увидеть количество активных читателей в компании (рис. 5).

Изображение удалено.(рис. 4)

Изображение удалено.(рис. 5)

Результат

С помощью bpm`online автоматизированы процессы обработки заказов и доставки книг. Это позволило значительно сократить рутинные процессы по формированию заказов, печати стикеров с штрих-кодом, и логином читателя. После начала работы в системе периодичность поставок увеличилась с 2 раз в неделю до ежедневных заказов. Хранение информации о полном цикле взаимодействия с клиентом позволяет организовать все эти данные в эффективную систему аналитики. Аналитический срез активных читателей непосредственно в карточке контрагента, позволяет максимально эффективно контролировать динамику взаимоотношений с клиентом.

Нравится

Поделиться

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

Отличный сервис! И книга на скриншоте интересная.

Если читают представители компании Book Box, интересно было бы глянуть статистику, что предпочитают читать пользователи, благо в bpm'online движок графиков позволяет пользовательскими средствами многое настроить.

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

Доброго дня.

Необходима интеграция с корзиной сайта, откуда заказы валятся на Magento 1.

Настроено API: есть URL-адрес для подключения с Magento, user и login.

Не понятна сама настройка веб-сервиса в bpm'online. Сталкивался ли кто-то с данной интеграцией, либо может кто-то теоретически понимает это?

Нравится

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

Добрый день!

Не уверен, что есть какой-то готовый коннектор (по крайней мере на маркете я ничего не нашёл), но в любом случае, можно запилить свою интеграцию через свой SOAP сервис. Правда для этого нужны компетенции и в bpm и в api magento.

Дополнение. Подключение посредством SOAP.

Добрый день!

Не уверен, что есть какой-то готовый коннектор (по крайней мере на маркете я ничего не нашёл), но в любом случае, можно запилить свою интеграцию через свой SOAP сервис. Правда для этого нужны компетенции и в bpm и в api magento.

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