Добрый день! У нас доступ к почте осуществляется через браузер и через OUTLOOK. Нам необходимо, чтобы все пользователи обращались к почте только через BPMONLINE. Возможно ли через настройки нашего почтового сервера и BPMONLINE заблокировать доступ к почте из других программ, кроме BPMONLINE?

Нравится

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

Боюсь данный вопрос не касается bpm'online, данный вопрос стоит задать вашим системным администраторам.

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

Уважаемые форумчане.
Вопрос по версии 7.6
Не получается сделать фильтрацию на детали.
Создал деталь активностей связанных контрагентов Activity на странице контрагента. Она похожа на деталь
Ативности в контрагенте, только она должна выдавать перечень активностей не текущего контрагента,
а активности контрагентов, которые связаны с текущим контрагентом. Связи контрагентов хранятся во
вьюхе VwAccountRelationship. В ней есть колонки AccountId и RelatedAccountId.
Сделал запрос

 SELECT * FROM Activity
INNER JOIN VwAccountRelationship ON Activity.AccountId = VwAccountRelationship.RelatedAccountId
WHERE VwAccountRelationship.AccountId = 'a40cfdfb-cd46-4c63-9448-44110861c12c'

a40cfdfb-cd46-4c63-9448-44110861c12c - Id текущего контрагента.
Этот запрос выдает верный результат. Там всего одна запись.
Но сделать с помощью фильтра на js не получается.
Пробовал следующий код, но он выдает кучу ненужных записей.
"Activity": {
                "schemaName": "SuSchema1Detail",
                "entitySchemaName": "Activity",
                "filter": {
                        "detailColumn": "Account",
                        "masterColumn": "Id"           
                },
                filterMethod: "activityFilter"
        }
methods: {
                        activityFilter: function() {
                                var currentAccount = this.get("Id");
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
                                filterGroup.add("CurrentAccountRelatedAccounts", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
                                        "=[VwAccountRelationship:RelatedAccount:Account].Account", currentAccount));
                                return filterGroup;
                        }                              
                }

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

Нравится

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

Всем привет, я только начал изучать платформу, но столкнулся с такой проблемой, как только пытаюсь схему, что бы по ней создать словарь при попытке сохранения мне пишет ошибку: Ошибка сохранения: Элемент с идентификатором "32e23f83-f058-49ff-9796-434470c48d5e" не найден. Как бы я не менял поля схемы оно её не создаёт((( Ответьте, пожалуйста в чём может быть моя ошибка... Если я слишком непонятно всё расписал, тогда просто напишите тут алгоритм создания своего справочника. Заранее спасибо.

Нравится

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

Здравствуйте, Сергей!

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

Также, детальная информация доступна на аккадемии, по ссылке
https://academy.terrasoft.ru/documents/service-enterprise/7-8/razdel-sp…

Я создал в разделе контактов новую колонку "Откуда узнал", но она не добавляется в реестр.

Создал справочник "Источники информации", сделал, как описано в 6.png

но справочник не добавляется в список.

Здравствуйте, Владимир!

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

Справочник добавляется в группу "Все", но не в выбранную подгруппу.

"Королёв Сергей Витальевич" написал:Ошибка сохранения: Элемент с идентификатором "32e23f83-f058-49ff-9796-434470c48d5e" не найден.

Скорее всего вы просто словили ошибку в метаданных, перегенерируйте исходные коды (для всех) и скомпилируйте всё.
вот в этой теме я ловил аналогичную ошибку.

Далее алгоритм по добавлению своего справочника:
1) Создаете новый объект, наследующийся от "Базовый справочник"
(обязательно именно так, не "Базвый объект"!)
в вашем пакете (по умолчанию - пакет Custom, если это Ваш пользовательский пакет - вам надо убедиться что Custom от него зависит, иначе как раз в мастере добавления справочника в выпадающем списке не будет Вашего объекта)
2) Далее в Дизайнере системы => Справочники => Добавить новый
Там в выпадающем списке уже будет объект который вы создали в предыдущем пункте, искать его надо не по имени объекта а по заголовку

Как-то так.

Исправил. Удалил справочник и добавил повторно. Результат тот же.

Записал для вас видео по созданию простейшего своего справочника
Там где-то посередине видео какой-то тупняк с неоткрывающимся разделом справочники - это демка, она лагает - это нормально :)

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

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

