Коллеги, добрый день! Скачали и установили дистрибутив 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. Может у кого-то из участников сохранился этот файл? Или быть может кто-то сталкивался с подобным кейсом и может подсказать?!

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

Коллеги, всем привет!

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

Нравится

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

Добрый день!
Если заблокирован пакет, то можно снять блокировку вручную (через TortoiseSVN Repository Browser, например) файла CommitLocker.
Ревизии в SVN не удаляются, можно сделать откат на любую раннюю ревизию, создав новый commit и после этого обновить систему до старой версии

Подскажите, как снять блокировку с commitLoker?

Правой кнопкой на CommitLocker -> Break lock

https://db.tt/2ROwRs7TXR - при нажатии правой кнопкой отображаются только эти действия.

"Сергей Фролов КРОК" написал:

https://db.tt/2ROwRs7TXR - при нажатии правой кнопкой отображаются только эти действия.

Данная схема у вас не заблокирована, т.к. поле lock пустое (в случае блокировки заполнено именем пользователя).
Попробуйте обновить страницу правой кнопкой Refresh. Если не появится, то пакет не заблокирован

Сергей Фролов КРОК, попробуй в корневой папке диска С найти папу с репами, там выбери свою и найди в ней папку locks.
Попробуй из неё все файлы удалить, когда мы с такой же проблемой столкнулись именно так и сделали.

Спасибо за совет, но к сожалению не помогло. Вылезает все та же ошибка - https://db.tt/OfoejzImcD

Помогло удаление файлов из другой папки лок, спасибо)

"Сергей Фролов КРОК" написал:

Помогло удаление файлов из другой папки лок, спасибо)


Да не за что)

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

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

Версия 7.9.

Необходимо на странице Лида добавить пункт в существующее подменю Дисквалификации.

В качестве примера воспользовались реализацией добавления остальных пунктов из файла LeadPageV2 в пакете Lead (при этом от этого файла уже создан наследник в нашем рабочем пакете).

getActions: function() {
                                                var actionMenuItems = this.callParent(arguments);
                                                var disqualifyMenuItems = this.Ext.create("Terrasoft.BaseViewModelCollection");
                                                disqualifyMenuItems.addItem(this.getActionsMenuItem({
                                                        Caption: {bindTo: "Resources.Strings.DisqualifyLeadDouble"},
                                                        Tag: "disqualifyDouble"
                                                }));
                                                return actionMenuItems;
                                        },

Но это не помогло. Пока добавили пункт в основное меню. Можно ли как-нибудь добавить его именно в подменю?

Нравится

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

пакет CoreLead, схема LeadPageV2, обратите внимание на метод

getActions: function() {
	var actionMenuItems = this.callParent(arguments);
	var menuSeparator = this.getActionsMenuItem({
		"Type": "Terrasoft.MenuSeparator"
	});
	actionMenuItems.addItem(menuSeparator);
	var disqualificationMenuItems = this.get("DisqualificationMenuItems");
	disqualificationMenuItems.each(function(item) {
		actionMenuItems.addItem(item);
	});
	return actionMenuItems;
}

Все пункты подменю валяются в this.model.attributes.DisqualificationMenuItems. Попробуйте туда добавить свой пункт меню. Скорее всего все это надо будет делать до callParent.

Попробовал разные варианты:

Вот так:

getActions: function() {
 
				var disqualificationMenuItems = this.get("DisqualificationMenuItems");
				disqualificationMenuItems.addItem(this.getActionsMenuItem({
					Caption: {bindTo: "Дубль 2 тест"},
					Tag: "changeLeadStatus"
				}));
 
				var actionMenuItems = this.callParent(arguments);
 
				actionMenuItems.addItem(this.getButtonMenuItem({
                    // Привязка заголовка пункта меню к локализуемой строке схемы.
                    "Caption": {bindTo: "Resources.Strings.DisqualifyLeadDuplicate"},
                    // Привязка метода-обработчика действия.
                    "Tag": "changeLeadStatus",
                }));
 
				return actionMenuItems;
			},

Добавляется, но в основное меню. Если то же самое вызову после this.callParents:

