Всем привет)

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

Есть вот такое поле:

	{
		"operation": "insert",
		"name": "STRINGb4b8f8bf-771b-4032-bd24-86256f8f1cb9",
		"values": {
			"layout": {
				"itemType": this.Terrasoft.ViewItemType.HYPERLINK,
			     "style": "t-btn-wrapper t-btn-text t-btn-style-green actions-button-margin-right",
				"colSpan": 24,
				"rowSpan": 1,
				"column": 0,
				"row": 10,
				"layoutName": "ProfileContainer"
 
			},
			"itemType": 
			"bindTo": "UsrEmailTemplateLink",
			"enabled": true
		},
		"parentName": "ProfileContainer",
		"propertyName": "items",
		"index": 10
	},

Как значение этого поля сделать гиперссылкой?

Нравится

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

Роман, здравствуйте!

Пример кода, которым можно реализовать поле-ссылку, недавно рассматривалось на Community, там же есть и пример реализации - https://community.terrasoft.ru/questions/pole

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

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

В счете нужно сделать поле Договор обязательным для заполнения, если в качестве клиента выбран Контрагент (а не Контакт).

Поле Договор находится на детали Связи.

Какие варианты?

Версия 7.12.0

Нравится

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

Пока сделал через проверку в методе Save, но интересно, есть ли всё таки возможность сделать через BINDPARAMETER?

Борис, здравствуйте!

К сожалению, бизнес-правила не работают с полями, которые находятся в контейнере (а "Клиент" - это как раз контейнер).

Обходные решения:

- переопределить метод "Save" (что Вы и сделали)

- вынести поле "Контрагент" на страницу как отдельное поле. Тогда можно будет даже создать бизнес-правило в Мастере, не прописывать кодом.

Одеяненко Юлия,

дело в том, что на странице InvoicePageV2 есть такой код:

"CustomerBillingInfo": {
	"BindParameterEnabledCustomerBillingInfoToAccount": {
		"ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
			"property": BusinessRuleModule.enums.Property.ENABLED,
				"conditions": [
					{
						"leftExpression": {
							"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
							"attribute": "Account"
						},
					"comparisonType": Terrasoft.ComparisonType.IS_NOT_NULL
				}
			]
		}
	}
}

Это именно то, что мне нужно, без выноса на страницу отдельного поля Контрагент.

Но если вместо "CustomerBillingInfo" ставлю "Contract", не работает.

Судя по всему, не работает по причине расположения поля Договор (оно же Contract) на детали Связи. Я еще не совсем понимаю, как можно наладить общение между деталью и страницей, на которой эта деталь располагается, так еще и сама деталь Связи особенная.

Борис Леонов,

так как деталь "Связи" действительно специфическая, настроить бизнес-правило обязательности на ее поля (то есть, реализовать через

BINDPARAMETER) возможность пока отсутствует. Мы передали Ваши пожелания аналитикам продукта для рассмотрения и, возможно, доработки в будущих версиях продукта.

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

Всем привет в документации есть пример с добавление нового контакта по средствам веб запроса. Сделал все работает. Щас пытаюсь записать лид, но получаю:"Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.". Подскажите что я делаю не так?