Есть sql Scalar-valued функция f, которая возвращает returns nvarchar(4000).
Я вызываю эту функцию в скрипте:

var sSQL = "select dbo.f(параметры) as message"
var Result = GetSimpleSQLResult(sSQL);

В GetSimpleSQLResult вызывается Connector.DBEngine.ExecuteCustomSQL(SQltext, Parameters);
Захватила SQL код через SQL Server Profiler

declare @p3 varchar(8000)
set @p3=' ?????? ????? ? ????? '
exec sp_executesql N' select top 1 @P1 = MESSAGE FROM f(параметры)',N'@P1 varchar(8000) OUTPUT',@p3 output
select @p3

и результат ??? знаки вместо букв

Вопрос:
можно ли изменить Connector.DBEngine.ExecuteCustomSQL(SQltext, Parameters); так чтобы параметр был
declare @p3 nvarchar(4000) а не varchar(8000), чтобы вместо ??? был текст

Спасибо.

Нравится

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

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

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

Вот сама функция:
CREATE function [dbo].[tsf_CalcBudgetFieldValueByBusinessTrip]
(@ProjectPassportID uniqueidentifier,
@CalculcatedFieldName nvarchar(50))
returns float
as
begin

declare @BudgetFieldValue float

/*to do something*/

return @BudgetFieldValue
end

function CreateSPParameters() {
return System.CreateObject('TSObjectLibrary.Parameters');
}

function CreateParam(Parameters, ParamName, ParamDataType) {
var Parameter = Parameters.CreateItem();
Parameter.Name = ParamName;
Parameter.DataType = ParamDataType;
Parameters.Add(Parameter);
return Parameter;
}

function GenNewKeyValueFromCollection(Collection, KeyValueCode) {
var ItemKeyValue;
for (var i = 0; i < Collection.Count; i++) {
ItemKeyValue = KeyValueCode + (i + 1).toString();
if (!Assigned(Collection.CoreItemsByKey(ItemKeyValue))) {
return ItemKeyValue;
}
}
return KeyValueCode;
}

function AddParameter(Parameters, ParamDataType, ParamValue, ParameterName) {
var ParamName = GenNewKeyValueFromCollection(Parameters, 'Parameter');
var Parameter = CreateParam(Parameters, ParamName, ParamDataType)
Parameter.Value = ParamValue;
if (!!ParameterName) {
Parameter.Name = ParameterName;
}
return Parameter;
}

function Calc() {
var Params = CreateSPParameters();
AddParameter(Params, pdtGUID, ProjectPassportID).Name = 'ProjectPassportID';
AddParameter(Params, pdtUnicodeString, CalculcatedFieldName).Name = 'CalculcatedFieldName';
var ResultParam = AddParameter(Params, pdtFloat, 0);
ResultParam.Name = 'BudgetFieldValue';
ResultParam.ParamType = pdtFloat;
var SQL =
'SET :BudgetFieldValue = dbo.tsf_CalcBudgetFieldValueByBusinessTrip(:ProjectPassportID, :CalculcatedFieldName)';
Connector.DBEngine.ExecuteCustomSQL(SQL, Params);
}

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

Я попробовала, пока не получается. Правильно ли я все поняля ?

вот функция:

create function func_CheckNumber
(@Number as int,
@Service as int
)

returns nvarchar(4000)

as
begin

declare @msg as nvarchar(4000);
set @msg = N'';

-- логика

set @msg = N'Համար' -- текст на армянском языке, написано Номер
return @msg
end

go

скрипт:
var Params = CreateSPParameters();

