GET-запрос
Технические вопросы
7.x

Здравствуйте! Интересует вопрос как я могу отдавать запросы из системы.
Например мне нужно сделать автоматический отчет про количество заявок по продуктам на каждого менеджера. Я из внешнего приложения могу делать запрос и в параметре передавать код который соответствует менеджеру. Могу ли я както сформировать ответ на этот запрос в БП и передать результат в Json или в чемто другом? И как это сделать? Спасибо.

Нравится

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

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

Вы можете запустить процесс, передав в него нужный параметр. Также в результирующем параметре процесса Вы можете получить результат выполнения процесса, например строку JSON.
Более подробно:
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/zapusk-process…

Запускать процессы через Execute я умею. А вот отдавать результат запроса внешнему приложению - такого в этой статье нету. Это вообще возможно? Где можна посмотреть пример реализации?

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

Можно достучаться по OData.
Пример описан здесь:
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/odata

Что касается запуска процесса, Вы можете сделать следующее:
1) Создать процесс MyProcess с параметрами ContactId (идентификатор) и ContactName (строка 250 символов):

  • Начальный элемент
  • Чтение данных контакта с фильтром Id == ContactId
  • Формула: в параметр ContactName установить значение Чтение данных контакта.ФИО
  • Конец процесса

2) В адресной строке ввести ссылку:
http[s]://<адрес_приложения_bpm'online>/0/ServiceModel/ProcessEngineService.svc/MyProcess/Execute?ResultParameterName=ContactName&ContactId=410006e1-ca4e-4502-a9ec-e54d922d2c00

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

ЗЫ. Как-то небезопасно обращаться в запросах к БД, передавая все параметры. Или я не прав?

То что вы написали - мне понятно. По ContactId читаем контакт и в процессе передаем в параметр ContactName ФИО. Но я спрашивал о другом.

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

А еще лучше - могу ли я делать запросы извне прямо в Базу данных, минуя CRM систему?

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

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

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

Здравствуйте, Николай!

Не совсем так - на одном SQL сервере размещено несколько баз (у каждого своя база). Для доступа к базам используется уникальный пользователь и свой пароль (для каждой базы свой).

Так почему я не могу используя свой уникальный пользователь и свой пароль получить доступ к своей базе?

Из соображений безопасности данных пользователей, на данный момент, мы не предоставляем прямой доступ к БД. Но, есть дополнительная услуга :Размещение на выделенных серверах.
Где доступ к БД возможен.
Обратитесь к Вашему менеджеру.

Показать все комментарии
Копирование объектов
Технические вопросы
7.x

Задача: сформировать отчет такой же, как имеющийся, но за другой период.
По факту необходимо заменить фильтр EntitySchemaQueryMacrosType c CurrentWeek на NextWeek
Делать отчет с нуля сильно не хочется.
Есть ли возможность дублирования объекта или к.-л. другой способ упростить себе жизнь?

Нравится

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

Использован элемент БП "Отправить email". Каким образом привязать такого письмо к заказу (активностям)? В более ранних версиях можно было создавать активность вручную через "Добавление данных" и последующим использованием "Действие процесса", где выбирался процесс "Отправить сообщение". Сейчас этот функционал убрали.

Нравится

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

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

Элемент "Отправить email" не создает в системе записей. В версии 770 возможность добавлять активность с типом email и отправлять письмо элементом "Задание сценарий".

Пример реализации можно посмотреть в процессе "Отправить email контакту обращения" в продуктах линейки Service.

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

Элемент "Отправить email" не создает в системе записей. В версии 770 возможность добавлять активность с типом email и отправлять письмо элементом "Задание сценарий".

Пример реализации можно посмотреть в процессе "Отправить email контакту обращения" в продуктах линейки Service.

Код используемый в процессе "Отправить email контакту обращения" не работает корректно, при попытке его смоделировать и запустить на кастомном процессе.

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

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

Usings добавлены так же как в процессе "Отправить email контакту обращения"

Строки 38-40: в 770 был изменен алгоритм получение userConnection пользователя. Теперь userConnection получается так:

var userConnection = Get<UserConnection>(“UserConnection”);

