Привязываю данные к пакету, нажимаю кнопку [Показать данные] - 'Всего записей: 7'.

Потом перехожу во вкладку 'Привязанные данные', нажимаю кнопку [Проверить данные] и вижу, что у меня отображается 'Всего записей: 5', хотя должно отображаться 7.

По какой причине могут не отображаться ещё 2 значения?

Нравится

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

Алла, добрый день.
На вашем первом изображении отображается 7 записей - это кол-во записей в вашем приложении, которые подходят по фильтру.
На втором изображении 5 записей - это те записи, которые уже привязаны и находятся в вашей привязке. 
Т.е. Если вы хотите чтобы в вашей привязке были все 7 записей, которые на данный момент находятся в вашем приложении, вам необходимо перепривязать (пересохранить) вашу привязку.

На втором скрине данные которые уже привязаны к пакету и находятся в свн, а на первом 5 записей, которые уже давно привязаны к пакету и находятся в свн + 2 записи, которые вы привязали но еще не залили в свн

Миннекаев Айдар,

В данном случае вообще не работаю с SVN.

Все 7 записей ранее не были привязаны к пакету.

Из-за этого потом не могу привязать все 7 записей в таблицу LookupInFolder, выдается сообщение, что 2 записи не добавлены и это как раз те 2 записи, которые не отображаются на второй вкладке.

Есть ещё какие-то варианты?

Была подобная проблема связанная с локализацией. Попробуйте привязать по ИД. А еще после установки приложения https://marketplace.terrasoft.ru/app/data-binding-tool процесс привязки данных стал в разры проще.

Алла, если есть доступ к базе, поищи, в чём различие между этими двумя записями и остальными. Может, их Id упомянут в каких-то таблицах или наоборот, нет. Может, что-то не так с локализацией этих значений, когда строковые значения на разных языках хранятся в разных таблицах.

Алексей Следь пишет:
Была подобная проблема связанная с локализацией. Попробуйте привязать по ИД.

Какая именно проблема - можете подробнее написать? С привязкой по Id работает аналогично.

 

Зверев Александр пишет:
Может, что-то не так с локализацией этих значений, когда строковые значения на разных языках хранятся в разных таблицах

С локализацией вроде все в порядке. Все справочники создавались под одной локализацией и не переводились на другие языки.

Какие ещё могут быть варианты?

Возможно, есть какие-то специфические условия привязки данных к пакету?

Алла, добрый день.
На вашем первом изображении отображается 7 записей - это кол-во записей в вашем приложении, которые подходят по фильтру.
На втором изображении 5 записей - это те записи, которые уже привязаны и находятся в вашей привязке. 
Т.е. Если вы хотите чтобы в вашей привязке были все 7 записей, которые на данный момент находятся в вашем приложении, вам необходимо перепривязать (пересохранить) вашу привязку.

P.Shvedun пишет:
вам необходимо перепривязать (пересохранить) вашу привязку.

 А каким образом это сделать?

Алла, причина и способ устранения могут быть аналогичными этой теме.

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

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

О переносе речь не идет, так как данные не привязываются.

Значит, нужно смотреть, в чём разница между теми записями, что привязались, и что нет.

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

Уже смотрела, но разницы не нашла. Можешь конкретнее написать, что следует проверить?

Но если внешне одинаковые записи в одном и том же справочнике ведут себя различно, значит они не совсем одинаковые, разница либо в полях, либо в наличии/отсутствии ссылок из других таблиц. Есть скрипты по поиску Guid по всей базе, может, по Id этих справочников будет что-то интересное?

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

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

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

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

На странице есть справочник "Сотрудник" при нажатии выходит окно Выбора - можно ли сделать этот выбор в виде дерева по "Подразделение"? То есть при нажатии на папку "Подразделение 1" выходили все сотрудники этого подразделения.

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

Нравится

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

Доброе утро.

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

Посмотрите обсуждение подобной темы в этом посте.

 

Доброе утро.

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

Посмотрите обсуждение подобной темы в этом посте.

 

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

Доброго времени суток!Возникла необходимость учитывать регистр строки в фильтре при запросе esq С# . Никто не встречался с такой проблемой?Как это можно реализовать?

Нравится

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

Система полагается на стандартные настройки базы данных. В MS SQL по умолчанию регистр не учитывается, настройка меняется на уровне всей базы, как описано тут. Только учтите, что работу системы с изменёнными настройками регистрозависимости никто не тестировал и сайт может заработать некорректно в других местах.

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