AddParameter(Params, sdtInteger, '993976').Name = 'Number';
AddParameter(Params, sdtInteger, '32').Name = 'Service';

var ResultParam = AddParameter(Params, sdtUnicodeString, '');
ResultParam.Name = 'msg';
ResultParam.ParamType = sdtUnicodeString;

var sSQL = 'set :msg = [dbo].[func_CheckNumber](:Number, :Service)';

Connector.DBEngine.ExecuteCustomSQL(sSQL, Params);

var Result = Params.ItemsByName('msg').Value;

ShowInformationDialog(IsEmptyValue(Result) ? '' : Result);

-- scr_SysEnums
sdtInteger = 0x00000001;
sdtUnicodeString = 0x00000008;

SQL Server Profiler:

exec sp_executesql N'set @P1 = [dbo].[func_CheckNumber](@P2, @P3)',N'@P1 varchar(1),@P2 int,@P3 int',NULL,993976,32

Result = null, и тип @P1 varchar(1), несмотря на то, что написано ResultParam.ParamType = sdtUnicodeString;

Спасибо.

Здравствуйте, Марина!

Попробуйте после запроса на выполнение проверить, какой результат содержится в ResultParam.Value, а не в Params.ItemsByName('msg').Value.

Также проверьте результат выполнения функции в SQL Management Studio, что в этом случае возвращается.

после
Connector.DBEngine.ExecuteCustomSQL(sSQL, Params);
проверила дебаггером

ResultParam.Value
null

этот код взяла из SQL Server Profiler:
exec sp_executesql N'set @P1 = [dbo].[func_CheckNumber](@P2, @P3)',N'@P1 varchar(1),@P2 int,@P3 int',NULL,993976,32

и чтобы заработало видоизменила чуть-чуть, добавила declare @p3 as nvarchar(50), OUTPUT и varchar(1) изменила на nvarchar(50)
declare @p3 as nvarchar(50)
exec sp_executesql N'set @P1 = [dbo].[func_CheckNumber](@P2, @P3)',N'@P1 nvarchar(50) OUTPUT ,@P2 int,@P3 int',@p3 output,993976,32
select @p3

результат верен: Համար

Здравствуйте, Марина!

Уточните, пожалуйста, какую версию Terrasoft 3.X Вы используете?

Также добавьте сервисы с реализованными функциями в Terrasoft и текст SQL-функции.

Версия: 3.2.0.90

SQL функция:
create function func_CheckNumber(@Number as int,
@Service as int
)

returns nvarchar(4000)

as
begin

declare @msg as nvarchar(4000);
set @msg = N'';

-- логика

set @msg = N'Համար' -- текст на армянском, написано Номер
return @msg
end

GO

скрипт:
function edt_NumberOnExit(Control)
{
debugger

if(dlData.Dataset.State == dstInsert)
{
if(Control.DataField.DisplayValue > 0)
{
var Params = CreateSPParameters();

AddParameter(Params, sdtInteger, '993976').Name = 'Number';
AddParameter(Params, sdtInteger, '32').Name = 'Service';

var ResultParam = AddParameter(Params, sdtUnicodeString, '');
ResultParam.Name = 'msg';
ResultParam.ParamType = sdtUnicodeString;

var sSQL = 'set :msg = [dbo].[func_CheckNumber](:Number, :Service)';

Connector.DBEngine.ExecuteCustomSQL(sSQL, Params);

var Result = Params.ItemsByName('msg').Value;

ShowInformationDialog(IsEmptyValue(Result) ? '' : Result);

}
}
}

1. CreateSPParameters
2. CreateParam
3. GenNewKeyValueFromCollection
эти функции, которые Вы отправили, в точности совпадали, кроме 4. AddParameter, которую я скопировала у себя

Возможно, дело в том, что для линейки 3.Х полноценная поддержка Unicode появилась в 3.4.0. При необходимости можно попробовать обновится до 3.4.0, перезаказать лицензии (платно). Также см. обсуждение похожего случая.

Здравствуйте Александр. Обновиться вряд ли получится, вопрос решила без SQL функции, только скриптом.

