7.10
sales_enterprise

Привет!

 

Подскажите как в схеме с типом "Исходный код" прочитать значение ключа, добавленного мной в web.config в раздел appSettings?


    

 

Нравится

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

Попробуйте при помощи WebConfigurationManager.AppSettings или ConfigurationManager.AppSettings. Например, в схеме LDAPUtilities есть:

var timeout = WebConfigurationManager.AppSettings["RequestTimeout"];

 

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

да, 

WebConfigurationManager.AppSettings работает

Показать все комментарии
портал
customer_center
Регистрация раздела для портала
7.10

Добрый день!

Необходимо добавить раздел на контрагенты на портал.

Попробовал добавить раздел в рабочее место, он не отобразился. Попробовал добавлять с помощью sql скриптов. Есть у кого-нибудь актуальная документация по добавлению раздела на портал?

Нравится

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

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

С 7.13.2 добавили возможность создавать портальные разделы пользовательскими средствами в мастере разделов.

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

Добрый день коллеги, подскажите как добавить действие в cti панель звонков, к существующим действиям необходимо добавить создать лид из звонка

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

Нравится

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

В маркете есть БП для выполнения той же задачи.

Также такая функция встроена в одну из интеграций с телефонией.

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

Добрый день!



Имеется унаследованная от "базовой схемы детали средств связи" деталь. Внутрь детали рядом с самим средством связи вставлены создаваемые вручную контейнеры (Terrasoft.Container) с чекбоксами (Terrasoft.CheckBoxEdit).

Задача: при полной отрисовки детали блокировать все чекбоксы кроме одного выбранного, если он есть, иначе не блокировать ничего. Решаю с помощью jquery на странице раздела. Т.к. не знаю, как поймать событие полной отрисовки детали (чтобы получить доступ к DOM), использую костыль в виде setTimeout. Как это событие можно отловить? 

И еще один вопрос: есть ли какое-то единое событие для перерисовки детали (детали перерисовывается при нажатии на кнопку "отмена" на странице, переходе между вкладками, сворачивании/разворачивании детали и т.д.). 



Возможно есть какой-то способ решения этой задачи кроме jQuery?

Нравится

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

Добрый день, в различных модулях существует метод onRender, он срабатывает после полной отрисовки модуля стоит посмотреть в его сторону

Добрый день, в различных модулях существует метод onRender, он срабатывает после полной отрисовки модуля стоит посмотреть в его сторону

Показать все комментарии
Filter
EntitySchemaQuery
javascript
CreateNotExistsFilter
7.10
marketing

Есть такой метод:

addRecords: function(detailColumnName, segmentName, isEditableSegment) {

            var masterId = this.get("MasterRecordId");

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

                rootSchemaName: this.entitySchemaName

            });

            esq.addColumn(segmentName);

            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));

            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));

            esq.getEntityCollection(function(result) {

                var existsContactsCollection = [];

                if (result.success) {

                    result.collection.each(function(item) {

                        existsContactsCollection.push(item.get(segmentName).value);

                    });

                }

                var config = {

                    entitySchemaName: segmentName,

                    multiSelect: true,

                    columns: ["Type"]

                };

                

                var isAccount;

                if (segmentName === "Account") {

                    config.filters = Ext.create("Terrasoft.FilterGroup");

                    config.filters.add("first", Terrasoft.createColumnFilterWithParameter(

                        Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));

                    isAccount = true;

                }

                if (existsContactsCollection.length > 0) {

                    var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);

                    existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;


                    existsFilter.Name = "existsFilter";

                    if (isAccount) {

                        config.filters.add("second", existsFilter);

                    } else {

                        config.filters = existsFilter;

                    }

                }

                this.openLookup(config, function(config) {

                    methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);

                }, this);

            }, this);

        },

где detailColumnName = "Campaing",

segmentName = "Product",

entitySchemaName = "ProductUsage"

В ProductUsage есть идентификатор родительского объекта (Campaing) и идентификатор продукта (Product)

Он нужен для того, чтобы лукап выводил только те записи, которых нет в детали для этого объекта и отрабатывает корректно, но вот когда на детали больше записей, чем 2100, БД SQL выдает ошибку, что конструкция IN принимает максимум 2100 параметров, поэтому я решил переделать запрос под конструкцию NotExists.

Изменил этот метод с фильтрами на следующий:

