Коллеги, добрый день! Есть объект UsrOrder, в нем есть строковое поле JetOrderNumber. В конфигурации открываю этот объект, перехожу на вкладку События и включаю галочку "Перед сохранением записи" (UsrOrderSaving). Далее нажимаю на кнопку "Открыть процесс". Там создаю Событийный подпроцесс, начальным событием которого является Сообщение UsrOrderSaving, а после него создаю заданию-сценарий, в котором прописываю:

Entity.SetColumnValue("UsrOrderNumber", "новая запись");

throw new Exception("i123");

return true;

Далее сохраняю, публикую, компилирую. 

В итоге после сохранения поле UsrOrderNumber пустое, в консоли ничего нет, в Network ничего нет. Поможете мне понять почему ничего не происходит? Изображение удалено.

Нравится

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

Добрый день.

 

На первый взгляд все должно работать.

Но если у вас пакет-сборка, то нет, так как в пакетах-сборках не работают событийные-процессы.



Та и вообще процессы использовать последнее время практика устарела. Лучше писать логику на объектах с помощью EntityEventListener. Такая логика будет работать и в пакетах-сборках.

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

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

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

Нравится

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

Добрый день!

 

На клиентской части в карточке редактирования Вы можете переопределить метод BasePageV2#onSaved

onSaved: function() {
	this.callParent(arguments);
},

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

Добрый день!

 

На клиентской части в карточке редактирования Вы можете переопределить метод BasePageV2#onSaved

onSaved: function() {
	this.callParent(arguments);
},

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

Если учитывать изменения на объекте процессами, интеграциями (или одновременно разными пользователями), лучше реализовать логику на событии вставки на уровне БП, а затем на сторону браузера передавать по ClientMessageBridge.

Лопатин Константин, Благодарю за совет! 

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

Приветы,

 

Если, например, в контактах в момент когда строка выбрана, пользователь нажимает

на столбце где ссылка контакта "Петров И. А." - затем открывается страница редактирования этого контакта. Когда пользователь закрывает страницу редактирования то на странице (разделе/секции) контакты заново отрисовывается выбранная строка, вопрос: какое событие возникает, как этот факт обработать? 

 

Где-нибудь есть полный список событий и типовые примеры как их обрабатывать? Хотя бы сигнатуры.

Нравится

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

Добрый день!

Много событий описаны в академии, но очень разбросаны по статьям. А консолидирвоанного списка - нет.

Еще вариант - это в Chrome Developer Tools просмотреть исходный код прямо на странице. Так как он прокоментирован можно разобраться какой метод чем занимается. Плюс ко всему вы можете использовать там CallStack чтобы отследить вызовы методов. Ну или посмотреть исходники тут:

https://academy.terrasoft.ua/documents/technic-sdk/7-11/javascript-api-klientskoy-chasti-yadra-platformy

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

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

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

"Много событий описаны в академии, но очень разбросаны по статьям. А консолидированного списка - нет." (Вот что-то открыл - https://academy.terrasoft.ru/api/jscoreapi/7.11.3/?_ga=2.110357765.1829… )

Их для роботов (гугла, яндекса) писали? Или для людей, как так... 

Приходится лазить в исходниках, но, зачем, я же не в Террасофте работаю.

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

Напишите книгу, чтобы ее можно было читать, с "консолидированными данными". Хороший образец MSDN :) Думаете часто приходится лезть в исходники asp.net?

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

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

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

Я создал кастомный пакет, зависимость поставил от OpportunitySectionV2
Что мне сейчас нужно сделать ? Замещающий клиентский модуль или замещающая страница?

Нравится

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

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

Замещающий клиентский модуль. Замещающая страница создается для редактирования интерфейса страниц, созданных в версии 5.Х.

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

Добрый день!

Подскажите, каким образом можно найти и переопределить обработчики событий стандартных контролов(например, кнопки Сохранить)?
Возможно ли изменить их стиль?

Спасибо!

Нравится

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

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

По сути это две задачи:
1) Изменить стиль (BasePageV2CSS)
2) Изменить обработчики (метод onCardAction, который вызывается при нажатии на кнопку "Сохранить")

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