В тесте пытаюсь записать лид с одним заполненным полем(Название контрагента

Мой код:

public static void insertData()
        {
            Console.WriteLine("Попытка создать лид");
 
            // Экземпляр класса запроса.
            var insertQuery = new InsertQuery()
            {
                // Название корневой схемы.
                RootSchemaName = "Lead",
                // Коллекция добавляемых значений колонок.
                ColumnValues = new ColumnValues()
            };
 
            var columnExpressionName = new ColumnExpression
            {
                // Тип выражения запроса к схеме объекта — параметр.
                ExpressionType = EntitySchemaQueryExpressionType.Parameter,
                // Параметр выражения запроса.
                Parameter = new Parameter
                {
                    // Значение параметра.
                    Value = "ЛИД C САЙТА",
                    // Тип данных параметра — строка.
                    DataValueType = DataValueType.Text
                }
            };
 
 
          
 
            // Инициализация коллекции колонок запроса.
            insertQuery.ColumnValues.Items = new Dictionary<string, ColumnExpression>();
            // Добавление выражений запроса в коллекцию добавляемых колонок.
            // Колонка [Название контрагента].
            insertQuery.ColumnValues.Items.Add("Account", columnExpressionName);
           
 
 
            // Сериализация экземпляра класса запроса на добавление в JSON-строку.
            var json = new JavaScriptSerializer().Serialize(insertQuery);
 
            // Преобразование строки JSON-объекта в массив байтов.
            byte[] jsonArray = Encoding.UTF8.GetBytes(json);
            // Создание экземпляра HTTP-запроса.
            var insertRequest = HttpWebRequest.Create(insertQueryUri) as HttpWebRequest;
            // Определение метода запроса.
            insertRequest.Method = "POST";
            // Определение типа содержимого запроса.
            insertRequest.ContentType = "application/json";
            // Добавление полученных ранее аутентификационных cookie в запрос на получение данных.
            insertRequest.CookieContainer = AuthCookie;
            // Установить длину содержимого запроса.
            insertRequest.ContentLength = jsonArray.Length;
 
            // Добавление CSRF-токена в заголовок запроса.
            CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
            string csrfToken = cookieCollection["BPMCSRF"].Value;
            insertRequest.Headers.Add("BPMCSRF", csrfToken);
 
            // Помещение в содержимое запроса JSON-объекта.
            using (var requestStream = insertRequest.GetRequestStream())
            {
                requestStream.Write(jsonArray, 0, jsonArray.Length);
            }
 
          
          
          // Выполнение HTTP-запроса и получение ответа от сервера.
          using (var response = (HttpWebResponse)insertRequest.GetResponse())
          {
              // Вывод ответа в консоль.
              using (StreamReader reader = new StreamReader(response.GetResponseStream()))
              {
                  Console.WriteLine("JSON ответ от сервера");
                  Console.WriteLine(reader.ReadToEnd());
              }
          }
 
 
        }

 

Нравится

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

Добрый день.

В таких случаях проще всего сравнить запросы через Fiffler(тогда станет ясно что забыли). Пример работы можно посмотреть - https://academy.terrasoft.ua/documents/technic-sdk/7-12/vypolnenie-zapr…

Короче, проблема было в том что в карточке лида были обязательные поля. Но конечно забавно возвращать 500ю ошибку 

VladKapitanchyk,

Спасибо

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

Как использовать, когда схема страниц и элементов на ней с разных объектов?

И

В коде можно? 

                save: function () {

                    try {

                        this.entitySchemaName = "SxCandidate";

                         this.callParent(arguments);

                        }

                    }

                    catch (e) { }

                    finally {

                        ***

                    }

                }

 

Нравится

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

Добрый день

Не очень понятно что вы делаете

Артем Гура,

привет,

ковыряю чужой код самописной страницы, притом с другой страницы раздела нужно перенести кейсы на самописную, при условии что entitySchemaName у них разный, тк это все писали разные люди, несколько тысяч строк кода, притом с кейсами никогда не работал, а они перенеслись на самописную страницу только заменой значения в entitySchemaName. То есть они лежат в исключительно бд, хотя оно все в бд :) притом разработка разных разработчиков в разных пакетах, дикое наследование - веселуха. 

Хочу понять/выработать какой-то подход для объединения функционала страниц с разных разделов, т. е. разные entitySchemaName. Псевдокод saveAll: function() {

this.entitySchemaName = 'aa';

this.save();

this.entitySchemaName = 'bb';

this.save();

}

или как что-то подобное для схожий целей делать, чтобы не лопатить весь код...

Чисто гипотетически так будет работать :) 

Но лучше попробовать на чем-то простом... Ну ладно save, а отображается оно как? Как считывается? Все значения должны ведь лечь в атрибуты модели...

Артем Гура,

У меня сомнения, все из-за атрибутов и не только их наверно, думал если соответствующим атрибутам прописать 

referenceSchemaName 

тогда будут сопоставляться правильно, но пока не получилось

