Вопрос

Добрый день.

В разделе с активностями не получается удалить служебную записку. Выдается сообщение "1 записей используются в других разделах" и все равно нельзя удалить. Есть какой-либо запрос для удаления активности?

Нравится

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

Добрый день!

Вы можете удалить запись с помощью sql запроса:

delete from Actitity where id '...' где вместо трех точек подставить id нужной Вам записи (если нет доступа к бд, то id можно просто скопировать из адресной строки браузера при открытии интересующей активности). Также можно удалять по заголовку и другим колонкам записи, но в таком случае нет уверенности, что запись по этим колонкам уникальна (в связи с этим удаление 1 записи лучше выполнять по id). В случае, если у Вас база размещена в облаке и нет доступа к бд, то запрос можно выполнить в разделе "Конфигурация"-"Sql-сценарии". После выполнения запроса на удаление, вероятнее всего, у Вас появится ошибка о наличии связей по ключу с другой сущностью. В таком случае нужно вывести текст ошибки (просто в реестре раздела "sql-сценарии" вывести колонку "Текст последней ошибки") и выполнить обнуление связей. Например, получили ошибку о том, что данная запись не может быть удалена, так как имеет связь с каким-то контактом. В таком случае запрос на обнуление такой связи будет выглядеть следующим образом:

update Contact set ActivityId = null where ActivityId = '...' (опять же подставляете id активности, которую хотите удалить). После чего снова можете пробовать удалить запись первым запросом. 

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

 

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

Добрый день.

Не получается удалить заявку (служебная записка) в bpm online sales. Пишет, есть связанные заявки.

Есть какой-либо запрос для удаления заявки?

 

Нравится

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

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

Вероятней всего, данное поведение происходит из-за циклической связи заявки с другим объектом системы. 

Вы можете удалить заявку напрямую скриптом из БД.

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

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

Всем доброго времени суток. Версия 7.11.

Создал два процесса. В обоих просто задание-сценарий, запуск по пустому сигналу. Код внутри первого:

var userConnection = Get<UserConnection>("UserConnection");
 
string processName = "UsrLogNowDate";
string jobName = processName + "Job";
string jobGroupName = jobName + "Group";
 