Спасибо.

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

Добрый вечер коллеги!
Возникла проблема с формированием тела для отправки письма.
Я все выполнил в точности, как написано здесь, однако письмо приходит не с текстом, который я ожидаю, а прямо в виде:
"[#[IsOwnerSchema:false].[IsSchema:false].[Parameter:{b5e76cd0-4fa3-4004-9d26-144caa0b5973}]#]"
Что бы я не менял, результат такой же. Письмо отправляется, процесс работает нормально, в параметр передается правильное значение, ошибок не возникает, но в результате получаю не то, что мне нужно.
Подскажите, с чем это может быть связано?
Версия 7.8

Нравится

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

Александр, рекомендую использовать инструкцию:
http://www.community.terrasoft.ru/blogs/12527

"Демьяник Алексей" написал:

Александр, рекомендую использовать инструкцию:

http://www.community.terrasoft.ru/blogs/12527


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

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

Добрый день!

Можно ли создать свой сервис наподобие сервиса лендинга, чтобы его можно было вызывать с других сайтов без авторизации?

Нравится

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

Говорят, что такая возможность для произвольного раздела появится в версии 7.9.

"Зверев Александр" написал:

Говорят, что такая возможность для произвольного раздела появится в версии 7.9.


Ясненько, а не знаете, сейчас что-то подобное можно сделать самому?

Как-то так. Оф. ответ супорта. Только придется менять кучу конфигов.

Что-то кодировка сломалась. Вот, что там:

Здравствуйте, вот инструкция по написанию сервиса, вызывающего БП, доступного по HTTP\GET с передачей параметров в БП:
 
1.	Вносим правки в наш «UsrLaunchProccService», во-первых, добавим Usr, как в имени схемы, так и имени класса по коду,
во-вторых, переписываем его как обычный веб-сервис, принимающий параметры по GET, а в его теле уже вызываем нужный нам БП с нужным нам параметром,
в нашем тесте это БП: UsrTestProcc с параметром UstTestPhone.
 
Бизнес процесс может быть любым, с любым количеством параметров, в данной инструкции наш тестовый БП не рассматривается,
единственное что, в процессе должен стоять флаг "сериализовать в сессию", должен стоять флаг "принудительная компиляция", и не стоять "сериализовать в БД", а также процесс не должен содержать тега,
суть вопроса в другом,
а именно в вызове его при получении GET запроса с параметром, с стороннего сайта\службы\сервиса\чего-угодно по протоколу HTTP,
итак, код сервиса во вложении (UsrLaunchProccService.txt), там написан как CORS, так и вызов БП, теперь доработаем конфиги что бы позволить вызывать сервис по урл:
http(или https)://адрес-сайта/0/ServiceModel/UsrLaunchProccService.svc
 
2.	В папке сайта в котором написан наш сервис, *сайт*\Terrasoft.WebApp\ServiceModel
Создаем файл «UsrLaunchProccService.svc»
В содержимое файла пишем:
 
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.UsrLaunchProccService" CodeBehind="UsrLaunchProccService.svc.cs" %>
 
3.	В папке *сайт* \Terrasoft.WebApp в файле Web.config  рядом с другими локациями, добавляем:
 
<location path="ServiceModel/UsrLaunchProccService.svc">
   <system.web>
      <authorization>
         <allow users="*" />
      </authorization>
   </system.web>
</location>
 
4.	В папке *сайт*\Terrasoft.WebApp\ в файле Web.config в секции appSettings меняем  значение ключа AllowedLocations. В значение добавляем:
ServiceModel/UsrLaunchProccService.svc;
 
5.	В папке *сайт*\Terrasoft.WebApp\ServiceModel\http в файле services.config в блоке сервисов добавляем:
 
<service name="Terrasoft.Configuration.UsrLaunchProccService">
	<endpoint name="UsrLaunchProccServiceEndPoint"
      address=""
      binding="webHttpBinding"
      behaviorConfiguration="RestServiceBehavior"
      bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
      contract="Terrasoft.Configuration.UsrLaunchProccService" />