Здравствуйте. Я знаю C# и T-SQL, но в BPM'online только начал работать. Я прошу вас помочь мне в следующем.
1) Создать бизнес процесс, который по событию добавления/обновления записи выгружает информацию в шлюзовую таблицу и вызывает хранимую процедуру (которая, как я понимаю, перезаписывает данные из шлюзовой таблицы в целевую). Как это сделать?
2) Выполнить интеграцию по клиентам (физ. лицам, юр. лицам и индивидуальным предпринимателям), договорам, заявкам - после создания в СРМ системе клиента информация попадает в БД на MS SQL Server. После обновления данных информация попадает в БД на MS SQL Server. Как это сделать?
3) Выполнить первичный импорт даннных в CRM-систему из БД на MS SQL Server. Как это сделать?

Нравится

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

Здравствуйте, Евгений!
По вашим второму и третьему вопросам созданы отдельные темы:
http://www.community.terrasoft.ua/forum/topic/12869
http://www.community.terrasoft.ua/forum/topic/12870

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

Для отслеживания создания/изменения/удаления записи Вы можете использовать начальный элемент сигнал. В сигнале необходимо указать объект в bpm'online, в котором должны произойти изменения. Далее элементом "Чтение данных" Вы считываете измененный объект.
Далее элементом "Задание сценарий" Вы можете либо:

  1. вызвать веб сервис для интеграции (описание вызова веб сервиса прикреплено)
  2. вызвать хранимую процедуру