_____________________________________________________________

Почему-то нельзя создать раздел на произвольном объекте, только в ручную, видимо когда растишь его по полям, платформа что-то себе дописывает куда-то там. (в гуидах ковыряться дело гиблое) Хотя это вполне можно вынести в обработку и применять ко всем полям и не важно вообще какой объект. Повторное использование кода нарушено, ну то ладно. Может когда-нибудь можно будет придумают как модули описывать от нескольких схем с разными наборами атрибутов и тп Некоторая аналогия с делегатами в дотнете: не сразу стали множественными.

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

Всем привет помогите с условием перехода в бизнес процессе.

В общем задача - изменить права на лид если, с ним никто не работал.

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

 

Пока получается так, но чет не работает:

[#Перечитываем лид.Первый элемент результирующей коллекции.Дата последнего взаимодействия#]==null

 

Нравится

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

А у Вас там есть такое поле? А когда оно заполняется? Это переименованное стандартное поле "Дата изменения" или Ваше пользовательское поле?

[#Перечитываем лид.Первый элемент результирующей коллекции.Дата изменения#] == null

 

Тоже не работает(((

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

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

Да задача простая, если пользователь, которому прилетел лид, его поигнорил(нет например на работаем месте), этот лид нужно передаеть другому менеджеру. А факт игнорирования - это как раз отсутствие изменений в карточке лида. Вот я и пытаюсь понять за какое поле зацепится

Последовский Роман,

Ну может привязаться к стадии "Квалификация"? Если пользователь не проквалифицировал и стадия не изменилась, то тогда отбирайте лид.

Спасибо за помощь)

Привязался к первому звонку

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

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

 В ActionDashBoard есть поле - http://prntscr.com/j49u8q

Реализовано оно следующим способом - http://prntscr.com/j49v2d, задал на данный атрибут фильтрацию, но она не срабатывает. Подскажите как реализовать фильтрацию данного атрибута?

пробовал через правила так же не работает.

Что делаю не так?

 

Заранее спасибо.

Нравится

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

var countryId = this.get("Country") - Вы здесь получаете не айдишник, а объект. попробуйте в самом фильтре дописать - countryId.value

Alex Zaslavsky,

Данный атрибут у меня текст я заполняю его следующим образом:

"Country": {

                        "dataValueType": Terrasoft.DataValueType.TEXT,

                        "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                        "value": ""

                    }

getCurrentContactCountry: function () {

                        var currentContactId = Terrasoft.SysValue.CURRENT_USER_CONTACT.value;

                        var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                            rootSchemaName: "Contact"

                        });

                        esq.addColumn("Country", "CountryId");

                        esq.getEntity(currentContactId, function(result) {

                            if (!result.success) {

                                this.showInformationDialog(Resources.localizableStrings.AbCurrentUserCountryError);

                                return;

                            }

                            var country = result.entity.get("CountryId");

                            if(country!== null || country!== undefined) {

                                this.set("Country", country.value);

                            }

                        },this)

                    }

У меня проблема в другом в функцию фильтрации даже и не заходит

Я не силен в этом, но попробуйте вместо - 

"filters": [

function()

написать - 

filter: function()

я, к примеру, у себя в лиде вот таким образом фильтрую поле "Партнер"

Alex Zaslavsky,​​​​​​

Благодарю. Подскажите, а UsrSourcePartner определен у Вас в лиде? Мой атрибут не определен в моем объекте. Я ссылаюсь на другой объект. Данное поле грубо говоря у меня одноразовое, достал id и передал на сервис. Может не срабатывать фильтрация если нет связи основного объекта с атрибутом?

Нигрескул Алексей,

Да, это определенное поле "Партнер" (справочник Контрагенты).

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

Коллеги нужна помощь, не работает фильтрация в атрибутах. Дополнительная информация клиентский модуль в котором реализую данный функционал, наследуется от BaseMessagePublisherPage ( MessagePublisher ), Может из-за этого не работать фильтрация?

Нигрескул Алексей пишет:

Коллеги нужна помощь, не работает фильтрация в атрибутах

Спрашивали - помогаю.

TLDR: террасофт факапнулся. В очередной раз. Убирите ContentType.ENUM. 

Теперь подробно (тестил на CallMessagePublisherPage. У вас я так понимаю аналог, ну да не важно):

1. Сделал фильтр, запустил, контакты отфильтровались

2. Раскомментировал contentType. ВНЕЗАПНО сортировка перестала работать.

3. Нет. Тот факт, что колонка виртуальная никак не влияет. тестил.



В итоге: я бы посоветовал посмотреть что творится в функции loadLookupData или др. функции которую, возможно, запускает enum. Честно говоря, устал воевать с ветряными мельницами. Сначала редактируемый реестр испоганили, теперь вот это...

Варфоломеев Данила,

Благодарю! Проверим.

Нигрескул Алексей пишет:

Благодарю! Проверим.

Я тут вспомнил, что уже сталкивался с таким поведением) BaseMessagePublisherPage не наследуется от BasePageV2, и из BasePageV2 не вызывается getLookupQuery. Чтобы исправить поведение ENUM-ов придётся ручками перекопировать функцию (и все вложеные в неё) на вашу страницу.

Варфоломеев Данила,

Благодарю! Все получилось! Так же сделал при добавлении нового элемента в маркетинговой кампании  - 

http://prntscr.com/j5wl4q

Работает - УРА!))

 

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