</service>
 
6.	В папке *сайт*\Terrasoft.WebApp\ServiceModel\https в файле services.config в блоке сервисов делаем то же самое, что и в пункте 5.
 
Все, сервис будет доступен по адресу:
http(или https)://адрес-сайта/0/ServiceModel/UsrLaunchProccService.svc
 
К примеру в нашем локальном примере, вызов БП с параметром телефона "123" выглядит так:
http://localhost:8006/0/ServiceModel/UsrLaunchProccService.svc/runUsrTestProcc/123/

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

Спасибо всем большое!

А у меня еще один вопрос появился. Знает ли кто как включить CORS? А то у меня запросы к локальной версии bpm с браузера не проходят, ругается что сервер не поддерживает CORS.

"Колебянов Виталий Романович" написал:Знает ли кто как включить CORS?

В сервисе:

[OperationContract]
        [WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
        public void GetWebFormLeadDataRequestOptions()
        {
            var outgoingResponseHeaders = WebOperationContext.Current.OutgoingResponse.Headers;
            outgoingResponseHeaders.Add("Access-Control-Allow-Origin", "*");
            outgoingResponseHeaders.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
            outgoingResponseHeaders.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, X-Requested-With, X-Requested-With, x-request-source");
            outgoingResponseHeaders.Add("Access-Control-Request-Headers", "X-Requested-With, x-request-source, accept, content-type");
        }

Здравствуйте. По выше описанному добавил web сервис. При вызове ему передаються текстовые данные в формате JSON.

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
	RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted() {
	var Request = HttpContext.Current.Request;
	StreamReader reader = new StreamReader(Request.InputStream);
	string requestFromPost = reader.ReadToEnd();
	string result = "chatStarted result: " + requestFromPost;
	return result;
}

Но при получении InputStream, возвращаеться ошибка: Этот метод или свойство не поддерживается после вызова HttpRequest.GetBufferlessInputStream."
System.Web.HttpRequest.BinaryRead(Int32 count)
в Terrasoft.Configuration.UsrChatraWebhooks.chatStarted()
в SyncInvokechatStarted(Object , Object[] , Object[] )
в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Нашел статью https://stackoverflow.com/questions/21635815/how-should-i-use-httpreque…

добавил в Terrasoft.WebApp\web.config в configuration.appSettings

<add key="wcf:serviceHostingEnvironment:useClassicReadEntityBodyMode" value="true" />

После этого ошибка не повторяется, но InputStream пуст.

В чем может быть проблема? Может в BPM есть специальный способ для чтения тела входящего запроса?

Request.ContentLength > 0, .т.е. в теле запроса передается какая то информация.

"Дашкевич К." написал:Но при получении InputStream, возвращаеться ошибка:

Как-то слишком наворочено) Если надо принять строку, то

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
        RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted(string input) {...} ///автоматом десериализует в строку

Если надо принять Json, мы делаем так:

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
        RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted(newMessage input) {...}  ///автоматом десериализует в объект, который предварительно надо описать
 
[DataContract]
    public class newMessage
    {
        [DataMember]
        public string testName { get; set; }
 
        [DataMember]
        public DateTime testDate { get; set; }
    }

Если надо stream, то там немного сложнее. придётся выкидывать RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json. Короче, лучше без стрима)