int startOffset = 80; // 80 секунд
AppScheduler.RemoveJob(jobName, jobGroupName);
var job = AppScheduler.CreateProcessJob(jobName, jobGroupName, processName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
 
return true;

В Usings соответственно добавлены: 

Quartz.Impl

Quartz

Quartz.Impl.Triggers

Terrasoft.Core.Scheduler

UsrLogNowDate - это второй процесс, представляет собой простое логирование текущей даты в справочник UsrTriggersLog. Код второго:

var userConnection = Get<UserConnection>("UserConnection");
new Insert(userConnection).Into("UsrTriggersLog").Set("Name", Column.Parameter(DateTime.Now.ToString())).Set("Description", Column.Parameter("Записано автоматически.")).Execute();
return true;

Оба процесса компилируются без ошибок, второй при запуске по кнопке нормально логирует требуемую запись.

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

Где ошибка? Как правильно запускать такие процессы в 7.11?

Нравится

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

Добрый день!



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

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

Возникло сразу несколько вопросов по графикам:

1. Можно ли показатель поделить на какое-то число перед отображением? Например, сумму выводить в миллионах рублей, а не в единицах рублей? Огромные числа не информативны!

2. Можно ли в горизонтальной гистограмме выводить top 5, 10 или 20 линий в сортировке по убыванию?

3. Как настроить подписи по оси Х, чтобы они были развернуты на 90%, т.е. вертикально? Тогда они перестанут наезжать друг на друга.

Нравится

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

Здравствуйте, Алексей!

1. На данный момент, к сожалению, данные на графиках отображаются в том же виде, в котором заполнены соответствующие поля на страницах разделов. Мы зафиксировали Ваше пожелание и передали его аналитикам продукта. Они рассмотрят возможность реализации настройки отображения данных на дашбордах в будущих релизах продукта

2. Индивидуально для каждого графика такой возможности нет, но можно ограничить количество выводимых на дашборд данных в системной настройке "Ограничение запроса данных графика". Тогда на графике будет отображаться только топ-N категорий согласно сортировке (работает начиная с версии 7.11.2, только с графиками, где настроена одна серия данных). Также можем предложить устанавливать дополнительные фильтры, чтоб уменьшить количество выводимых данных

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

Мы передали все Ваши пожелания аналитикам продукта. Спасибо, что помогаете улучшать наши продукты!

Посмотрел в 7.11.2 как работает эта настройка.

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

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

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

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

Есть где то манул по том как работать с Google Maps?

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

В инете есть некоторые примеры, но как их связать с BPM я нигде не видел(

Нравится

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

Еще советую поинтересоваться вопросом лицензирования Google maps при использовании в коммерческих целях

Последний раз когда я имел дело с Google maps можно было делать некоторое кол-во запросов в сутки без лицензии, для демо версии - хватит

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

К сожалению у нас нет интеграции с данным сервисом как и нет примеров реализации самой интеграции.

Я передал Ваше пожелание аналитикам продукта на рассмотрение актуальности и возможности интеграции данного сервиса в будущих версиях приложения.

В чем Ваша проблема, чтобы связать с bpm? Вам нужно создать контейнер и указать в скрипте его id. Чтобы создать контейнер div, добавляете в diff схемы обычный контейнер, а скрипты из CDN можно грузить используя ajax или любой другой способ на Ваше усмотрение.

Например, чтобы вставить на страницу карту Гугл, можно сделать следующим образом:

  • Добавьте jQuery в зависимости
    define("MyPage", ["jQuery"],
        function (){

     

  • Вставьте контейнер на страницу

     

    {
       "operation": "insert",
       "name": "GMaps",
       "values": {
           "itemType": Terrasoft.ViewItemType.CONTAINER,
           "id": "googleMap",
           "styles": {
               "height": "200px"
           },
           "items": []
       },
       "parentName": "LeftModulesContainer",
       "propertyName": "items",
    }

     

  • В зависимости от того, куда вставляем карты, определить в функции срипт отрисовки карты

     

    onRender: function () {
        this.callParent(arguments);
     
        // Функция отрисовки карты гугл, после того как загрузится скрипт
        window.initMap = function() {
            var map = new google.maps.Map(document.getElementById('googleMap'), {
                center: {lat: 55.800287, lng: 49.105937},
                zoom: 8
            });
        };
     
        // загружаем скрипт с сайта гугл (необходимо получить ключ приложения)
        $.ajax({
            url: "https://maps.googleapis.com/maps/api/js?key=Ключ_Приложения_Гугл&amp;callback=initMap",
                dataType: "script"
          });
    },

     

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

Здравствуйте, подскажите как правильно настроить WebStorm для разработки под BPM.Какие библиотеки, подводные камни и тд

Нравится

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

Добрый день, нет никаких особенных настроек. Просто создаете проект с указанием пути к папке с js файлами

Артем Гура,

а насчет библиотек? просто хотелось бы использовать не как редактор кода, а как полноценную IDE 

Михаил, можете привести пример? не совсем понятно, ведь библиотек никаких нет. Вы хотите делать запуск приложения из webstorm, чтобы в нем осуществлять debug?

Артем Гура,

Насчет debug тоже интересно можно ли? Если насчет IDE то к примеру удобство написания Crud запросов и прочих особенностей Bpm

 

Касательно debug, то не пробовал, ибо в Chrome удобнее :)

А на счет функциональности IDE, то он подхватывает функции нормально. Чтобы он подхватывал ядровый js, то нужно подключить папку ...\Terrasoft.WebApp\Resources\ui. Там js-ы ядра (контролы, схемы...). Но их изменять не нужно, ибо приложение их не подхватывает. Они больше именно для разработки

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

У меня реализована система интеграции через EntityDataService, и когда данные приходят в интеграционные сущности, запускается БП по сигналу и обрабатывает данные. Иногда возникает странная ошибка 

Terrasoft.Common.ItemNotFoundException: Элемент с именем "UsrIntMyTable" не найден в
Terrasoft.Core.ManagerItemCollection`1.GetByName(String name) в
Terrasoft.Core.Manager`2.GetInstanceByName(String name) в
Terrasoft.Core.Entities.EntitySchemaQuery..ctor(EntitySchemaManager entitySchemaManager, String sourceSchemaName) в
Terrasoft.Core.Process.UsrMyProcessing.ScriptTask1Execute(ProcessExecutingContext context) в
Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

где UsrIntMyTable - моя интеграционная таблица в БД, которой соответствует объект в конфигураторе (или наоборот).

БП всегда отрабатывает одинаково, но ошибка случается иногда. При этом, что самое обидное, данные по сути теряются, т.к. не обрабатываются.

Судя по всему, ошибка случается здесь

var userConnection = UserConnection;
var DealEsq = new EntitySchemaQuery(userConnection.EntitySchemaManager,"UsrIntMyTable");

Буду благодарен за любые советы на тему что это и как это поправить.

Нравится

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

Добрый день

Единственное предположение в том, что в эти моменты производится компиляция. Проверьте это предположение

"За ширмой" происходит следующее:

EntitySchemaManager ищет созданный инстанс, если его нет, то создает (new UsrIntMyTable). И вот, если его в сборке нет, то создать его возможности нет

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

В реестре есть механизм модификации выводимых полей. А есть ли механизм выведения несуществующих в базе полей? Например,

addItemsToGridData: function() {
    this.callParent(arguments);
	debugger;
	var gridDataItems = this.getGridData().getItems();
	gridDataItems.forEach(function(item) {
		item.set("IsUpdated", 1);
	});
.....

Можно ли в реестр вывести IsUpdated, чтобы пользователи его видели?

Нравится

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

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

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

Добрый день.

Подрядчик разработал для нас пакеты. Хотелось бы вносить в эту функциональность изменения. В связи с этим есть два таких вопроса:

  1. Рядом с пакетами подрядчика в списке пакетов стоит "замочек". Что означает этот замочек? Можем ли мы редактировать такие пакеты?
  2. Пакет подрядчика включает в себя бизнес-процессы и скрипт на C#. Если нам необходимо отредактировать, например, скрипт на C#, то каким образом это лучше сделать? Редактировать пакет подрядчика? Как я понимаю, создать свой пакет с замещением скрипта на C# или бизнес-процесса нельзя?

Заранее спасибо за ответы.

Нравится

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

Игорь, этот пакет, судя по всему, установлен из SVN. Если вы не имеете доступа к этому SVN, то попросите подрядчика отдать вам исходные коды в виде архива (ну, либо скопировать утилитами SVN-to-SVN). Далее вы поднимите свой собственный SVN, поменяете настройки репозитория и тогда сможете работать с этими пакетами, как со своими собственными.

Другой вариант, договориться с подрядчиком о предоставлении вам доступа к этому SVN и пользоваться им для внесения правок в пакет.

Создать пакет с "замещением" C# - нельзя, но вы можете описать данный класс как partial и дорабатывать его. Правда это несет дополнительные проблемы. Можно также создать "наследника" исходного класса и использовать уже его в новой логике.

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

Здравствуйте, Игорь!

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

 

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

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

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

Как это лучше сделать?

Я, например, вижу, что есть метод setActiveTab, однако, надо номер таба получить.

Нормально ли сделать ссылку вида

/0/Nui/ViewModule.aspx#CardModuleV2/UsrMyPage/edit/3f199545-fd54-46fb-b801-f711014389f2/4

Не окажется ли так, что такая приписка к урлу будет валить систему в будущих версиях?

Нравится

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

Добрый день

Вы можете оперировать не номерами Tab'а, а их именами и в урле будете передавать его имя. В будущих релизах не планируется что-то добавлять после Id записи

По ходу возник еще один вопрос - а когда можно вызывать setActiveTab при загрузке страницы? В onEntityEnitialized получается рано - таб выбирается, но контент остается от первого таба.

Алексей-Карягин пишет:

В onEntityEnitialized получается рано - таб выбирается, но контент остается от первого таба.

Это потому , что с табами всё очень плохо smiley Попробуйте вот так написать:

onEntityInitialized: function() {
	this.callParent(arguments);
	this.tabsCollectionActions();
},
tabsCollectionActions: function() {
	var tabsCollection = this.get("TabsCollection"); //получаем коллекцию
	//что-то с ней делаем (или нет)
	this.setActiveTab("ProductsInDiscountTab"); //устанавливаем активную
	this.set("ProductsInDiscountTab", true); //в этом set-е вся соль. Нафига он - непонятно. Но без него не рендерится содержимое вкладки
},

 

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

this.set("ProductsInDiscountTab", true); тоже не рендерится. Только таймаут, только хардкор!

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