Строка 37: предполагаю, что элемент процесса "Добавить данные" называется по другому, соответственно в коде Вы обращаетесь к элементу, которого нет на диаграмме.

Строка 37: Элемент переименовывался соответственно. И в коде, и сам элемент, так чтобы они совпадали. Это проблемы не решало.

Попробуйте поискать данный элемент в параметре процесса:

Думаю, элемент, на который ругается не будет отображаться.

Элемент присутствует, но кодом он не подхватывается :confused:

У элемента есть два параметра:

  • Caption (Заголовок)
  • Name (Название)

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

Самый простой способ - выделить элемент на диаграмме. Тогда его название выделится в структуре процесса.

AddDataUserTask1 - название элемента в структуре и на диаграме.
AddDataUserTask1 в коде используется тоже самое название, результата это не дает.

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

Давайте поступим следующим образом - скомпилируйте Ваш процесс. В результате появится ошибка. Предоставьте, пожалуйста, скриншот ошибки и листинг кода +- 50 строк от строки, в которой произошла ошибка (для просмотра исходного кода в диаграмме процесса необходимо открыть меню "Дополнительно" и выбрать пункт "Открыть исходный код")

namespace Terrasoft.Core.Process
{
 
	using Newtonsoft.Json;
	using Newtonsoft.Json.Linq;
	using System;
	using System.Collections.Generic;
	using System.Collections.ObjectModel;
	using System.Drawing;
	using System.Globalization;
	using Terrasoft.Common;
	using Terrasoft.Configuration;
	using Terrasoft.Core;
	using Terrasoft.Core.Configuration;
	using Terrasoft.Core.DB;
	using Terrasoft.Core.Entities;
	using Terrasoft.Core.Factories;
	using Terrasoft.Core.Process;
	using Terrasoft.Core.Process.Configuration;
	using Terrasoft.Mail;
	using Terrasoft.Mail.Sender;
 
	#region Class: UsrProcess1MethodsWrapper
 
	/// <exclude/>
	public class UsrProcess1MethodsWrapper : ProcessModel
	{
 
		public UsrProcess1MethodsWrapper(Process process)
			: base(process) {
			AddScriptTaskMethod("ScriptTask1Execute", ScriptTask1Execute);
		}
 
		#region Methods: Private
 
