Добрый день.

Решил изучить процесс автонумерации на возможность генерации одинаковых номеров.

  1. Настроил процесс в соответствии с инструкцией.
  2. Написал консольное приложение для создания записей в несколько потоков в соответствии с инструкцией.

При первом же тесте по созданию записей в 20 потоков, по 1 записи в каждом потоке, получил следующие результаты:
Дубли2

Собственно вопросы:
Есть ли какая то возможность гарантированно генерировать уникальный номер?
Есть ли возможность модифицировать класс GenerateSequenseNumberUserTask?

Нравится

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

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

Альтернативный вариант - генерировать номер по факту создания записи триггером в БД.

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

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

Альтернативный вариант - генерировать номер по факту создания записи триггером в БД.


Но, если необходимо генерировать некоторый код на основании уникального номера и некоторых полей из записи, то этот вариант же не подходит.

Например шаблон названия/кода: <Тип_записи>/<Категория_записи>/<Год_создания>_<Уникальный_порядковый_номер>

И есть ли возможность модифицировать класс GenerateSequenseNumberUserTask, который отвечает за генерацию номера?

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

Можно сделать следующее:
1) В конфигурации выгрузить GenerateSequenseNumberUserTask.md (выделите схему и выберите действие "Экспорт в файл".
2) Открыть выгруженный файл и подменить значения параметров:

  • UID
  • NAME
  • CAPTION

3) Загрузить полученный файл в конфигурацию (действие "Импорт файла")
4) Внести в загруженный файл требуемые изменения
5) Опубликовать изменения
6) Использовать в действии процесса на объекте созданное (импортированное вами действие)

P.S. Все еще не вижу проблемы в создании триггера.

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

Коллеги, добрый день!

Возникла такая проблема: на странице реестра записей Юр. Лица реализовали действие, по нажатию на которое появляется окно выбора справочного значения, и при выборе нужного значения, оно меняется у всех Юр. Лиц, отфильтрованных в реестре. Теперь надо добавить окно подтверждения для пользователя. Я вижу решение двумя способами, но не знаю как реализовать:
1) Добавить дополнительное pop up окно с вопросом-подтверждением действия и выбором из двух значений, либо подтвердить, либо не подтвердить.
Но, с созданием таких окон проблемы и код получится большим на мой взгляд.
Если есть похожие реализованные кейсы, поделитесь пожалуйста :)
2) Добавить маленький процесс с 1-2 двумя элементами: Вопрос пользователю. И если пользователь выбирает "Да", то запускать код, который описан в начале.
Этот вариант предпочтительнее, но я не знаю как передать значение/параметр из процесса в код, описанный в начале.
Если кто сможет подсказать как передать значение из процесса, помогите плиз :)

С уважением,
Дмитрий

Нравится

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

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

Алгоритм решения задачи:
1. В рамках процесса сгенерировать сообщение по WebSocket (элемент ScriptTask).
2. На целевой карточке подписаться на сообщение.
3. В обработчике реализовать интересующую логику.
Пункт 1 и 2 рассмотрены тут: http://www.community.terrasoft.ru/forum/topic/11784

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

Коллеги, добрый день.
После обновления версии приложения до 7.9.1.3284 пропали все настроенные колонки в деталях, сбились колонки реестра в разделах.
Вопрос первый. Есть ли возможность в системе восстановить все так, как было?
Вопрос второй. Если восстанавливать руками, то возникает другая сложность. При желании настроить колонки детали "Доступ к операции" в "Права доступа на операции" -> "Экспорт реестра" нет строчки "Настроить колонки".
Что делать в таком случае?

Нравится

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

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

Настройки колонок раздела и деталей хранятся в объекте (таблице) SysProfileData. Если у вас решение on-site, то вы можете самостоятельно перенести настройки. Если решение on-demand - обратитесь в службу поддержки.

Сценарии обновления предполагают перенос настроек. Возможно при обновлении была какая-то ошибка.

Алексей, спасибо за информацию!

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

Версия
7.9.1.3284
Нужно добавить в БП звонок-элемент чтобы его привязать к активностям и другим объектам.

