Коллеги, добрый день! Есть объект UsrOrder, в нем есть строковое поле JetOrderNumber. В конфигурации открываю этот объект, перехожу на вкладку События и включаю галочку "Перед сохранением записи" (UsrOrderSaving). Далее нажимаю на кнопку "Открыть процесс". Там создаю Событийный подпроцесс, начальным событием которого является Сообщение UsrOrderSaving, а после него создаю заданию-сценарий, в котором прописываю:
Но если у вас пакет-сборка, то нет, так как в пакетах-сборках не работают событийные-процессы.
Та и вообще процессы использовать последнее время практика устарела. Лучше писать логику на объектах с помощью EntityEventListener. Такая логика будет работать и в пакетах-сборках.
Допустим, у меня есть раздел "Автомобили" с возможностью добавления новых автомобилей. В клиентской части мне необходимо отловить событие после добавления новой записи в этот раздел и добавить дополнительную логику на фронте. Думаю, должно быть что-то вроде "onItemInserted". Подскажите, пожалуйста, как это лучше реализовать или какое название метода, который отрабатывает после вставки. Заранее благодарен.
На клиентской части в карточке редактирования Вы можете переопределить метод BasePageV2#onSaved
onSaved: function(){this.callParent(arguments);},
Обратите внимание, если Вам нужно производить какие-то манипуляции с данными (пересчеты/обновления в других объектах и т.д.), то лучше использовать подход сигналов/событий объекта, тк при обработке на клиенте обрабатываться будет только "ручной" ввод, а во время импортов/интеграций/БП это логика останется "за бортом"
На клиентской части в карточке редактирования Вы можете переопределить метод BasePageV2#onSaved
onSaved: function(){this.callParent(arguments);},
Обратите внимание, если Вам нужно производить какие-то манипуляции с данными (пересчеты/обновления в других объектах и т.д.), то лучше использовать подход сигналов/событий объекта, тк при обработке на клиенте обрабатываться будет только "ручной" ввод, а во время импортов/интеграций/БП это логика останется "за бортом"
Если учитывать изменения на объекте процессами, интеграциями (или одновременно разными пользователями), лучше реализовать логику на событии вставки на уровне БП, а затем на сторону браузера передавать по ClientMessageBridge.
Если, например, в контактах в момент когда строка выбрана, пользователь нажимает
на столбце где ссылка контакта "Петров И. А." - затем открывается страница редактирования этого контакта. Когда пользователь закрывает страницу редактирования то на странице (разделе/секции) контакты заново отрисовывается выбранная строка, вопрос: какое событие возникает, как этот факт обработать?
Где-нибудь есть полный список событий и типовые примеры как их обрабатывать? Хотя бы сигнатуры.
Много событий описаны в академии, но очень разбросаны по статьям. А консолидирвоанного списка - нет.
Еще вариант - это в Chrome Developer Tools просмотреть исходный код прямо на странице. Так как он прокоментирован можно разобраться какой метод чем занимается. Плюс ко всему вы можете использовать там CallStack чтобы отследить вызовы методов. Ну или посмотреть исходники тут:
Если вам нужно знать какой метод-обработчик конкретно вызывается для перерисовки реестра, то вероятнее всего вы ищите reloadGridData. Если же - в каком месте производится локальное изменение записи реестра после закрытия карточки, то посмотрите в loadGridDataRecord, там идет точечное изменение записи.
Их для роботов (гугла, яндекса) писали? Или для людей, как так...
Приходится лазить в исходниках, но, зачем, я же не в Террасофте работаю.
Была задача каптион кнопки менять в зависимости от того какой контакт выбран (не контакт, свой раздел), пробовал биндить через ресурс, пробовал биндить атрибут - не работает. Притом если биндить атрибут не к каптион то изменять значение меняя атрибут можно :) Пришлось делать на чистом фронте, выписал события из BaseSectionV2. Но это обойти, а не решить задачу что как для программиста не очень хорошо...
Напишите книгу, чтобы ее можно было читать, с "консолидированными данными". Хороший образец MSDN :) Думаете часто приходится лезть в исходники asp.net?
Притом ответы с академии от ребят у которых другая версия (из предыдущих) не работают. (У нас 7.11.3 ентерпрайз сейлз) приемственности нет...
Добрый день подскажите пожалуйста... Мне требуется вывести модальное окно когда выбираем контакт при создании продажи.
Пакет OpportunitySectionV2
Я создал кастомный пакет, зависимость поставил от OpportunitySectionV2
Что мне сейчас нужно сделать ? Замещающий клиентский модуль или замещающая страница?
Подскажите, каким образом можно найти и переопределить обработчики событий стандартных контролов(например, кнопки Сохранить)?
Возможно ли изменить их стиль?
По сути это две задачи:
1) Изменить стиль (BasePageV2CSS)
2) Изменить обработчики (метод onCardAction, который вызывается при нажатии на кнопку "Сохранить")
Здравствуйте. Я знаю C# и T-SQL, но в BPM'online только начал работать. Я прошу вас помочь мне в следующем. 1) Создать бизнес процесс, который по событию добавления/обновления записи выгружает информацию в шлюзовую таблицу и вызывает хранимую процедуру (которая, как я понимаю, перезаписывает данные из шлюзовой таблицы в целевую). Как это сделать?
2) Выполнить интеграцию по клиентам (физ. лицам, юр. лицам и индивидуальным предпринимателям), договорам, заявкам - после создания в СРМ системе клиента информация попадает в БД на MS SQL Server. После обновления данных информация попадает в БД на MS SQL Server. Как это сделать?
3) Выполнить первичный импорт даннных в CRM-систему из БД на MS SQL Server. Как это сделать?
Для отслеживания создания/изменения/удаления записи Вы можете использовать начальный элемент сигнал. В сигнале необходимо указать объект в bpm'online, в котором должны произойти изменения. Далее элементом "Чтение данных" Вы считываете измененный объект.
Далее элементом "Задание сценарий" Вы можете либо:
вызвать веб сервис для интеграции (описание вызова веб сервиса прикреплено)
вызвать хранимую процедуру
Хранимая процедура предварительно должна быть создана в системе (для этого перейдите в конфигурацию и на вкладке SQL-сценарии добавьте процедуру.
В процессе администрирования базы данных возникла необходимость определить причину возникновения ошибки. Определенный объём информации импортируется в базу данных, с которым далее пользователи работают. В процессе заполнения определенного набора полей автоматически высчитывалась итоговая сумма в поле «Итого». Но в определённый промежуток времени использования продукта начали появляться ошибки, связанные с несоответствием значения поля «Итого» сумме полей из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Так как ошибку не получалось явно повторить, необходимо было разработать механизм для решения данной проблемы.
Естественно самой реальной и первой причиной возникновения такой ошибки приходила идея о сбоях в работе событий полей окна редактирования (то есть значения в полях изменялись, а события данных полей(-я) не срабатывали).
В основу решения было положено создание двух таблиц в базе данных для ведения логов, что происходят с записью набора данных. Первая таблица WindowLog, а вторая TriggerLog.
Первая таблица WindowLog включает в себя поля «Дата создания»(CreatedOn), «Идентификатор записи» (RecordID), «Ответственный» (WindowsUser), «Имя поля породившего событие»(FieldName), «Итого» и поля из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Для наполнения таблицы было использованы события невизуального компонента окна dlData: dlDataOnDatasetDataChange, dlDataOnDatasetBeforePost и dlDataOnDatasetAfterPost. В скрипте в событиях была создана функция, которая формировала SQL запрос к таблице WindowLog базы данных с фиксацией информации по указанным полям на момент срабатывания события.
Вторая таблица TriggerLog включает в себя поля «Дата создания»(CreatedOn), «Идентификатор записи» (RecordID), «Состояние» (до изменения записи и после), «SystemUser», «Итого» и поля из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Для заполнения данной таблицы был создан триггер на инструкцию UPDATE проблемной таблицы с двумя запросами вставки значений в таблицу. В одном запросе вставлялись значения до изменений, а во втором после.
Запрос №1:
INSERTINTO TriggerLog (*набор полей*) SELECT(*набор полей*) FROM deleted
Запрос №2:
INSERTINTO TriggerLog (*набор полей*) SELECT(*набор полей*) FROM inserted
Результатом использования данного решения на основе анализа таблицы WindowLog было установлено, что срабатывают все события окна редактирования, влияющие на вычисление значения поля «Итого». В процессе использования окна редактирования и после сохранения записи значения поля «Итого» были корректны.
Проанализировав записи в таблице TriggerLog было установлено, что в результате выполнения инструкции UPDATE было внесено некорректное значение. Сопоставив даты создания записей в таблице TriggerLog и WindowLog было установлено, что инструкция UPDATE была вызвана не в результате манипуляций с окном редактирования, а иным источником. На основании поля «SystemUser» таблицы TriggerLog было установлено что изменения были внесены с помощью импортера данных.
Таблицу TriggerLog возможно расширить, добавив в нее поля, которые помогут ускорить процесс обнаружение источника изменений записи базы данных. Список дополнительных полей может выгладять следующим образом: ApplicationName, LoginName, HostName.
PS: Принимаю предложения на доработку вашей конфигурации!!! Для более детальной информации можно связаться по следующему e-mail адресу: providnui@ukr.net !!!
В случае возникновения дополнительных вопрос по теме могу поделиться более детальной информацией.
Здравствуйте.
Можно в процессе карточки с кнопкой, после события нажатия кнопки, добавить элемент "Открыть карточку редактирования", заполнив необходимые параметры.
Дмитрий, я зашел в процесс обработки события кнопки, там один событийный подпроцесс со скриптом обработки нажатия на кнопку. Я добавил карточку редактирования, но при этом я могу изменить только свойства в правой части а окно с параметрами не могу открыть. Подскажите пожалуйста пример кода, как это можно сделать из скрипта. В приложенном скрине процесс, на нем видно что приложение не дает возможности открыть окно с параметрами.
Коллеги, Хакинг 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.ThrowEventArgsas Dictionarystring, object>; if(SaveMenuItemParams !=null){ if(SaveMenuItemParams.ContainsKey("MenuItem")){ //код работы с SaveMenuItemParams["MenuItem"] } }
Долго воевал с передачей параметра из подпроцесса. Почему-то в любом случае передавался только один вариант. А решение крылось в особенности обработки события OnFinish для завершающих элементов процесса. Если в диаграмме есть несколько завершающих элементов и у каждого указан свой обработчик события OnFinish, то в любом случае вызывается тот, что расположен раньше в скрипте.