Есть lookup как повесить на его onchage функцию???

 

Нравится

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

"UsrField1": {

                dependencies: [

                    {

                        columns: ["UsrField2"],

                        methodName: "someMethodName"

                    }

                ]

            }

Вы об этом? Если в поле "UsrField2" Вы что-то изменили, то запускается Ваш метод "someMethodName". 

Вот статья на академии: https://academy.terrasoft.ua/documents/technic-sdk/7-12/atributy-svoystvo-attributes

Там нужно посмотреть раздел "Дополнительные свойства атрибутов", свойство dependencies

Золотарев Артем Андреевич,

Спасибо, получилось!

 

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



Коллеги, добрый вечер!

Подскажите пожалуйста, в каком модуле происходит расчет поля "Итого" раздела "Заказы"?

Всё обыскал, никак не найду, в подсказке написано, что считается автоматически как сумма всех "Итого" на детали "Продукты", но самих расчетов ни в OrderPageV2, ни в OrderProductDetailV2, ни в OrderProductPageV2, ни в импортируемых ими модулях не вижу. Есть место с запросом значения из базы, но как оно туда попадает изначально неясно.

Нравится

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

Смотрите объект OrderProduct, а там процессы:



Владимир, спасибо.

Тагиз, также можете обратить внимание на OrderAmountHelper

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

Здравствуйте. Добавила в раздел быстрые фильтры по дате и отвественному, А они не отображаются.

ниже код добавления

define("UsrTSiPOSection", ["BaseFiltersGenerateModule"], function(BaseFiltersGenerateModule) {

    return {

        entitySchemaName: "UsrTSiPO",

        methods: {

            // Инициализирует фиксированные фильтры.

            initFixedFiltersConfig: function() {

                // Создание конфигурационного объекта.

                var fixedFilterConfig = {

                    // В качестве схемы объекта для фиксированных фильтров указывается схема объекта раздела.

                    entitySchema: this.entitySchemaName,

                    // Массив фильтров.

                    filters: [

                        // Фильтр периода.

                        {

                            // Название фильтра.

                            name: "PeriodFilter",

                            // Заголовок фильтра.

                            caption: this.get("Resources.locatizableStrings.PeriodFilterCaption"),

                            // Тип данных — дата.

                            dataValueType: this.Terrasoft.DataValueType.DATE,

                            columnName: "Date",

                            // Дата начала периода фильтрации.

                            startDate: {

                                // Фильтруются данные из колонки [Date].

                                //columnName: "StartDate",

                                // Значение по умолчанию — начало текущей недели.

                                defValue: this.Terrasoft.startOfWeek(new Date())

                            },

                            // Дата завершения периода фильтрации — завершение текущей недели.

                            dueDate: {

                                //columnName: "DueDate",

                                defValue: this.Terrasoft.endOfWeek(new Date())

                            }

                        },

                        // Фильтр ответственного.

                        {

                            // Название фильтра.

                            name: "Owner",

                            // Заголовок фильтра.

                            caption: this.get("Resources.locatizableStrings.OwnerFilterCaption"),

                            // Фильтрация данных из колонки [Owner].

                            columnName: "Owner",

                            // Значение по умолчанию — контакт текущего пользователя.

                            // Берется из системной настройки.

                            defValue: this.Terrasoft.SysValue.CURRENT_USER_CONTACT,

                            // Тип данных — справочник.

                            dataValueType: this.Terrasoft.DataValueType.LOOKUP,

                            // Фильтр.

                            filter: BaseFiltersGenerateModule.OwnerFilter

                        }

                    ]

                };

                // Атрибуту [FixedFilterConfig] присваивается ссылка на созданный конфигурационный объект.

                this.set("FixedFilterConfig", fixedFilterConfig);

            }

        }

    };

});