		private bool ScriptTask1Execute(ProcessExecutingContext context) {
			var activityId = AddDataUserTask1.RecordId;
var userConnection = Get<UserConnection>("UserConnection");
var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));
var activityEmailSender = new ActivityEmailSender(emailClientFactory, UserConnection);
var entity = new Terrasoft.Configuration.Activity(UserConnection);
if (entity.FetchFromDB(activityId)) {
	entity.SetColumnValue("IsHtmlBody", true);
	entity.Save();
}
activityEmailSender.Send(activityId);
return true;
		}
 
		#endregion
 
	}
 
	#endregion
 
	#region Class: UsrProcess1
 
	/// <exclude/>
	public class UsrProcess1 : Terrasoft.Core.Process.Process
	{
 
		#region Class: ProcessLane1
 
		/// <exclude/>
		public class ProcessLane1 : ProcessLane
		{
 
			public ProcessLane1(UserConnection userConnection, UsrProcess1 process)
				: base(userConnection) {
				Owner = process;
				IsUsedParentUserContexts = false;
			}
 
		}
 
		#endregion
 
		#region Class: AddDataUserTask1FlowElement
 
		/// <exclude/>
		public class AddDataUserTask1FlowElement : AddDataUserTask
		{
 
			#region Constructors: Public
 
			public AddDataUserTask1FlowElement(UserConnection userConnection, UsrProcess1 process)
				: base(userConnection) {
				UId = Guid.NewGuid();
				Owner = process;
				Type = "ProcessSchemaUserTask";
				Name = "AddDataUserTask1";
				IsLogging = true;
				SchemaElementUId = new Guid("cb50206d-a0b9-482c-a7df-3310717b43ea");
				CreatedInSchemaUId = process.InternalSchemaUId;
				SerializeToDB = true;
			}
 
			#endregion
 
			#region Properties: Public
 
			private Guid _entitySchemaId = new Guid("c449d832-a4cc-4b01-b9d5-8a12c42a9f89");
			public override Guid EntitySchemaId {
				get {
					return _entitySchemaId;
				}
				set {
					_entitySchemaId = value;
				}
			}
 
			#endregion
 
		}
 
		#endregion
 
		public UsrProcess1(UserConnection userConnection)
			: base(userConnection) {
			InitializeMetaPathParameterValues();
			UId = Guid.NewGuid();
			Name = "UsrProcess1";
			SchemaUId = new Guid("62bbfc92-cc55-451a-afc4-a87fd1cb5433");
			SchemaManagerName = "ProcessSchemaManager";
			SerializeToDB = true;
			SerializeToMemory = true;
			IsLogging = true;
			ProcessModel = new UsrProcess1MethodsWrapper(this);
			InitializeFlowElements();
		}
<a href="/system/files/images/10.jpg" class="ts_fancybox"><img src="/system/files/images/10-thumb.jpg" alt="" /></a>

Подобная проблема возникает в любым элементом, попробовал добавить чтение данных, а в коде использовать его имя (ReadDataUserTask1) - пишет, элемент не найден

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

Пожалуйста, напишите на support@terrasoft.ru - нужно будет удаленно подключаться и анализировать. К сожалению, по коду нельзя определить в чем проблема.

А что конкретно написать?

Укажите описание проблемы и ссылку на этот топик.

"Бахматов Александр Валерьевич" написал:Использован элемент БП "Отправить email". Каким образом привязать такого письмо к заказу (активностям)? В более ранних версиях можно было создавать активность вручную через "Добавление данных" и последующим использованием "Действие процесса", где выбирался процесс "Отправить сообщение". Сейчас этот функционал убрали.

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

странно что у вас вообще возникла проблема. В версии 7.7 и 7.8 даже попробовал создал Активность, через добавление данных, и далее через "действие процесса" отправил Email сообщение и все получилось. Нужно анализировать какие зависимости есть у того пакета, где создаете свой бизнес-процесс.

Показать все комментарии
Технические вопросы
7.x

После обновление bpmonline 7.4.1 до 7.5 выъодить ошибка в браузере:
error
помогите пж из-за чего выходить данная ошибка?

Нравится

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

Здравствуйте.
Скрин не отображается. Рекомендую обратиться в поддержку. Вопрос не совсем формата Community.

OK, napisal supporty[/quote]

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

Здравствуйте! Есть пользовательский раздел «Склады», в котором есть 2 записи «Основной» и «Резервный». В каждой записи в детали «Остатки по складу» хранятся данные о продукте и его количестве на складе. Задача такая - необходимо, чтобы на странице добавления продуктов в заказ, отображалось количество продукта из этой детали. Подскажите, пожалуйста, какие модули нужно заместить, чтобы реализовать это, и как? Спасибо!

Нравится

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

Юлия, для реализации данного функционала необходимо заместить модуль "ProductSelectionView", а также модуль "ProductSelectionViewModel". Особое внимание обратите на метод getEditableGridConfig, который отвечает за генерацию грида в данной детали. В замещающем модуле для ProductSelectionViewModel необходимо будет добавить логику загрузки количества данных с использованием EntitySchemaQuery.

Показать все комментарии
Группы
Технические вопросы
7.x

Добрый день.

Версия 7.2

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

Спасибо.

Нравится

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

Все нужные Вам методы есть в схеме SectionModule, и они доступны через песочницу (sandbox), так что Вы можете в Ваших схемах секции обращаться к ним следующим образом, и анализировать массив включенных фильтров-папок:

define('ContactSection', ['Contact', 'ContactSectionStructure', 'sandbox', 'ContactSectionResources'],
	function(Contact, structure, sandbox, resources) {
	structure.userCode = function() {
 
		// only for debug\test
		document.scc = this;
 
		this.methods.init = function() {
			// only for debug\test
			document.scc = this;
		};
 
		this.methods.GetFolderFilterArray = function() {
			return sandbox.publish("GetFolderFilter", null, [sandbox.id + "_QuickFilterModule"]);
		};
	};
 
	return structure;
});

Показать все комментарии
Технические вопросы
7.x

Добрый день,
Пытаюсь в данный момент настроить древовидную структуру. В процессе поиска по форуму набрел на эту тему.
Нашел инструкцию, создал замещающий объект для OpportunityProductInterest, создал справочник Parent, однако далее не могу указать его в качестве родителя в иерархии. Поле почему-то заблокировано.
Как указать родителя?

Нравится

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

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

Судя по всему данная инструкция неактуальна для версии 770. Пример реализации в 770 можно посмотреть в разделе "Проекты".

Данное поле доступно если наследователь объект, а не замещать.

Показать все комментарии
значение поля по умолчанию
страница редактирования
Технические вопросы
7.x

Добрый день.

Версия BPMOnline 7.2

При создании новой записи необходимо установить значение поля объекта в некоторое значение. Поле типа "Справочник", связано с другой таблицей. Пытаюсь делать так:

if (this.isNew) {
    var statusNew = '8A6DEA2E-6F96-488E-B4B4-DDBEA2F225CD';
    var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
        rootSchemaName: 'SynchronizedRuleStatus'
    });
    esq.getEntity(statusNew, function(result) {
        if (result.success && result.entity) {
            this.set('SynchronizedRuleStatus', result.entity.get('Id'));
       }
    }, this);
}