Благодарю за ответ

Может кому пригодится. Решили эту проблему следующим образом - конвертировали строку в base64.

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

Добрый день!

Не могу понять почему в результате выполнения команды 

EntitySchema schema = _userConnection.EntitySchemaManager.FindInstanceByName("Account");

в результате schema == null

Подскажите, пожалуйста, в каких случаях может такое происходить.

Нравится

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

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

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

Добрый день ! Тестирую метод создания пользователей через DataService.

Предварительно авторизуюсь через POST http://localhost/ServiceModel/AuthService.svc/Login от имени supervisor. В BPM supervisor имеет орг.роль System administrators, с разрешением управления справочником пользователей. После авторизации добавляю header BPMCSRF в заголовок запроса POST http://localhost/0/DataService/json/reply/InsertQuery.

Получаю ответ 500 SecurityException

"responseStatus": {
    "ErrorCode": "SecurityException",
    "Message": "Текущий пользователь не имеет прав на объект \"SysAdminUnit\"",
    "Errors": []
  }

Просьба прокомментировать, каких прав пользователю supervisor не хватает для создания пользователя в SysAdminUnit, возможно надо использовать другой способ

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

 

 

Нравится

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

См. причину тут.

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

Есть ли рабочее решение для программного создания пользователей через DataService или другой интерфейс ?

Страница UserPageV2 работает через методы AdministrationService, такие как метод UpdateOrCreateUser.

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

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

Возникла необходимость создать некоторые макросы для Email, воспользовался https://academy.terrasoft.ru/documents/technic-sdk/7-14/dobavlenie-obrabotchika-makrosa-v-shablone-email-soobshcheniya но возникло несколько вопросов.

В клиентской сборке не обнаружил IMacrosInvokable, в статье не было указанно что этот функционал доступен в определенной ветке продукта. Нашел в тройном билде и скопипастил (IUsrMacrosInvokable) себе, также добавил  в EmailTemplateMacros @Invoke.

Но макросы не заработали. Подскажите что я пропустил? или это можно было сделать как то по другому. Заранее благодарю!

Нравится

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

В статье слева указано, что она относится к разделу кастомизации продукта «service». Сам по себе IMacrosInvokable не содержит никакой логики, судя по первой букве названия, это интерфейс. Нужно искать схемы, с ним работающие, например, InvokeMethodMacrosWorker.

Но даже если Вы всё требуемое для работы этого механизма перенесёте, не факт, что функциональность заработает, поскольку наличие доступа на те или иные объекты задаётся лицензиями. В таком случае Вам будет нужно приобрести лицензии на бандл, включающий функциональность продукта «service» и обновить систему на него.

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

Благодарю за подсказку.

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

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

Столкнулся с проблемой отображения уведомлений в коммуникационной панели.

Задача: при добавлении нового участника в деталь "команда" в карточке продажи - уведомлять добавленного участника в коммуникационной панели.

Делал через бп (скриншот во вложении).

При смене NotificationType на Notification - во вкладке системных уведомлений все отображается корректно. Можно перейти в продажу по ссылке.
При значении Reminding - во вкладке напоминаний пустота (а напоминание нужно как раз именно там). При этом на счетчике самой вкладки видно, что напоминание есть.

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

С Активностями-Участниками аналогичный бп работает нормально (уведомления в напоминаниях отображаются).

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

Нравится

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

Возможно, при создании записи в таблице Reminding не заполнены нужными значениями все поля. Сравните в базе значения у той записи, что отображается у пользователя в этом разделе верно и у Вашей, созданной при помощи БП.

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

Александр, спасибо за подсказку. В таблице Reminding поле SourceId получает null. Не совсем пока понятно что с этим сделать, но это уже хоть что-то) Буду разбираться.

Александр, на Вашем скриншоте в элементе БП создания напоминания нет заполнения этого поля SourceId, нужно добавить. Возможные варианты значений есть в таблице справочника RemindingSource.

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

Александр, так я тоже пробовал еще в самом начале. К сожалению никакого эффекта это не дает (но кстати SourceId в таблице заполняется, это да).

На данный момент оставил уведомления как NotificationType = Notification. Но хотелось бы конечно разобраться.

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

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

Добрый день.