var disqualificationMenuItems = this.get("DisqualificationMenuItems");
				disqualificationMenuItems.addItem(this.getActionsMenuItem({
					Caption: {bindTo: "Дубль 2 тест"},
					Tag: "changeLeadStatus"
				}));

то не добавляется вообще никуда.

Всё, нашёл.

Не DisqualificationMenuItems, а DisqualificationReasonsMenuItems :)

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

Добрый день!

Создала деталь с редактируемым реестром согласно инструкции из документации https://academy.terrasoft.ru/documents/technic-sdk/7-9/sozdanie-detali-s...
Деталь создалась корректно. Единственное, что меня смутило, что когда я выбрала вариант "Выбрать несколько записей" для данной детали, то деталь никак не изменилась. Для обычной детали появляется поле типа checkbox.
Как я могу включить возможность множественного выбора?
Пробовала добавить в attributes
// Признак множественного выбора
"multiSelect": {
// Тип данных — логический.
dataValueType: Terrasoft.DataValueType.BOOLEAN,
// Тип атрибута — виртуальная колонка модели представления.
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
// Устанавливаемое значение.
value: true
}
но ничего не изменилось.

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

Нравится

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

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

Для реализации множественного выбора для детали необходимо замещать действие нажатия кнопки добавления, в её обработчике открывать справочник с параметром мультивыбора, и в колбеке выбранные записи уже программно добавлять на деталь.
Пример был в соседней теме:
http://www.community.terrasoft.ru/forum/topic/24705
По поводу что еще можно делать с выбираемыми галочками записями, в принципе, что угодно, список айдишников у вас есть, можете их хоть менять, хоть удалять, статьи по EntitySchemaQuery на академии вам в помощь.

"Максим Шевченко" написал:Для реализации множественного выбора для детали необходимо замещать действие нажатия кнопки добавления, в её обработчике открывать справочник с параметром мультивыбора, и в колбеке выбранные записи уже программно добавлять на деталь.

Мне кажется, мы говорим о разных вещах. Я имела в виду функциональность, которая реализована для детали График поставок и оплат вкладки Итоги раздела Заказы. Во вложении скрины 1 и 2. Я создала деталь с редактируемым реестром Курьерская служба по инструкции. Вариант "Выбрать несколько записей" у меня есть (скрин 3), но после его выбора чекбоксы не вышли(результат на скрине 4, ожидалось, что будет как на скрине 2)

"Максим Шевченко" написал:По поводу что еще можно делать с выбираемыми галочками записями, в принципе, что угодно, список айдишников у вас есть, можете их хоть менять, хоть удалять, статьи по EntitySchemaQuery на академии вам в помощь.

Спасибо!

"Zaitova Liubov" написал:"Выбрать несколько записей"

Теперь понял. К сожелению такой возможности для ред. реестра на данный момент еще нет.

"Максим Шевченко" написал:
Zaitova Liubov пишет:

"Выбрать несколько записей"

Теперь понял. К сожелению такой возможности для ред. реестра на данный момент еще нет.


А как же деталь "График поставок и оплат" вкладки "Итоги" раздела "Заказы"? Там же эта функциональность есть.
Или она есть только в некоторых базовых деталях,а сами мы не можем создать такую деталь?

Деталь "График поставок и оплат" является уникальной и создать подобную базовыми средствами (без доработок на уровне схем) невозможно. Код самой детали Вы можете посмотреть в схеме SupplyPaymentDetailV2 из пакета Passport.

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

Доброго времени суток!
Столкнулся с проблемой при переносе данных справочника между softkey 7.9.0.
Дело в том что всё делал как было показано на одном из вебинаров или статей с форума, но в той конфигурации куда я переношу эти данные они не отоборажаются.
На той версии куда переношу данный справочника, они отображаются так же как на втором скрине.

Нравится

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

Коллеги, у нас тоже самое произошло с 7,9

"Юсупов Марат" написал:

Коллеги, у нас тоже самое произошло с 7,9


Самое что интересное, проверил пару часов назад и в облачной версии Bpm 7.9.1 такого нету, и на 7.8.0 нету

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

Попробуйте удалить и повторно создать привязку. Также можно выполнить обновление до 7.9.1.

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

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

Попробуйте удалить и повторно создать привязку. Также можно выполнить обновление до 7.9.1.


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