addNotExistsRecords: function(detailColumnName, segmentName, isEditableSegment) {

            var masterId = this.get("MasterRecordId");

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

                rootSchemaName: this.entitySchemaName

            });

            esq.addColumn(segmentName);

            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));

            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));

            esq.filters.add("isEqualsTo", Terrasoft.createColumnFilterWithParameter(

                this.Terrasoft.ComparisonType.EQUAL, "Product.Id", "ProductId"));

                

            var config = {

                entitySchemaName: segmentName,

                multiSelect: true,

                columns: ["Type"]

            };

            

            var isAccount;

            if (segmentName === "Account") {

                config.filters = Ext.create("Terrasoft.FilterGroup");

                config.filters.add("first", Terrasoft.createColumnFilterWithParameter(

                    Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));

                isAccount = true;

            }

            

            var existsFilter = Terrasoft.createNotExistsFilter("Id", esq);

            existsFilter.Name = "existsFilter";

            if (isAccount) {

                config.filters.add("second", existsFilter);

            } else {

                config.filters = existsFilter;

            }

            

            this.openLookup(config, function(config) {

                methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);

            }, this);

        },

 

Однако при выполнении происходит ошибка errorCode: "NotSupportedException", message: "None", stackTrace: undefined, errors: Array(0)

Где я ошибся при построении фильтров?

По сути нужно повторить такой запрос:

select Id from Product where NOT EXISTS(select Id from ProductUsage where CampaignId = 'f39db115-d2f4-4936-b415-bf6543187463' AND IsDeleted = 'false' AND Product.Id = ProductId)

 

Нравится

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

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

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

Для начала посмотрите в SQL Server профайлер, какой запрос уходит в базу данных - таким образом Вы сможете понять, в чем заключается ошибка в конкретном случае.

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

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

Добрый день! Столкнулся со следующей проблемой. Cайт работает по протоколу https. При настройке подключения к сайту в интерфейсе плагина ReportDesigner, для указанной строки подключения не подтягивается конфигурация для входа.

Подскажите, если ли какие-то дополнительные настройки для работы плагина с сайтом на https.

Нравится

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

Подключился в BPMonlineReportDesigner к демо-сайту, по https пускает нормально.

Настройки разных веб-сервисов сайта для работы по http и https прописываются в config-файлах, находящихся в папках Terrasoft.WebApp\ServiceModel\http\ и Terrasoft.WebApp\ServiceModel\https\.

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

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

Александр, спасибо за рекомендацию. Все получилось

Показать все комментарии
Деталь
добавление записи
сообщения между модулями
7.10
bank_customer_journey

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

Преамбула.

Есть раздел Доп соглашение, на странице редактирования есть деталь Дочернее доп соглашение, которая берется с этого же раздела. Есть поле Основное доп соглашение, которое заполняется при добавлении дочернего доп соглашения. Между страницей редактирования и деталью настроен обмен сообщениями (message) реагирующими на изменение поля Основное доп соглашение, если поле заполнено - кнопка добавления записей невидима, если поле пустое - видима. 

Собственно проблема.

При добавлении записи в деталь (нажатии на "+") открывается карточка редактирования этого же раздела и в поле Основное доп соглашение проставляется ссылка на родителя, НО сообщение о заполнении поля не отправляется на деталь и соответственно кнопка добавления записи остаётся видима.

Насколько я понял это происходит из-за того что фактически текущей страницей является родительская (с которой нажали кнопку добавления записи). Может кто-нибудь знает как можно передать сообщение с открывшейся карточки добавления записи на её деталь для того что бы скрыть кнопку добавления записи и отменить создание "матрёшки" (дочка в дочке в дочке в дочке и т.п.)

Нравится

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

На onEntityInitialized вызовите функцию которая обрабатывает изменение поля Основное доп соглашение и отправляет сообщение в деталь.

Игорь, добрый день! После добавления записи с карточки детали, сама запись отображается в детали на форме? Так же, запись существует в таблице БД?

На onEntityInitialized вызовите функцию которая обрабатывает изменение поля Основное доп соглашение и отправляет сообщение в деталь.

engineer7,

Добрый день. Сама запись на форме отображается и в БД существует.

Есть карточка детали(то есть та же карточка что и родитель) и есть схема детали, вы передаете на деталь сообщение? на детале ведь та кнопка добавить