Нравится

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

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

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

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

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

Вы можете настроить процесс:
1. Стартовый сигнал по изменению записи в звонке, где Активность заполнена.
2. Читать данные в активности, где Id = Пункт 1. Активность.
3. Раздать права доступа на активность, где Id = Пункт 2. Id
4. Открыть страницу редактирования активности, где Id = Пункт 2. Id

Хорошо, это сделаю, но как настроить видимость кнопок звонка и эмейла в миникарточке активности, они создаются динамически. (две кнопки ля контакта и две для контрагента)

Добрый день!

Не могли бы Вы прикрепить скриншот Вашей миникарточки и код создания данных кнопок?


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

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

Логика данной миникарточки находится в UIv2.ActivityMiniPage. Кнопки добавляются при ее создании(методы init и onEntityInitialized). Логика отображения кнопок находится в UIv2.MiniPageEntityConnectionsUtils и NUI.EmailExtendedMenu и работает именно так как Вы описали - при создании миникарточки формируется EntitySchemaQuery запрос в базу данных, и если у данного контака(контрагента) заполнена колонка телефон(e-mail) кнопка будет добавлена. Если таких данных нет - не будет и кнопки.

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

7.9.0.1228 (коробка SalesEterprise)

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

Собственно вопрос, коллеги, в чем может быть причина такой сообщения?

Нравится

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

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

Это предупреждение можно игнорировать, оно носит информационный характер, и предупреждает о том, что по итогу установки нового пакетам их зависимость может изменится.

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

Коллеги, добрый день! Скачали и установили дистрибутив 7.9.1.3284 enterprise, установили пакет полевых продаж, который там совершенно кривой. Результат:

1. Справочники [FieldForceRules], [FieldForceActionType], [FieldForceActionsKnowledgeBase], [FieldForceActionsInRule] в секции Справочники отсутствуют. После регистрации обнаружено отсутствие там данных.

2. Роль "Торговый представитель" в списке ролей отсутствует.

3. Вид "Планирование визитов" в секции "Активности" присутствует, но генерирует не визит, а обычную задачу, выбор типа активности на кнопке "Новый" отсутствует.

4. Мобильное приложение ничем не отличается от стандарта.

5. В пакете "FiledForce" и "FiledForceMobile" связанные данные присутствуют, но половина на русском и при инсталяции пакета их перенос в базу не осуществляется.

Ну и как все это лечить?!

Нравится

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

Добрый день, Дмитрий!

Для анализа описанного Вами кейса просьба уточнить:
1. Была развернута чистая сборка или демо-версия с наполнением?
2. 7.9.1.3284 Sales enterprise ru или enu?
3. Какая ссылка указана на пакет полевых продаж в соответствующей системной настройке?

7.9.1.3284 Sales enterprise enu, чистая (в демонаполнении попытка установить этот пакет приводит к 500 или 400 не помню ошибке). Вы не понимаете, пакет нормальный, в нем данные есть (в пакете). Они не установились при установке пакета. ссылка - http://package-store.bpmonline.com/fieldforce/7.9.1/7.9.1.0/

Добрый день, Дмитрий!

Спасибо за детализацию.
По результатам анализа описанных Вами кейсов пакет ставится корректно, справочники есть, данные в справочниках также есть, роль "торговые представители" в организационной структуре присутствует, визит добавляется (как по кнопке так и перетягиванием), есть выбор именно визита, данные на языке сборке.
Вероятнее всего причиной подобных ошибок является тот факт, что в процессе установки возникла ошибка или сбой. Если в этом есть необходимость, то Вы можете обратится в техническую поддержку и мы предоставим Вам ссылку на релизную сборку 7.9.1.3284 Sales enterprise enu с уже установленным пакетом полевых продаж, где подобных ошибок нет.
Либо же Вы можете удалить пакеты запросом с очисткой зависимостей и попробовать запустить действие еще раз.

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

Добрый день!