Интересная картина, данные как бы есть..но не все)))

"Юсупов Марат" написал:

Интересная картина, данные как бы есть..но не все)))

Прикрепленный файлРазмер

20170209_packagedata.png
89.32 кб


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

"Кисловский Михаил Андреевич" написал:
Юсупов Марат пишет:

Интересная картина, данные как бы есть..но не все)))

Прикрепленный файлРазмер

20170209_packagedata.png

89.32 кб

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

Марат, добрый день!

Если воспроизведете кейс в версии 7.9.1, то просьба сообщить на support@terrasoft.ru с подробным описанием.
Согласно кейсу в описании топика ошибка не воспроизводится.

Дмитрий, я выше описывал что на облачном демо-стенде такой ошибки не наблюдалось.

"Кисловский Михаил Андреевич" написал:

Дмитрий, я выше описывал что на облачном демо-стенде такой ошибки не наблюдалось.

Михаил, а в on-site 7.9.1?

"Вильшанский Дмитрий" написал:

Михаил, а в on-site 7.9.1?


У нас пока проблемы с обновлением версии.
Вот такая вот ошибка вылетает в ходе выполнения действий по инструкции на академии.

Добрый день, Михаил.

Предлагаем скачать архив с файлами обновления по следующей ссылке: http://ftp.bpmonline.com/support/pub/s.kubrish/791.rar.
При работе с файлами из приведенного архива данная ошибка не воспроизводится.

С уважением,
Группа компаний Terrasoft

Мария Ватулина, благодарю.

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

Среда разработки 1
1 БД, 2 рабочих пространства для каждого программиста, 1 SVN на CollabNet, 2 WebApp в IIS

Как избежать конфликтов - не стереть данные коллеги?

Нравится

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

Добрый день, Марат.

Для избежания конфиликтов рекомендуем вам использовать блокировку элементов пакета.

С уважением,
Группа компаний Terrasoft

"Мария Ватулина" написал:

Добрый день, Марат.

Для избежания конфиликтов рекомендуем вам использовать блокировку элементов пакета.

С уважением,

Группа компаний Terrasoft


Про бликировку. Хотелось бы сказать след-е.
У нас был такой случай: объект можно заблокировать. А вот страницу раздела тоже, но другой пользователь может в ней менять и тоже блокировать, система не даст никаких предупреждений о блокировке.
У вас было чтото похожее?

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

Если проблема наблюдается в разных рабочих пространствах (workspace), то нужно анализировать. Если описанное поведение наблюдается в одном рабочем пространстве, то это нормальное поведение системы, т.к. у каждого разработчика должно быть свое рабочее пространство. Блокировки возникают если несколько человек параллельно работают в одном рабочем пространстве.

Добрый день.
Сергей у нас наоборот - Разные пространства.
И периодически система при фиксации пакета говорит, что пакет нельзя зафиксировать стоит Commit. Самое интересное перед изменением файла нет никаких предупреждений, что файл заблокирован пользователем Х, кроме Объектов.
Приходиться через "тортилу" заходить и разблокировать.
Может CollabNet какие то настройки надо сделать, у нас по дефолту.
Неудобно.

У нас двухуровневая система блокировок:

1. БД *(на уровне workspace)
2. B SVN

Если разработка проходит в нескольких пространствах, то работает вторая (svn), и механизм разруливания блокировок на стороне SVN:
- при изменении схемы автоматически ставится блокировка в SVN, которая снимается при commit-e.
Если приходится разблокировать вручную, то тот кто менял схему не зафиксировал свои изменения.

Коллеги. еще конфликт появился.
Создали деталь.
Файл заблокировали, чтобы никто не смог его поменять. После изменений. Разблокировать не можем потому, что в хранилище нет его.
Переименовали, все равно не дает удалить либо зафиксировать пакет в хранилище.
Удалили, заново создали деталь он сразу стал Заблокированным.

Что такое?
Как я понимаю есть системная таблица где храниться информация что он заблокирован. Где подскажите пож-та?

еще дополнительно ... попытались создать деталь новую.
После создания она опять стала заблокированной(зеленый замок) как так?

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

Таблица называется SysSchema, поле isLocked.

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