Проблема такова: есть сущность DocumentEntity, в ней есть справочное поле SenderId(в нем хранится Id из справочника) - каким образом можно получить сущность записи из справочника не прибегая к ESQ (с ESQ все работает, но при отладке в VS обратил внимание на свойство LookupColumnEntities)?

Код:

var SenderEntityLookup = DocumentEntity.LookupColumnEntities.GetEntity("Sender") as Sender;
var Code = SenderEntityLookup.GetTypedColumnValue("Code");

VS:

LoadState: NotLoaded

"Невозможно получить значение колонки Code, так как она не была загружена"

 

Нравится

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

Данные хранятся в базе на сервере, их изначально нет в объектах.

В единственном примере упоминания этого свойства в конфигурации в схеме DetailIndexer эту Entity так получают, а потом отдельно наполняют при помощи SetColumnValue:

private Entity GetDetailParentEntity(Entity detailEntity) {
	var parentEntityName = detailEntity.SchemaName.Contains("Contact") ? "Contact" : "Account";
	var parentEntityColumn = $"{parentEntityName}Id";
	if (!detailEntity.IsColumnValueLoaded(parentEntityColumn)) {
		return null;
	}
	var parentEntity = detailEntity.LookupColumnEntities.GetEntity(parentEntityName);
	parentEntity.SetColumnValue(parentEntity.Schema.PrimaryColumn,
		detailEntity.GetTypedColumnValue<Guid>(parentEntityColumn));
	return parentEntity;
}

 

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

Доброе утро.

Есть 2 вопроса по работе со схемами кампаний.

1. Подскажите, есть ли способ перенести схему кампании из одного пакета в другой (поле 'Пакет', как в других схемах конфигурации отсутствует)?

2. Каким образом корректно удалить уже настроенную схему кампании?

 

Нравится

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

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

Удалять кампании корректно можно по соответствующей кнопке, но только те, которые ещё не запускались.

 

Зверев Александр пишет:
Удалять кампании корректно можно по соответствующей кнопке, но только те, которые ещё не запускались.

А что делать, если нужно удалить тестовые компании в состоянии 'Завершена' ?

В каких таблицах хранится информация, которую нужно удалить?

Или, например, если запросом изменить состояние кампании 'Запланирована'?

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

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

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

Есть задача: сделать веб-сервис, принимающий на вход сложное json-тело.

В ходе реализации столкнулась с двумя проблемами:

1. Не нашла, как описать прием сложного параметра в сервисе, кроме робкого указания на модификаторы [DataContract] и [DataMember]. Подскажите, где-нибудь есть информация об этом? 

2. При вызове из Postman сервис возвращает ответ "403 - Вы не имеете разрешения на просмотр этого каталога пли страницы." (скриншот ниже). Нужно ли где-то отдельно прописывать права на доступ к сервисам?

 

Скриншот ошибки:

Листинг пример json тела запроса.

{
"scoring_events" : [
		{
			"type" : "pageview",
			"page_url" : "https://bpmonline.com/",
			"datetime_utc" : "2018-08-08 12:00:12",
			"responsible_user" : {
				"name" : "Иван Иванов",
				"email" : "i.ivanov@yandex.ru",
				"type" : "user"
			},
			"partner" : {
				"name" : "ООО Ромашка"
				"bpm_id" : "783967ef-c629-4f1d-8cd4-3b3dba955ffc",
				"contact_email" : "n.ivanova@yandex.ru"
			}
		},
		...
		{
			...
		}
	]
}

 

листинг сервиса:

namespace Terrasoft.Configuration.WScoringService
{
	using System;
<...>
#region Class: WScoringService 
	[ServiceContract]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
	public class WScoringService : BaseService
	{
        private WScoringServiceResponse wScoringServiceResponse;
 