Попробовал ваш метод первый и второй:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class UsrChatraWebhooks
{
 
	[OperationContract]
	[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
	public void GetWebFormLeadDataRequestOptions()
	{
		var outgoingResponseHeaders =WebOperationContext.Current.OutgoingResponse.Headers;
		outgoingResponseHeaders.Add("Access-Control-Allow-Origin", "*");
		outgoingResponseHeaders.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
		outgoingResponseHeaders.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, X-Requested-With, X-Requested-With, x-request-source");
		outgoingResponseHeaders.Add("Access-Control-Request-Headers", "X-Requested-With, x-request-source, accept, content-type");
	}
 
	[OperationContract]
	[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
		RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
	public string chatStarted(NewMessage input) {
		var Request = HttpContext.Current.Request;
		var lngCount = Request.ContentLength;
		string tinput = "";
		if (input != null) {
			tinput = input.eventName;
		}
		string result = "ContentLength=" + lngCount.ToString() + "; input=" + tinput;
		return result;
	}  
}
 
[DataContract]
public class NewMessage
{
	[DataMember]
	public string eventName { get; set; }
 
}

Скрин запроса в приложение.
В обоих случаях input пустой.
Подскажите пожалуйста, в чем может быть проблема?

Ответ: {"chatStartedResult":"ContentLength=32; input="}

"Дашкевич К." написал:WebMessageBodyStyle.Wrapped

Посылаемый запрос должен быть обёрнут, поэтому либо:

{
	NewMessage: {
		eventName: "значение"
	}
}

либо

WebMessageBodyStyle.Bare

запрос(если оставляем класс NewMessage):

{
	eventName: "значение"
}

"Варфоломеев Данила" написал:WebMessageBodyStyle.Bare

запрос(если оставляем класс NewMessage):
{
        eventName: "значение"
}

Спасибо большое, помогло.

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

Здравствуйте. Скажите пожалуйста, как можно в bpm'online sales team 7.8.2 в бизнес процессе получить тело входящего письма.
Процесс запускается по сигналу входящего письма, читаются данные письма а вот, как дальше быть? Как распарсить?
Скрин прилагаю.

Нравится

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

Здравствуйте, Максим!

Тело письма хранится в поле Body. Парсить письмо можно элементом "Задание-сценарий", но нужны навыки программирования на языке C#.

"Демьяник Алексей" написал:

Здравствуйте, Максим!

Тело письма хранится в поле Body. Парсить письмо можно элементом "Задание-сценарий", но нужны навыки программирования на языке C#.


Я уже разобрался как получить тело письма. Через параметры бизнес процесса.

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

Доброго времени суток.

Версия 7.8 sales.

Задача такая: на детали Средства связи на странице Контакта есть поля "Мобильный телефон" и "Основной телефон". Также у контакта есть своё поле "Мобильный телефон".

При создании контакта значение из поля контакта "Мобильный телефон" автоматически добавляется в соответствующее поле детали Средства связи.

Возможно ли сделать так, чтобы это значение добавлялось также автоматически в поле "Основной телефон" вместо мобильного? (см. скриншот)

Спасибо.

Нравится

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

При сохранении контакта:
1й запрос на проверку, есть ли в contactcommunication этого контакта "Основной телефон"
2й запрос update если есть, insert если нет.

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

Да, надо было бы вынести в настройки синхронизацию детали "Средста связи" с полями Контакта и Контрагента.

Как и поля детали "Адреса"

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

Добрый день.

У меня такой вопрос. Можно ли вызвать бизнес-процесс из скрипта c#?

Нравится

3 комментария
UserConnection userConnection = HttpContext.Current.Session[@"UserConnection"] as UserConnection;
ProcessSchemaManager processSchemaManager = (ProcessSchemaManager)userConnection.GetSchemaManager(@"ProcessSchemaManager");
ProcessSchema processSchema = processSchemaManager.GetInstanceByName(@"GetManager"); //вместо GetManager вставить название БП
Process process = processSchema.CreateProcess(userConnection);
 
if (processSchema.Parameters.ExistsByName(@"ContactNum"))
{
	process.SetPropertyValue(@"ContactNum", var1);
}
process.SetPropertyValue(@"ManagerNum", var2);//можно не проверять на существование параметра
...набиваем параметрами процесс...
process.Execute(userConnection);

"Варфоломеев Данила Викторович" написал:

UserConnection userConnection = HttpContext.Current.Session[@"UserConnection"] as UserConnection;

ProcessSchemaManager processSchemaManager = (ProcessSchemaManager)userConnection.GetSchemaManager(@"ProcessSchemaManager");

ProcessSchema processSchema = processSchemaManager.GetInstanceByName(@"GetManager"); //вместо GetManager вставить название БП

Process process = processSchema.CreateProcess(userConnection);



if (processSchema.Parameters.ExistsByName(@"ContactNum"))

{

        process.SetPropertyValue(@"ContactNum", var1);

}

process.SetPropertyValue(@"ManagerNum", var2);//можно не проверять на существование параметра

...набиваем параметрами процесс...

process.Execute(userConnection);

Спасибо.
Но почему-то это не хочет работать в скрипте бизнес-процесса. Выкидывает ошибку: Невозможно получить экземпляр схемы типа "Terrasoft.Core.Process.UsrProcess2Schema".

Разобрался сам, надо было просто скомпилировать 2-й бизнес-процесс.

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

Добрый день.
Ситуация следующая:
Есть два замещающих объекта Case. Один находится в пакете для разработке. Второй - в пакете Custom. Возникла необходимость реализовать логику в casePage, затрагивающую поля из Case в пакете Custom. Но дилемма в том, что логика должна быть реализована в пакете для разработки.
Вопрос как перенести объект Case из Custom в пакет для разработки (слить два замещающих объекта), чтобы не затереть существующую логику, уже реализованную в Case пакета разработки?

Нравится

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

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

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

Во-первых, нужно проверить не нарушена ли у Вас иерархия пакетов. Пакет Custom должен быть последним в иерархии всегда. И по-хорошему наследоваться от всех других пакетов в системе и от пакета разработки, но это уже не обязательно.

Перед выполнением указанных действий обязательно выполните бекап БД.

Слияние необходимо выполнить для 2-х типов схем: EntitySchema и ClientUnitSchema

Рассмотрим слияние EntitySchema:

В объекте Case из пакета Custom добавлены кастомные колонки, которые Вы хотите перенести.
Открываем объект Case из пакета разработки на редактирование добавляем колонки, которые сейчас есть в объекте Case пакета Custom с такими же именами и соответствующими типами. Не закрывая дизайнер удаляем объект Case из пакета Custom и сразу сохраняем и публиуем объект Case, в который Вы переносили изменения.

Рассмотрим слияние ClientUnitSchema:

Сливать ClientUnitSchema намного сложнее, так как необходимо анализировать обе схемы и сливать их значение в одно. Для примера выполним сливание схемы ContactPageV2 из пакета Custom в схему ContactPageV2 из пакета разработки.

1.Открываем обе схемы в дизайнерах. Если посмотреть на содержимое схем, то можно заметить, что некоторые свойства объекта содержат значение (в данном случае diff). Пример на скриншоте "image2".
2. Дальше необходимо анализировать содержимое каждого элемента в diff-е.
3. Ищем совпадающие элементы по полям «opperation» и «name»
4.Анализируем значение полей свойства «values»:
- Если в новой версии такого поля нет, то добавляем
- Если в новой версии такое поле есть, то подменяем его значение
5. Если в схеме, в которую переносим данные, нет элементов с соответствующими полями «opperation» и «name», то переносим элемент целиком. Пример на скриншоте image3
6. Выполняем п.п. 3-5 для всех элементов объекта, который возвращает функция.
7. После переноса/слияния всех данных, схему из пакета Custom можно удалить.

Михаил, здравствуйте!
Спасибо за ответ!
Как раз таки слияние ClientUnitSchema не взывает затруднения.
А вот к EntitySchema есть вопросы. Не затрётся ли содержимое переносимых полей при реализации описанной схемы?

Добрый день, Игорь!
Описанный ранее метод слияния EntitySchema вполне рабочий и несколько раз сам его применял.
Если все делать согласно инструкции, то проблем быть не должно. Единственный совет, откройте данные объекты (который будете удалять и который будете изменять) в разных браузерах, так будет надежнее. Если у Вас есть предостережения, Вы можете протестировать на тестовой сборке.

Всё получилось. Спасибо.

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