Хранимая процедура предварительно должна быть создана в системе (для этого перейдите в конфигурацию и на вкладке SQL-сценарии добавьте процедуру.

Большое спасибо за помощь.

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

В процессе администрирования базы данных возникла необходимость определить причину возникновения ошибки. Определенный объём информации импортируется в базу данных, с которым далее пользователи работают. В процессе заполнения определенного набора полей автоматически высчитывалась итоговая сумма в поле «Итого». Но в определённый промежуток времени использования продукта начали появляться ошибки, связанные с несоответствием значения поля «Итого» сумме полей из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Так как ошибку не получалось явно повторить, необходимо было разработать механизм для решения данной проблемы.

Естественно самой реальной и первой причиной возникновения такой ошибки приходила идея о сбоях в работе событий полей окна редактирования (то есть значения в полях изменялись, а события данных полей(-я) не срабатывали).

В основу решения было положено создание двух таблиц в базе данных для ведения логов, что происходят с записью набора данных. Первая таблица WindowLog, а вторая TriggerLog.

Первая таблица WindowLog включает в себя поля «Дата создания»(CreatedOn), «Идентификатор записи» (RecordID), «Ответственный» (WindowsUser), «Имя поля породившего событие»(FieldName), «Итого» и поля из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Для наполнения таблицы было использованы события невизуального компонента окна dlData: dlDataOnDatasetDataChange, dlDataOnDatasetBeforePost и dlDataOnDatasetAfterPost. В скрипте в событиях была создана функция, которая формировала SQL запрос к таблице WindowLog базы данных с фиксацией информации по указанным полям на момент срабатывания события.

Запрос:

INSERT INTO WindowLog (*набор полей*)
SELECT (*набор полей*) -- Dataset('поле1'), Dataset('поле2'), Dataset('поле2')

Вторая таблица TriggerLog включает в себя поля «Дата создания»(CreatedOn), «Идентификатор записи» (RecordID), «Состояние» (до изменения записи и после), «SystemUser», «Итого» и поля из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Для заполнения данной таблицы был создан триггер на инструкцию UPDATE проблемной таблицы с двумя запросами вставки значений в таблицу. В одном запросе вставлялись значения до изменений, а во втором после.

Запрос №1:

INSERT INTO TriggerLog (*набор полей*)       
SELECT (*набор полей*)
FROM deleted

Запрос №2:

INSERT INTO TriggerLog (*набор полей*)       
SELECT (*набор полей*)
FROM inserted

Результатом использования данного решения на основе анализа таблицы WindowLog было установлено, что срабатывают все события окна редактирования, влияющие на вычисление значения поля «Итого». В процессе использования окна редактирования и после сохранения записи значения поля «Итого» были корректны.

Проанализировав записи в таблице TriggerLog было установлено, что в результате выполнения инструкции UPDATE было внесено некорректное значение. Сопоставив даты создания записей в таблице TriggerLog и WindowLog было установлено, что инструкция UPDATE была вызвана не в результате манипуляций с окном редактирования, а иным источником. На основании поля «SystemUser» таблицы TriggerLog было установлено что изменения были внесены с помощью импортера данных.

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

PS: Принимаю предложения на доработку вашей конфигурации!!! Для более детальной информации можно связаться по следующему e-mail адресу: providnui@ukr.net !!!

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

Всем удачи в этом не легком процессе!!!

Нравится

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

Подскажите как по нажатию на кнопку открыть определенную страницу?

Нравится

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

Здравствуйте.
Можно в процессе карточки с кнопкой, после события нажатия кнопки, добавить элемент "Открыть карточку редактирования", заполнив необходимые параметры.

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

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

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

Все спасибо, получилось.

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

Коллеги,
Хакинг BPMonline продолжается и его невозможно остановить. Кто ещё не знает, вы можете подписаться на клиентское событие, предшествующее аналогичному серверному событию для какого-либо контрола. Достаточно одной строчки. Добавлять нужно на PageLoadComplete. Выглядит это так (обязательно со скобками и т.д.):

string script = @" function(){ //тело функции } ()";
Page.SomeControl.AjaxEvents.SomeEvent.OnClientEvent=script;

Зачем это нужно? Порядок запуска методов будет такой: ClientEventScript ->AJAX-> ServerPageInit -> ServerPageLoad -> ServerEventScript
И вы получаете уникальную возможность сделать что-то со страницей ещё до того, мы зайдем на сервер и его события Init и PageLoad. Например, вам нужно знать, была ли нажат кнопка сразу же на PageLoad после того, как она была нажата. Если вы сделаете флаг нажатия в ServerEventScript, то он будет установлен уже после того, как сработает Init, а если вы такой флаг добавите в клиентскую часть, то его можно вычитать на PageLoad и узнать, что кнопка была нажата(как передавать параметры между клиентом и сервером, расскажу отдельно). Кроме того, некоторая часть логики недоступна на сервере или её выставление на сервере будет ненужным-поздним.

Ниже пример, как это делается, а также кое-какие другие возможности.

string script = @" function(){
var savetofileparam = new Object();
savetofileparam.MenuItem = itemIndex;
var SaveMenuItemParams = Ext.util.JSON.encodeObject(savetofileparam, 3);
Terrasoft.AjaxMethods.ThrowClientEventWithParameters('"
+ InstanceUId + @"', 'SaveToFileCustomEvent',SaveMenuItemParams, {eventMask:{showMask:false}, isUpload: true}  ); } ()";
Page.SaveFileButton.AjaxEvents.MenuItemClick.OnClientEvent=script;

Тут мы добавляем функцию на клик пункта меню у кнопки, а также кидаем другое событие, которому передаём параметры в виде JSON-словаря SaveMenuItemParams (itemIndex-номер пункта, это передаётся в параметрах события, я узнал это опытным путём, у каждого клиентского события свои параметры). Также передаём параметры showMask и isUpload именно на клиенте, так как на сервере их передача не приводит к желаемому эффекту, потому что вычитываются они ранее ещё на клиенте. 'SaveToFileCustomEvent' – это произвольный message-событие. Если событие с таким названием определить на сервере, то можно его перехватить и выполнить свой код, при этом вычитав параметры, которые были упакованы, вот так ():

Dictionarystring, object> SaveMenuItemParams = context.ThrowEventArgs as Dictionarystring, object>;
if (SaveMenuItemParams != null) {
if (SaveMenuItemParams.ContainsKey("MenuItem")) {
  //код работы с  SaveMenuItemParams["MenuItem"]
 }
}

Нравится

Поделиться

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

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

Вот простой пример:
Диаграмма процесса

И скрипт

//-----------------------------------------------------------------------------
// wd_Test1Script
//-----------------------------------------------------------------------------


function Item3OnFinish(FinishItem) {
        ShowInformationDialog('Вариант 1')
}

function Item4OnFinish(FinishItem) {
        ShowInformationDialog('Вариант 2')
}

Какой вариант ответа на вопрос ни выбери, сообщается, что выбран первый...

Версия 3.3.2.97

Нравится

Поделиться

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