        #region Methods: Public
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string AddScoringEvent(List<ScoringEvent> scoring_events)
        {
            if (scoring_events.IsEmpty()) wScoringServiceResponse = new WScoringServiceResponse(true, "empty");
            else wScoringServiceResponse = new WScoringServiceResponse(true, scoring_events[0].ToString());
            return wScoringServiceResponse.ToJsonString();
        }
        #endregion
        #region  DataContract
	    [DataContract]
	    public class ScoringEvent
	    {
	    	[DataMember]
	        public string type;
	        [DataMember]
	        public string page_url;
	        [DataMember]
	        public string datetime_utc;
	        [DataMember]
	        public ResponsibleUser responsible_user;
	        [DataMember]
	        public Partner partner;
	        public override string ToString()
	        {
	            string result;
	            result = "type=" + type + ";";
	            result += "page_url=" + page_url + ";";
	            result += "datetime_utc=" + datetime_utc + ";";
	            result += "responsible_user_name=" + responsible_user.name + ";";
	            result += "partner_name=" + partner.name + ";\n";
	            return result;
	        }
	    }
	    [DataContract]
	    public struct ResponsibleUser
	    {
	    	[DataMember]
	        public string name;
	        [DataMember]
	        public string email;
	        [DataMember]
	        public string type;
	    }
	    [DataContract]
	    public struct Partner
	    {
	    	[DataMember]
	        public string name;
	        [DataMember]
	        public string bpm_id;
	        [DataMember]
	        public string contact_email;
	    }
	    #endregion
    }
    #endregion
 
    #region Class: WScoringServiceResponse
    public class WScoringServiceResponse
    {
        private bool success;
        private string message;
        public WScoringServiceResponse() { }
        public WScoringServiceResponse(bool success, string message = null)
        {
            this.success = success;
            this.message = message;
        }
        public string ToJsonString()
        {
            string result = "{\"status\":\"";
            if (success) result += "ok\",";
            else result += "error\",";
            result += "\"message\":\"" + message+ "\"}";
            return result;
        }
    }
    #endregion
}

 

Нравится

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

Примеры сервисов можно найти в конфигурации. Например, [DataContract] и [DataMember] применяют в CurrentUserService так:

[DataContract]
public class UserCultureInfo
{
	[DataMember(Name = "timeZoneCode")]
	public string TimeZoneCode { get; set; }
 
	[DataMember(Name = "timeZoneName")]
	public string TimeZoneName { get; set; }
 
	[DataMember(Name = "timeZoneId")]
	public Guid TimeZoneId { get; set; }
 
	[DataMember(Name = "cultureId")]
	public Guid CultureId { get; set; }
 
	[DataMember(Name = "cultureName")]
	public string CultureName { get; set; }
 
	[DataMember(Name = "cultureLanguage")]
	public string CultureLanguage { get; set; }
 
	[DataMember(Name = "dateTimeFormatId")]
	public Guid DateTimeFormatId { get; set; }
 
	[DataMember(Name = "dateTimeFormatName")]
	public string DateTimeFormatName { get; set; }
}

По поводу 403, такое бывает, если при отправке запроса к сервису не передать CSRF-токен.

И вот я пишу другой подобный сервис, привожу пример, который у меня заработал

 

Данные, которые отправляются в сервис:

{
    "WCases": [{
            "message": "webinar test",
            "user_crm_id": "CFAC23D8-8EEA-4EB6-A257-0001538F0723"
        }, {
            "message": "webinar test 2",
            "user_crm_id": "CFAC23D8-8EEA-4EB6-A257-0001538F0723"
        }
    ]
}

Код сервиса:

namespace Terrasoft.Configuration.WCaseService
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using System.Collections.Generic;
    using Terrasoft.Core;
    using Terrasoft.Web.Common;
    using Terrasoft.Configuration.Slack;
    using System.Runtime.Serialization;
 
    #region WCaseService
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class WCaseService : BaseService
    {
        #region init
        private SystemUserConnection _systemUserConnection;
        private SystemUserConnection SystemUserConnection
        {
            get
            {
                return _systemUserConnection ?? (_systemUserConnection = (SystemUserConnection)AppConnection.SystemUserConnection);
            }
        }
        #endregion
        #region main: endPoints
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string ImportData(List&lt;WCaseTemplate&gt; WCases)
        {
            string result = "";
 
            if (WCases != null)
            {
                foreach (WCaseTemplate wCasein WCases)
                {
                    result += "message: " + wCase.UserMessage + "\nuser_crm_id: " + wCase.UsrLoginId.ToString() + "\n";
                }
            }
            else result = "NULL";
 
            return result;
        }
        #endregion
    }
    #endregion
    [DataContract]
    public class WCaseTemplate
    {
        [DataMember(Name = "message")]
        public string UserMessage { get; set; }
 
        [DataMember(Name = "user_crm_id")]
        public Guid UsrLoginId { get; set; }
    }
}

 

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