Пытаюсь подключиться к приложению bpmonline из стороннего приложения, а точнее из простого консольного приложения(c#). Действую согласно инструкции.
https://academy.terrasoft.ru/documents/technic-sdk/7-9/autentifikaciya-v...
Проблема в том, что какие бы я не указывала userName и userPassword, метод TryLogin мне всегда возвращает true, хотя через UI я не могу подключиться используя эти же учетные данные. То есть если я указываю корректные данные пользователя bpmonline, то метод tryLogin возвращает true и если я указываю произвольный набор символов в качестве логина и пароля, например, 123 и 321, то метод тоже возвращает true

При попытке вызвать метод в строке браузера (http://адрес приложения>/ServiceModel/AuthService.svc/Login) выходит сообщение "Метод не разрешен".

При этом при создании записи из стороннего приложения https://academy.terrasoft.ru/documents/technic-sdk/7-9/dataservice-sozda... если логин/пароль неверны, то создание не проходит, при этом tryLogin все так же возвращает true. Если логин/пароль верны, то создание проходит корректно.

Подскажите, пожалуйста, в чем может быть проблема?
Версия 7.9.0.1228

Нравится

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

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

Прикрепите пожалуйста свой проекта на VS или пример кода.

"Терещук Павел" написал:

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

Прикрепите пожалуйста свой проекта на VS или пример кода.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Terrasoft.Nui.ServiceModel.DataContract;
using Terrasoft.Core.Entities;
using System.Web.Script.Serialization;
using Terrasoft.Common;

namespace trsftTestApp
{
class Program
{
private const string baseUri = "http://192.168.126.72:81";

// Cookie аутентификации bpm'online.
public static CookieContainer AuthCookie = new CookieContainer();
// Строка запроса к методу Login сервиса AuthService.svc.
private const string authServiceUri = baseUri + @"/ServiceModel/AuthService.svc/Login";

static void Main(string[] args)
{
Console.WriteLine(TryLogin("xxxxxxx", "xxxxxxxx"));

}
public static bool TryLogin(string userName, string userPassword)
{
// Создание экземпляра запроса к сервису аутентификации.
var authRequest = HttpWebRequest.Create(authServiceUri) as HttpWebRequest;
// Определение метода запроса.
authRequest.Method = "POST";
// Определение типа контента запроса.
authRequest.ContentType = "application/json";

// Включение использования cookie в запросе.
authRequest.CookieContainer = AuthCookie;

// Помещение в тело запроса учетной информации пользователя.
using (var requesrStream = authRequest.GetRequestStream())
{
using (var writer = new StreamWriter(requesrStream))
{
writer.Write(@"{
""UserName"":""" + userName + @""",
""UserPassword"":""" + userPassword + @"""
}");
}
}
// Получение ответа от сервера. Если аутентификация проходит успешно, в свойство AuthCookie будут
// помещены cookie, которые могут быть использованы для последующих запросов.
using (var response = (HttpWebResponse)authRequest.GetResponse())
{
if (AuthCookie.Count > 0)
{
return true;
}
}
return false;
}

}

}

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

Исправьте условие с if (AuthCookie.Count > 0) на if (AuthCookie.Count > 1)

Здравствуйте
Ориентироваться на количество кук мягко говоря не совсем корректно
Нужно анализировать JSON - объект, который приходит в теле ответа
А именно его свойство Code
Если Code==0, то аутентификация успешна
Иначе ошибка, текст которой можно узнать из свойства Message
В ближайшее время статью на академии исправлю

Привожу правильный исходный код аутентификации для вашего примера
Не забудьте добавить библиотеку System.Web.Extensions в зависимости проекта. Она нужна для парсинга JSON-объекта в ваш экземпляр ResponseStatus

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
//using Terrasoft.Nui.ServiceModel.DataContract;
using Terrasoft.Core.Entities;
//using System.Web.Script.Serialization;
using Terrasoft.Common;
 
namespace trsftTestApp
{
    class ResponseStatus
    {
        public int Code { get; set; }
        public string Message { get; set; }
        public object Exception { get; set; }
        public object PasswordChangeUrl { get; set; }
        public object RedirectUrl { get; set; }
    }
 
    class Program
    {
        private const string baseUri = "http://localhost/bpmonline-7.9.1";
 
        // Cookie аутентификации bpm'online.
        public static CookieContainer AuthCookie = new CookieContainer();
        // Строка запроса к методу Login сервиса AuthService.svc.
        private const string authServiceUri = baseUri + @"/ServiceModel/AuthService.svc/Login";
 
        static void Main(string[] args)
        {
            Console.WriteLine(TryLogin("Supervisor", "Supervisor_1"));
            Console.ReadLine();
 
        }
        public static bool TryLogin(string userName, string userPassword)
        {
            // Создание экземпляра запроса к сервису аутентификации.
            var authRequest = HttpWebRequest.Create(authServiceUri) as HttpWebRequest;
            // Определение метода запроса.
            authRequest.Method = "POST";
            // Определение типа контента запроса.
            authRequest.ContentType = "application/json";
 
            // Включение использования cookie в запросе.
            authRequest.CookieContainer = AuthCookie;
 
            // Помещение в тело запроса учетной информации пользователя.
            using (var requesrStream = authRequest.GetRequestStream())
            {
                using (var writer = new StreamWriter(requesrStream))
                {
                    writer.Write(@"{
""UserName"":""" + userName + @""",
""UserPassword"":""" + userPassword + @"""
}");
                }
            }
            // Получение ответа от сервера. Если аутентификация проходит успешно, в свойство AuthCookie будут
            // помещены cookie, которые могут быть использованы для последующих запросов.
            ResponseStatus status = null;
            using (var response = (HttpWebResponse)authRequest.GetResponse())
            {
                using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
                {
                    string responseText = reader.ReadToEnd();
                    status = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<ResponseStatus>(responseText);
                }
 
            }
            if (status!=null)
            {
                if (status.Code == 0)
                {
                    return true;
                }
 
                Console.WriteLine(status.Message);
            }
            return false;
        }
 
    }
 
}

"Терещук Павел" написал:

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

Исправьте условие с if (AuthCookie.Count > 0) на if (AuthCookie.Count > 1)


Ваш вариант работает. Спасибо!
Подскажите, пожалуйста, почему не работал мой исходный вариант - почему хотя бы одна кука возвращается даже при неуспешной аутентификации? Это особенность terrasoft?
Я брала пример из официальной документации на академии https://academy.terrasoft.ru/documents/technic-sdk/7-9/autentifikaciya-…

"Роман Симута" написал:Здравствуйте
Ориентироваться на количество кук мягко говоря не совсем корректно
Нужно анализировать JSON - объект, который приходит в теле ответа
А именно его свойство Code
Если Code==0, то аутентификация успешна
Иначе ошибка, текст которой можно узнать из свойства Message
В ближайшее время статью на академии исправлю

Большое спасибо! все отработало корректно!

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

Коллеги, добрый день!
Не удается вызвать бизнес-процесс из С# кода.
Из сценария пользователя в бизнес-процессе происходит вызов другого бизнес-процесса. Код бизнес-процесса следующий

var userConnection = GetUserConnection>("UserConnection");
var caseStatusNew = "AE5F2F10-F46B-1410-FD9A-0050BA5D6C38";
var caseStatusInWork = "7E9F1204-F46B-1410-FB9A-0050BA5D6C38";
using (DBExecutor dbExecutor = userConnection.EnsureDBConnection())     {
            Select caseDeadlineResponseSelect = new Select(userConnection).
                Column("Case", "id").As("CaseId").
                From("Case").
                Where("Case", "StatusId").IsEqual(Column.Parameter(caseStatusNew)) as Select;
                using (var dr = caseDeadlineResponseSelect.ExecuteReader(dbExecutor)) {
                        while (dr.Read())
                        {
                                var caseId = dr.GetColumnValue("CaseId").ToString();
                                var utils = new TestUtils();
                                        utils.SendReminding(Guid.Parse(caseId.ToString()));
                                        Update updateCase = new Update(userConnection, "Case").
                                                Set("NrbSentDeadlineResponse", Column.Parameter(true)).
                                                Where("Id").IsEqual(Column.Parameter(caseId)) as Update;
                                        updateCase.Execute();
                        }
                }
   }
   return true;

Для вызова бизнес-процесса был реализован отдельный модуль исходного кода, со следующим наполнением:
namespace Terrasoft.Configuration.UsrUtilities
{
        using System;
        using Core;
        using Common;
        using System.Web;
        using Core.Process;

        public class TestUtils
        {
                private UserConnection _userConnection;
                public UserConnection userConnection
                {
                        get
                        {
                                if (_userConnection != null)
                                {
                                        return _userConnection;
                                }
                                _userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
                                if (_userConnection != null)
                                {
                                        return _userConnection;
                                }
                                var appConnection = (AppConnection)HttpContext.Current.Application["AppConnection"];
                                _userConnection = appConnection.SystemUserConnection;
                                if (_userConnection != null)
                                {
                                        return _userConnection;
                                }
                                return null;
                        }
                        set
                        {
                                _userConnection = value;
                        }
                }

                private void Authenticate()
                {
                        if (userConnection == null)
                        {
                                throw new System.Security.Authentication.AuthenticationException();
                        }
                }
                public TestUtils()
                {
                        Authenticate();
                }

                public void SendReminding(Guid caseId)
                {
                        var processSchemaManager = (ProcessSchemaManager) userConnection.GetSchemaManager(@"ProcessSchemaManager");

                        var processSchema = processSchemaManager.GetInstanceByName(@"UsrSendDeadlineEmail");
                        var process = processSchema.CreateProcess(_userConnection);

                        process.SetPropertyValue(@"CaseId", caseId);
                        process.Execute(_userConnection);
                }
        }
}

Сохранение и компиляция кода происходит успешно. Но при вызове данного бизнес-процесса в журнале процесса, данный процесс отображается с ошибкой:
System.NotImplementedException: Метод или операция не реализована. в Terrasoft.Core.Process.ProcessSchema.CreateProcess(UserConnection userConnection) в Terrasoft.Configuration.NrbUtilities.NorbitUtils.SendReminding(Guid caseId) в Terrasoft.Core.Process.NrbCheckTimingMethodsWrapper.ScriptTask2Execute(ProcessExecutingContext context) в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Нравится

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

Странно. А можете потестить вот так:

namespace Terrasoft.Configuration.UsrUtilities
{
	using System;
	using Core;
	using Common;
	using System.Web;
	using Core.Process;
 
	public static class TestUtils
	{
		public static void SendReminding(Guid caseId, UserConnection user)
		{
			var processSchemaManager = (ProcessSchemaManager)user.GetSchemaManager(@"ProcessSchemaManager");
 
			var processSchema = processSchemaManager.GetInstanceByName(@"UsrSendDeadlineEmail");
			var process = processSchema.CreateProcess(user);
 
			process.SetPropertyValue(@"CaseId", caseId);
			process.Execute(user);
		}
	}
}

В бп:

using Terrasoft.Configuration.UsrUtilities

Вызов:

TestUtils.SendReminding(Guid.Parse(caseId.ToString()), userConnection);

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

Странно. А можете потестить вот так:

namespace Terrasoft.Configuration.UsrUtilities

{

        using System;

        using Core;

        using Common;

        using System.Web;

        using Core.Process;



        public static class TestUtils

        {

                public static void SendReminding(Guid caseId, UserConnection user)

                {

                        var processSchemaManager = (ProcessSchemaManager)user.GetSchemaManager(@"ProcessSchemaManager");



                        var processSchema = processSchemaManager.GetInstanceByName(@"UsrSendDeadlineEmail");

                        var process = processSchema.CreateProcess(user);



                        process.SetPropertyValue(@"CaseId", caseId);

                        process.Execute(user);

                }

        }

}

В бп:

using Terrasoft.Configuration.UsrUtilities

Вызов:

TestUtils.SendReminding(Guid.Parse(caseId.ToString()), userConnection);

Ошибка осталась в том же виде.

Добрый вечер, Дмитрий.

Ошибка System.NotImplementedException свидетельствует что Вы используете не верную реализацию класса.

Пример кода для запуска БП из скрипт таска:

var userConnection = Get<UserConnection>("UserConnection");
var manager = userConnection.ProcessSchemaManager;
var processSchema =  (ProcessSchema)manager.FindInstanceByName("SyncExchangeActivitiesProcess");
if (processSchema == null) 
{
	return true;
}
var moduleProcess = processSchema.CreateProcess(userConnection);
moduleProcess.Execute(userConnection);
return true;

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

Добрый вечер, Дмитрий.

Ошибка System.NotImplementedException свидетельствует что Вы используете не верную реализацию класса.


Ваша реализация преполагает вообще не вызывать процесс, если процесс не является объектов класса ProcessSchema. Но это неправильно, БП должен запускаться, а не игнорироваться.
Я нашел данное решение:

	var processSchema = manager.GetInstanceByName("NrbSendDeadlineEmail");
	var flowEngine = new FlowEngine(userConnection);
	Dictionary<string, string> parameter = new Dictionary<string, string>();
	parameter.Add("Case", caseId.ToString());
	flowEngine.RunProcess(processSchema, parameter);

На данный момент, процесс запускает другой процесс, но не более 1 экземпляра, после чего отображает ошибку:

System.Data.SqlClient.SqlException (0x80131904): New transaction is not allowed because there are other threads running in the session

Если вопрос все ещё актуален, могу предложить обходной путь через планировщик.

string userName = Get<string>("ManagerUserName"); //- Имя пользователя
var userConnection = Get<UserConnection>("UserConnection");
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя группы
string jobProcessName = "MyBusinessProcess"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
 
IDictionary<string, object> parameters = new Dictionary<string, object>();
parameters["ContactNum"] = Get<string>("ContactNum");
parameters["ManagerNum"] = Get<string>("ManagerNum");
parameters["Direction"] = Get<string>("Direction");
 
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
AppScheduler.ScheduleImmediateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, userConnection.Workspace.Name, userName, parameters);
return true;
using Terrasoft.Core.Scheduler
using Quartz.Impl
using Quartz
using Quartz.Impl.Triggers

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

Добрый вечер, Дмитрий.

Ошибка System.NotImplementedException свидетельствует что Вы используете не верную реализацию класса.

Пример кода для запуска БП из скрипт таска:

var userConnection = Get<UserConnection>("UserConnection");

var manager = userConnection.ProcessSchemaManager;

var processSchema =  (ProcessSchema)manager.FindInstanceByName("SyncExchangeActivitiesProcess");

if (processSchema == null)

{

        return true;

}

var moduleProcess = processSchema.CreateProcess(userConnection);

moduleProcess.Execute(userConnection);

return true;


7.10.1 проверено и не работает. Никаких ошибок нет, но не инициирует запуск передаваемого БП.

Проверил на 7.10.1 Отработали оба процесса. Столкнулся и с System.NotImplementedException. Ошибка возникает если вызываемый бизнес процесс не содержит элементов, требующих компиляции и решается установленным чекбоксом "Компилировать".

Вам же необходимо провести отладку, скорей всего условие processSchema == null выполняется и происходит выход из ScriptTask.

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

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

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

Нравится

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

BusinessRuleModule вам в помощь
ссылка на sdk

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

Вы можете реализовать такую логику посредством бизнес-правил.
Больше информации Вы найдете в документаци:
https://academy.terrasoft.ru/sites/default/files/documents/docs/technic…

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

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

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

Больше информации Вы найдете в документаци:

https://academy.terrasoft.ru/sites/default/files/documents/docs/technic/...

Спасибо. Но не смог разобраться какое значение ставить вместо ConfigurationConstants.ContactType.Client. Насколько я понял это указатель на значение Клиент в поле Тип клиента, карточки контакта. Где можно посмотреть значение Потребность отсутствует поля Зрелость потребности, карточки Лида?

"Маншилин Богдан" написал:Где можно посмотреть значение Потребность отсутствует поля Зрелость потребности, карточки Лида?

В бд, таблица leadTypeStatus. Вообще выглядеть правило должно примерно так:

"LeadTypeStatus": {
	BindParameterRequiredFieldLeadTypeStatus: {
		ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
		property: BusinessRuleModule.enums.Property.REQUIRED,
		conditions: [{
			leftExpression: {
				type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
				attribute: "LeadTypeStatus",
				attributePath: "Id"
			},
			comparisonType: Terrasoft.ComparisonType.EQUAL,
			rightExpression: {
				type: BusinessRuleModule.enums.ValueType.CONSTANT,
				value: "f78066d3-a73e-4e86-bb99-e477fcb94b28"
			}
		}]
	}
}

Еще 1 проблема - в коде LeadPage явно прописано

"LeadTypeStatus": {
	isRequired: true
},

для атрибута и поля, возможно флаг придется убрать

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

Добрый день!
В разделе "Лиды" в привязанных контрагентах отображаются похожие контрагенты. Стандартный функционал подбирает похожих по правилу (из документации https://academy.terrasoft.ru/documents/marketing/7-9/chasto-zadavaemye-v...):
"Похожим считается контрагент, у которого:
Значение поля [Название контрагента] на странице лида совпало со значением поля [Название контрагента] на странице контрагента.
Значения полей [Название контрагента] и [Страна] на странице лида совпадают со значениями полей [Название контрагента] и [Страна] на странице контрагента."
То есть сравниваются поля Name из Account и Account из Lead. Мне необходимо добавить правило поиска похожих при совпадении ИНН. В лидах и контрагентах я добавила поле UsrInn.
В базе есть хранимая процедура, которая занимается поиском похожих tsp_FindAccountSimilarRecords. Создала копию этой процедуры и вместо DECLARE @accountNameColumn sysname = 'Name' поставила DECLARE @accountNameColumn sysname = 'UsrInn'. Но скорее всего это только указание поля для сравнения в контрагенте. Где указанна колонка для лида, мне найти не удалось. Знаний в sql у меня не много, но предполагаю, что необходимо выполнить еще какую то регистрацию добавления правил похожих.
Так же была написана отдельная хранимая процедура для сравнения UsrInn в лидах и контрагентах, выдающая похожих контрагентов. Но где то определенно нужна регистрация этого правила.
Кто нибудь сталкивался с подобным? Или, возможно, у кого то есть мысли по поводу решения данной задачи?

Нравится

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

Добрый день!

Сперва необходимо добавить запись в таблицу DuplicatesRule, указав Name, IsActive и ObjectId аналогично уже существующим правилам.

В tsp_FindAccountSimilarRecords необходимо сделать следующее:
1. объявить своё правило аналогично @AccountNameRule, указав id записи, которую добавили в DuplicatesRule
2. объявить пользовательское поле аналогично @accountNameColumn
3. в @accountRulesConfig добавить запись для своего правила аналогично существующим правилам.

Добрый день!
Можете рассказать поподробнее о третьем пункте? Я объявила новое правило @InnRule и пользовательское поле @accountInnColumn, но мне не понятно, что именно описывают правила в @accountRulesConfig. В таком виде не работает:
(@InnRule, @accountSchemaName, NULL, @accountInnColumn, @baseNormalizeFn + '(##VALUE##,''' + @nameNormalizePattern + ''')', @accountCleanDataSchemaName)

Добрый день!

Для того, чтобы ваше правило поиска работало, вам так же нужно переопределить SimilarLeadSearchHelper.cs из пакета CoreLead. Именно этот исходный код на сервере отвечает за генерацию XML, который описывает ваш текущий лид для обработки в процедуре.

Вам нужно создать новый Исходный код в Конфигурации и заполнить его по примеру(прикрепляю .txt)

P.S. Конкретно для ИНН лучше написать фильтр вида:
@innNormalizePattern nvarchar(12) = N'0-9'
и правило описать как:
(@InnRule, @accountSchemaName, NULL, @accountInnColumn, @baseNormalizeFn + '(N##VALUE##,N''' + @innNormalizePattern + ''')', NULL)

Добрый день!
Большое спасибо, все работает!

Тот же самый кейс, но, к сожалению, после обновления форума нет возможности скачать пример, как переопределить SimilarLeadSearchHelper.cs. Может у кого-то из участников сохранился этот файл? Или быть может кто-то сталкивался с подобным кейсом и может подсказать?!

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