Нравится

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

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

"Owner", "Date"?

Например в этом месте -  columnName: "Owner", скорее должно быть  columnName: "UsrOwner", или как вы там назвали поле с ответственным. С датой то же самое. Надеюсь, что это поможет.

Alex Zaslavsky, изменила названия, но фильтры все равно не отображаются

Никульшина Алёна,

entitySchema: this.entitySchemaName, - здесь удалите Name

напишите просто - entitySchema: this.entitySchema,

Никульшина Алёна, работает? Или фильтры все еще не отображаются?

Alex Zaslavsky,

 Да , спасибо большое.все отображается

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

Периодически в логе возникает следующего вида ошибка

2018-04-09 08:54:58,222 [62] ERROR CP-BPM\bpmadmin Terrasoft.Core.Process.ProcessEngineImpl GetIsMatchCondition - (null)
System.FormatException: Идентификатор GUID должен содержать 32 цифры и 4 дефиса (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
   в System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)
   в System.Guid.TryParseGuidWithNoStyle(String guidString, GuidResult& result)
   в System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)
   в System.Guid..ctor(String g)
   в Terrasoft.Common.DataTypeUtilities.ValueAsType[TResult](Object value)
   в Terrasoft.Nui.ServiceModel.DataContract.Parameter.GetValue(UserConnection userConnection, DataValueType forcedDataValueType, Boolean useUtcTime)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateExpression(BaseExpression expression, Boolean useUtcTime)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateCompareFilter(Filter filterConfig)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateFilter(Filter filterConfig)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateFilterGroupFilter(Filter filterConfig)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateFilter(Filter filterConfig)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.AddQueryFilters(EntitySchemaQuery currentEsq, Filters filterConfigs)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateExpression(BaseExpression expression, Boolean useUtcTime)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateCompareFilter(Filter filterConfig)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateFilter(Filter filterConfig)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateFilterGroupFilter(Filter filterConfig)
   в Terrasoft.Nui.ServiceModel.Extensions.QueryExtension.EsqBuilder.CreateFilter(Filter filterConfig)
   в Terrasoft.Nui.ServiceModel.DataContract.ProcessDataContractFilterConverter.ConvertToEntitySchemaQueryFilterItem(EntitySchemaQuery esq, String serializedFilters)
   в Terrasoft.Core.Process.ProcessEngineImpl.GetIsMatchCondition(UserConnection userConnection, Entity entity, String conditionData)

Никак не могу понять кто ее туда пишет. Есть способ?

Нравится

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

Добрый день

Судя по callstack'у это ошибка при работе процесса. Посмотрите процессы, которые выполнялись в это время.

А так просто по данной записи сложно сказать. Не ясно, она возникает и что-то не работает (что?). Она выскакивает на клиенте  (какие действия совершаются, что во вкладке Network?). Выполнение процесса прервалось (на каком-то элементе?) и т.д.

Артем Гура,

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

Алексей-Карягин,

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

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