Добрый день!
Это можно сделать только путем регистрации клиентского js скрипта.
В "MainPage" на загрузке вы должны на клиенте в какую-то переменную записать идентификатор процесса страницы.
А в "SysMainPageShell" зарегистрировать клиентский скрипт, который вычтет этот идентификатор и бросит сообщение (можно и с параметрами).
Пока в системе нет примеров реализации такой логики.
В процессе администрирования базы данных возникла необходимость определить причину возникновения ошибки. Определенный объём информации импортируется в базу данных, с которым далее пользователи работают. В процессе заполнения определенного набора полей автоматически высчитывалась итоговая сумма в поле «Итого». Но в определённый промежуток времени использования продукта начали появляться ошибки, связанные с несоответствием значения поля «Итого» сумме полей из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Так как ошибку не получалось явно повторить, необходимо было разработать механизм для решения данной проблемы.
Естественно самой реальной и первой причиной возникновения такой ошибки приходила идея о сбоях в работе событий полей окна редактирования (то есть значения в полях изменялись, а события данных полей(-я) не срабатывали).
В основу решения было положено создание двух таблиц в базе данных для ведения логов, что происходят с записью набора данных. Первая таблица 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 CRM 7.0.0.167 Поддержка: попробуйте переразвернуть, вот ответ:
В чем может заключатся не правильная конфигурация IIS сервера? На этом сервере развернуты сайты, как версии 7.0.0.167 так и версии 7.0.0.235, поведение сайтов аналогичное. Сайты переразворачиваются, как минимум 1 раз в неделю, ошибка повторяется.
Добрый день, Сергей!
Сообщите, пожалуйста, версию IIS сервера и версию операционной системы на которой он развернут.
Эта информация нужна нам для воспроизведения вашего пользовательского окружения.
Добрый день, Антон!
Есть ли у Вас возможность окончательно перенести ваш сайт BPMonline 7 на IIS 8?
P.S. На нашем сервере ondemand все сайты BMPonline уже переведены на использование IIS 8.
Здравствуйте, Антон! Предоставляю пример добавления кнопки на "AccountPage".
Код замещающего модуля:
define('AccountPage', ['terrasoft', 'Account', 'AccountPageStructure', 'AccountPageResources'],
function(Terrasoft, Account, structure, resources){
var viewModel;
structure.userCode= function(){//помещение ссылки на текущий объект вызова в переменную
var parentThis =this;//помещение ссылки на метод init-a в переменную//и последующий его вызов из функции//таким образом происходит переопределение метода
var baseInit =this.methods.init;this.methods.init= function(){if(Ext.isFunction(baseInit)){
baseInit.call(this);}//снова сохраняем ссылку на объект вызова
viewModel =this;//добавление контрола кнопки
var button = Ext.create('Terrasoft.controls.Button', {
renderTo: Ext.get('utils-left'),
caption:"Основной контакт"});//подписываемся на событие клика
button.addListener("click", parentThis.methods.move, parentThis);};//описываем функцию-обработчик события кликаthis.methods.move= function(){
var primaryId =this.get('PrimaryContact').value;if(primaryId){
var URL = Terrasoft.workspaceBaseUrl+'Nui/ViewModule.aspx#CardModule/ContactPage/view/'+ primaryId;
document.location.replace(URL);}};};return structure;});
Ext.get() возвращает элемент страницы по идентификатору, который можно получить используя инспектор элементов в инструментах разработчика браузера (F12 в Chrome):
Здравствуйте, Константин!
Уточните, пожалуйста, версию, на которой воспроизводится ошибка и в каком именно разделе.
Ошибка может быть связана с нарушением иерархии объектов при замещении, что приводит к тому, что метод страницы вызывается до построения объекта и обращается к нему, и, соответственно, не находит.
Спасибо, что сообщили об ошибке!
build 7.0.1.234
на 7.0.1.335 удалось это исправить повторным созданием всех LocalizableString и Images. Замещаемый модуль - ViewModule, тоже самое происходит и в ProfileModule
Кстати, безумно не удобно, и приходиться тратить большое количество времени, на переопределение всех LocalizableString, Dependencies, Images и Messages у замещаемого модуля. Уж если происходит замещение родителя, то логично было бы (ИМХО) наследовать все его свойства
Константин, то, что LocalizableString, Dependencies, Images и Messages не копируются в замещающий объект - это нормальное поведение системы, которое в дальнейшем, возможно, будет изменено.
Дополнительный вопрос по поводу ошибок.
После создания замещающего модуля Вы генерировали метаданные и исходный код, компилировали всю сборку заново, чистили Redis?
Константин, в таком случае ошибка была вызвана тем ,что изначально Вы не добавили LocalizableString, Dependencies, Images и Messages в замещающий модуль.
Базовая логика работы системы предусматривает, что при замещении модуля необходимо полностью реализовать его функциональность.
Добрый день, нужна ваша консультация, Задача такая: Страница карточки задачи(TaskEditPage) надо сделать не активными связи(Юр. Лицо, Физ. Лицо, Воздействие ….) , смотрим на права пользователя если есть делать активным а если нет то делаем не активным, как это можно реализовать? Может вы дадите идею как сделать правильнее, если можно с примерами, заранее спасибо.
if ((currentUserContactId == VedId1) || (currentUserContactId == VedId2)){
Page.GoodsLookupEdit.Enabled = true;
}else{
Page.GoodsLookupEdit.Enabled = false;
}
В этом участке кода вы проверяете только на два пользователя if ((currentUserContactId == VedId1) || (currentUserContactId == VedId2)){, а если будет 500 -600 пользователей?
Как этим быть?
Так выглядит функция вывода в ворд проблема в том, что вывод не всегда работает а отправляет ворд в процессы и не открывает просто зависает. function ButtonOnClick(Control) {
//TODO
var TaskDataset = Services.GetNewItemByUSI('ds_Contract');
TaskDataset.Open();
var FileName = 'c:\\1\\eplay.doc';
var Word = new ActiveXObject('Word.Application');
Word.Documents.Open(FileName);
var Selection = new Object();
Selection = Word.Selection;
var cid = edtCustomerName.datafield.Value;
TaskDataset.Close();
WordReplaceMark(Selection,'>',cid);
Word.Visible = true;
}
Николай, несколько уточняющих вопросов:
1. Зачем Вы открываете Dataset, если нигде не используете?
Попробуйте удалить строки:
var TaskDataset = Services.GetNewItemByUSI('ds_Contract');
TaskDataset.Open();
TaskDataset.Close();
2.Попробуйте заменить
var Word = new ActiveXObject('Word.Application');
на
var Word = System.EmptyValue;
var Word = new ActiveXObject('Word.Application');
Если ошибка будет и дальше воспроизводиться, необходимо провести Debug и посмотреть, на какой строке "зависает" программа.
function ButtonOnClick(Control) {
var FileName = 'c:\\1\\eplay.doc';
var Word = System.EmptyValue;
var Word = new ActiveXObject('Word.Application');
Word.Documents.Open(FileName);
var Selection = new Object();
Selection = Word.Selection;
var eplay1 =edtContractTitle.datafield.Value;
WordReplaceMark(Selection,'<>',eplay1);
Word.Visible = true;
}
Ошибка : Предполагается наличие объекта.
Создал объект детали, создал страницу, перенес изменения из тестовой базы. При добавлении детали в Рабочих местах указываю объект, получаю ошибку : Exception Message: Элемент с идентификатором "5341c111-59a5-4f60-9fe5-5cc2d543239f" не найден
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core
В чем может быть дело ? (BPMonline 5.4)
Посмотрел конфигурацию - получается что объект и страница не перенеслись в конфигурацию. В основной не открываются, только в тестовой
Здравствуйте, Николай!
Пожалуйста, уточните, Вы переносили из одной базы данных в другую?
Во всяком случае, нужно заново сгенерировать метаданные и исходный код для импортированных элементов и опубликовать их.
Антон, общий алгоритм решения задачи сводится к следующему:
1) регистрация View в базе данных (таблица [SysModuleGrid] и [SysModuleGridView]);
2) создание соответсвующего объекта в конфигурации;
3) привязка созданного представления к разделу.
Если необходимы уточнения и подробные инструкции, пожалуйста, спрашивайте.
К сожалению пока в BMPonline 7.0 простого способа реализации добавления представлений для реестра не предусмотрено. Возможно они появятся в будущем.
Сейчас альтернативой может послужить использование настроенных динамических групп.
В вашем случае это будет настройка по типу Приход/Расход.
Реализовать представления ,так как Вы нарисовали на скриншоте (в меню вкладок) без доработок в базовых модулей невозможно.
Нашел немного другой способ, который, думаю, вас устроит:
Вы можете в разделе зарегистрировать действие для каждого представления:
И все что Вам останется это – дополнительно в разделе определить метод modifySelectQuery. В котором вы на основе этого атрибута дополнительно наложите фильтр на запрос.
this.methods.modifySelectQuery= function(select, tabName, event){
var operationFilterType =this.get('OperationFilterType');if(operationFilterType === ‘Income') {
/*Накладываем фильтр на select* /
}
}
Реализовать представления ,так как Вы нарисовали на скриншоте (в меню вкладок) без доработок в базовых модулей невозможно.
Нашел немного другой способ, который, думаю, вас устроит:
Вы можете в разделе зарегистрировать действие для каждого представления:
this.actions = [
{
caption: “Приход”,
methodName: 'showIncome'
}
…
]
С обработчиком, который проставляет значение какому-то атрибуту viewModel и перезагружает представление. Также можно сменить и заголовок вкладки.
this.methods. showIncome= function() {
this.set("OperationFilterType", ‘Income’);
this.set('tabName', ‘Операции - Приход’);
this.clear(this.get('currentTabName'));
this.load(this.get('currentTabName'));
};
И все что Вам останется это – дополнительно в разделе определить метод modifySelectQuery. В котором вы на основе этого атрибута дополнительно наложите фильтр на запрос.
Антон, будьте внимательней.
Метод "select.filters.addItem" принимает 1-н параметр - сам фильтр. Из-за этого он у Вас не отрабатывает.
А Ваш код для наложения фильтров при OperationFilterType = "Expense" должен работать (если вы правильно построили сам фильтр). Только что проверил аналогичное использование фильтрации.
Добрый день, Антон!
Возможно у Вас старая версия базовых пакетов.
Загляните в модуль "SectionViewModelGenerator" есть ли там в методе "getSelect" вызов функции "modifySelectQuery".
Если есть - то вам нужно в "дебаге" посмотреть чего она у Вас не вызывается.
Если нет - то нужно просто обновить базовые пакеты.
Добрый день !!! У меня возникла проблема с созданием детали с полями:
1. Первое я не могу добавить зависимости(Dependency) (Конфигурация - Добавить - Схема модели представление детали с полями)
2. Не могу понять как строится представление детали (где описываются контролы и так далее), смотрел на схемы: NUI.AnniversaryDetail.js, NUI.AddressDetail.js, хотелось бы описание что за что атрибут/метод отвечает и что делает если можно
Уточните, пожалуйста, версия на которой пытаетесь добавить зависимость. Т.к. не смогли воспроизвести на коробке.
Все описать не получиться, опишите задачу, которая перед Вами стоит, постараемся предоставить рекомендации по реализации.
7.0.1.328
Почти разобрался, щас еще разбираюсь.
1. Не добавлялась так как вначале представление не было создано, после создание зависимости и так далие добавляются.
2. Половину разобрал осталась вторая
Я бы хотел что бы можна было добавлять групу контролов но не в столбец, а в строку и еще как можна добавить простой лейбл ?
Сергей, лейбл пока вывести нельзя. Недавно этот функционал был добавлен и будет доступен в сборках ~7.0.1.500+.
Касательно остального, сейчас уточняем у разработки.
Правильно ли я понимаю:
Метод Ext.create, создает контрол и вставляет его куда я захочу ? а функцыя Ext.get('autoGeneratedLeftContainer') возвращает нам елемент куда мы его будем вставлять ? Как мне взять узнать имя куда его вставлять ? Так как я пробую имена своих груп мне возвращает undefined. Я этот метод вызываю где, в userCode? или гдето в другом месте ?
И как обстоят дела с бизнес правилами к детали и групам ? и построения контролов в ряд а не в столбец ? Видел подобное в карточке Счета к "напомнить ответственному"но если сменить имя контрола оно уже не будет строить в ряд... я так полагаю это гдето выше персится и меняется
а как программно взять ? например если он каким то чудом изменился ? и что на счет бизнес правилами к детали и групам ? и построения контролов в ряд а не в столбец ?
Программно по Id, других идентификаторов у элементов нет.
Специалисты департамента разработки говорят, что выстраивать контролы в ряд без доработки нельзя.
Также, параметр rules в деталях не обрабатывается.
Программно по Id, других идентификаторов у элементов нет.
Специалисты департамента разработки говорят, что выстраивать контролы в ряд без доработки нельзя.
Также, параметр rules в деталях не обрабатывается.
что нужно дорабатывать ? Страницу генерации ? или css классы ? если нужно css классы то как их добавить ?
Сергей, перенаправляю вопрос разработчикам.
В поддержке не реализовывали, необходимой информацией не владеем.
В ближайшее время постараемся предоставить ответ от департамента разработки.
Специалисты департамента разработки предлагают следующее решение:
Можно задавать обтекание для контейнера используя свойство styles:
styles: {
wrapStyles: {
'float': 'left'
}
},
Чтобы использовать эту возможность нам нужно сгенерировать представление, в котором мы будем что-то менять. Для этого нужно использовать функцию getCustomItemView.
При помощи определения этой функции в своей детали мы можем отдать полный конфиг представления для элемента детали. Использование этой функции можно посмотреть в детали средств связи.