Однако значение поле в карточке отображается как "undefined". Как решить данную проблему?

Заранее благодарен за помощь.

Нравится

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

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

Объект замещать нельзя по некоторым соображениям.

Но проблема уже решена, может кому пригодится:

if (this.isNew) {
    var statusNew = '8A6DEA2E-6F96-488E-B4B4-DDBEA2F225CD';
    var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
        rootSchemaName: 'SynchronizedRuleStatus'
    });
    esq.addColumn('Name');
    esq.addColumn('Id');
    esq.getEntity(statusNew, function(result) {
        if (result.success && result.entity) {
	    var entity = result.entity;
	    if (entity) {
	        var t = {
	            displayValue: entity.get('Name'),
		    value: entity.get('Id')
	        };
	        this.set('SynchronizedRuleStatus', t);
           }
       }
    }, this);
}

Здравствуйте, Артем.

Я бы порекомендовал значение '8A6DEA2E-6F96-488E-B4B4-DDBEA2F225CD'; вынести в системную настройку (типа "Статус по-умолчанию") и тянуть ее оттуда.

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

Показать все комментарии
Технические вопросы
7.x

Еще вопрос, коллеги.

У меня есть поле, которое я создаю через так:

var phoneEdit = Ext.create('Terrasoft.TextEdit', {
        id: 'phone',
        value: {bindTo: 'Phone'},
        classes: {wrapClass: ['edit', 'text-edit']},
        keyup: {bindTo: 'onKeyUp'},
        markerValue: "phoneEdit"
});

Куда здесь прописать маску телефона в таком формате '+38(___)___-__-__' ?

Нравится

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

Вот такое есть решение, свой контрол расширяющий обычный текст, и поддерживающий маску:
http://www.community.terrasoft.ru/forum/topic/11152

"Мотков Илья" написал:

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

http://www.community.terrasoft.ru/forum/topic/11152

То есть вместо 'Terrasoft.TextEdit' прописать 'Terrasoft.MultiMaskEdit'? Попробую, и сразу отпишу по результату.

Показать все комментарии
Технические вопросы
7.x

Здравствуйте, коллеги.

В модулях иногда есть вкладка LESS со стилями, а иногда нету. Вот как бы сделать так, чтобы там где их нет, там она появилась? Это сложно?

Нравится

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

Здравствуйте, Евгений.

Вкладка LESS присутствует только в Модулях. Ее нет в Схемах или Замещающих схемах. Сделать так, что бы она появилась в схемах невозможно. Только создать модуль, определить нужные стили на вкладке LESS, а затем подключить его в define нужной схемы.

Спасибо, Илья.

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

Евгений, к сожалению, архитектура Bpm'online не предусматривает данных манипуляций.

Жаль. Была бы полезная фича.
Спасибо, Илья.

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