Радчук Виталий Владимирович,

Да, именно так.

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

Добрый день!



Хочу сделать актуализацию курсов валют, указывая актуальные значения, полученные через веб-сервис. Возникает проблема с сохранением значения курса. Пишу новое значение как новую запись в таблицу CurrencyRate, заполняю поля CurrencyId, Rate, StartDate. Проблема в том, что система обрабатывает значения Rate, вычисляя обратный курс, мантиссу и на выходе в интерфейсе имею совсем другой курс и при расчетах получаю неверные значения. Подскажите каким образом корректно сохранить полученное прямое значение курса в системе и корректно вывести его в интерфейсе в справочнике Валюты.

Нравится

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

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

Пример реализации логики можете посмотреть тут https://marketplace.terrasoft.ru/app/exchange-rate-update-bpmonline

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

Пример реализации логики можете посмотреть тут https://marketplace.terrasoft.ru/app/exchange-rate-update-bpmonline

Добрый день!

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

System.ServiceModel.EndpointNotFoundException: Прослушивание на http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx не выполняла ни одна конечная точка, которая могла бы принять сообщение. Среди прочих причин это могло быть вызвано неправильным адресом или действием SOAP. Подробнее см. в описании InnerException (если имеется). ---> System.Net.WebException: Невозможно соединиться с удаленным сервером ---> System.Net.Sockets.SocketException: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера 212.40.192.49:80
   в System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   в System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   --- Конец трассировки внутреннего стека исключений ---
   в System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   в System.Net.HttpWebRequest.GetRequestStream()
   в System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
   --- Конец трассировки внутреннего стека исключений ---

Server stack trace: 
   в System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
   в System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout)
   в System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest(Message message, TimeSpan timeout)
   в System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   в System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   в System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   в System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   в Terrasoft.Configuration.CbrfDI.DailyInfoSoap.GetCursOnDate(DateTime On_date)
   в Terrasoft.Configuration.TscCbrfLoader.Load()
   в Terrasoft.Core.Process.TscLoadCurrencyRateMethodsWrapper.RunLoadCurrencyRateExecute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Сталкивались ли вы с этим? В чем может быть причина?

Этот механизм реализован компанией «Техносерв консалтинг», лучше связаться с ними. А по тексту в журнале, может, с Вашего веб-сервера не было доступа к адресу http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx.

Показать все комментарии
бизнес-процесс
выборка
7.10
bank_customer_journey

Добрый день.

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

Есть объект Акции и Партнеры. У акции есть справочное поле с типом акции. Есть бизнес-процесс, который по определённому алгоритму изменяет акции. Изменение акций выполняется  через элемент "Изменить данные".

Как мнем выбрать уникальные типы акции, которые были изменены?

Нравится

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

Можно делать не массовое изменение, а читать еще неизмененные, их изменять, индивидуально делать доп.действия, читать следующие неизмененные и т.п.



Второй вариант - сделать БП, который реагирует на изменение акции



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

Можно делать не массовое изменение, а читать еще неизмененные, их изменять, индивидуально делать доп.действия, читать следующие неизмененные и т.п.



Второй вариант - сделать БП, который реагирует на изменение акции



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

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

Не совсем понял условие, но если интересуют те значения справочника, которые недавно были использованы в записях раздела, то можно в справочник добавить поле типа «дата и время» и писать туда текущее время одновременно с изменением записи в разделе.

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

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

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

1) Добавил базовую схему детали с полями согласно статье: https://academy.terrasoft.ru/documents/technic-sdk/7-11/sozdanie-polzovatelskoy-detali-s-polyami

define("InformationDetail", [],
    function() {
        return {
            entitySchemaName: "GeneralInformation",
            diff: [],
            methods: {
                getDisplayColumns: function() {
                    return ["Identifier", "Type", "FullName", 
                    "Birthday"];
                }
            }
        };
    }
);

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

 

Вопрос: как отобразить произвольное количество элементов (колонок) по две на строке?

Нравится

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

Вам нужно создавать деталь с реестром (редактируемым или не редактируемым (если добавление/изменение будет по кнопке)

Подробнее смотрите в академии

Вам нужно создавать деталь с реестром (редактируемым или не редактируемым (если добавление/изменение будет по кнопке)

Подробнее смотрите в академии

Григорий Чех,

Спасибо, посмотрю.

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