объекты Window
события DataSet
Технические вопросы
Разработка

В событиях контролов нет событий, связанных с изменением данных в DataSet. В событиях DataSet нет очевидной связи с формой(Свойства у DataSet не содержат ссылок на форму или я их не нашел). Как при событие изменения DataSet, менять свойства контролов, создавать новые контролы? По факту наверное нужен путь в событие DataSet: DataSet.xxxx.xxxx.xxxx.Window или способ создать на эллементе событие "change".

Краткий итог: Control - dlData - Dataset. Задача решаеться через событие dlDataOnDatasetDataChange.

Нравится

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

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

к полю привязывается объект DataField, у которого есть ParentDataset.
При изменении DataField срабатывает Dataset/OnDatasetDataChange, которое вызывает (перед или после выполнения - так и не разорался) DatasetLink/OnDatasetDataChange. А DatasetLink является объектом окна - вот вам и связь

"Александр Кудряшов" написал:

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



Такое обращение не работает.

Непосредственное обращение к эллементам работает. Спасибо.

используйте
var q = Self
или
var w = dlData.ParentWindow

"Андросов Дмитрий" написал:

используйте
var q = Self
или
var w = dlData.ParentWindow


Спасибо. Все таки странно, что на котролах нет DataChange, а нужно лезть dlData, в котором общие события, там ставить анализ, что приходит и дописывать уже нужный код.

"Борисов Михаил Евгеньевич" написал:Все таки странно, что на котролах нет DataChange

В обычных, не привязанных к БД, есть.
Возможно, события нет ещё и потому, что к одному полю может быть привязано больше одного визуального компонента.

Так как датаконтролы связаны с полем датасета, а у датасета в свою очередь можно определить обработчик события OnDatasetDataChange – для датаконтролов не выносили событие OnChange (чтобы не дублировать).
У простых контролов нет связки с датасетом, поэтому событие OnChange вынесено.

"Борисов Михаил Евгеньевич" написал:Control - dlData - Dataset

Window - Control - DataField - Dataset - dlData - Window
или
Control - Window - dlData - Dataset - DataField

"Андросов Дмитрий" написал:Борисов Михаил Евгеньевич пишет:

Control - dlData - Dataset

Window - Control - DataField - Dataset - dlData - Window
или
Control - Window - dlData - Dataset - DataField


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

"Борисов Михаил Евгеньевич" написал:Если говорить о доступе, то первое неверно, я так понял

ну да :exclaim:
Window - Control - DataField - Dataset

"Борисов Михаил Евгеньевич" написал:Если говорить о последовательности событий, то хз, уже сто раз писали, что нужна табличка с цепочками событий с основными задачами которые в них решаются(но по названиям все же очевидно).

В SDK приведены основные события элементов и их описание. Например: http://www.terrasoft.ru/sdk/!!MEMBERTYPE_Methods_IDatasetEvents.html

"Андросов Дмитрий" написал:Борисов Михаил Евгеньевич пишет:

Если говорить о доступе, то первое неверно, я так понял

ну да :exclaim:
Window - Control - DataField - Dataset


выяснили же, что с dlDataOnDatasetDataChange можно непосредственно вызывать контролы по имени. Цепочка Window - Control - DataField - Dataset - dlData говорит о том что вам нужно обращаться к Dataset что бы обратиться к Control.

"Бондарь Наталия" написал:Борисов Михаил Евгеньевич пишет:

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

В SDK приведены основные события элементов и их описание. Например: http://www.terrasoft.ru/sdk/!!MEMBERTYPE_Methods_IDatasetEvents.html


Такую документированность видел только в MIT проектах(бесплатных). За образец, считаю MSDN.

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

Показать все комментарии
Технические вопросы
5.x

Хочу в новогодние праздничные выходные переехать сервер BPMonline.

Надо перегенерировать лицензии, кто нибудь будет трудится в ТП террасофте в сие благостное время?

Нравится

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

Зачастили вы с переездами сервера :wink:
Лицензии же вроде робот генерит на support.bpmonline.com?

я не зачастил, я отложил :-)
То есть я так понимаю все будет в порядке?

Добрый день!

Вот инструкция по автоматическому лицензированию, с помощью которой можно выполнять лицензирование на портале support.bpmonline.com.

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

Успешного переезда!

Спасибо!

Показать все комментарии
ссылки
Технические вопросы
7.x

Как в карточке активности создать кнопку для перехода в продажу?

Нравится

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

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

К файлам прикреплен пример добавления кнопки "Основной контакт" в карточку контрагента, по нажатию на которую, происходит переход на страницу карточки основного контакта.

 

Показать все комментарии
7.x
кнопку
удалить
Технические вопросы
7.x

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

По логике клиента один из разделов заполняется бизнес-процессом, соответственно кнопку "Добавить" в этом модуле необходимо скрыть. Каким образом это можно реализовать?

Нравится

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

Здравствуйте, Константин!
Можно скрыть кнопку таким образом:

var buttons = Ext.get('button-panel'); //получаем блок с кнопками
var buttonAdd = buttons.dom.children[0]; //получаем кнопку "Добавить"
buttonAdd.remove(); //удаляем кнопку
//или
buttonAdd.style.display = "none"; //скрываем кнопку

Благодарю, но вариант не совсем то, что мне нужно
Элементы из DOM'a, помниться мне, я могу получить только после отрисовки раздела, а удалить кнопку нужно до этого. Да и не совсем понятно куда этот код вставлять?

Константин, в 7.1 есть более корректный метод:

this.modifyUtilsConfig = function(config) {
config.items[0].splice(0,1);
}

А вариант с DOM должен работать на init.

ну если говорить о 7.1, то есть метод

getAddButtonVisbility

Константин, Вы имеете ввиду, что можно решить задачу, переопределив указанный метод?

Совершенно верно

Константин, рад, что у Вас получилось.

QArt,

Попробуйте удалить элемент после того как отработает базовая реализация init (после this.callParent(arguments)). В параметре Ext.get() нужно указывать id DOM элемента.

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

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

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

Уффф. :smile: Сформулировал.

Как?

Нравится

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

Попробуйте с помощью бизнес-процесса.
После сохранения записи генерируйте сигнал, что-то типа "UpdateBla_Bla_BlaGrid". И уже в процессе Bla_Bla_BlaGrid'a ловите этот сигнал и обновляете гриду

Мысль....Семен Семеныч :-) Спасибо.

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

Page.AddScript("PageContainer_AccountsModulePage_Grid_TreeGrid.refreshData();");

Если нужно больше универсальности, то можно достучаться до родительского контейнера через свойство "ownerCt". Путем нескольких повторений "ownerCt.ownerCt..." можно попасть в "PageContainer_AccountsModulePage", затем к нему добавить "_Grid_TreeGrid.refreshData();".
А получить Id элемента для обращения к нему из скрипта можно из свойства "ClientID".

Не совсем я понял.
Я добавил в процесс сохранения записи детали генерацию события RefreshBaseGrid
Мне его где ловить? На странице раздела?

Александр, из страницы редактирования добрался до грида раздела следующим образом:

Page.AddScript("window.opener.window.PageContainer_ContactsModulePage_Grid_TreeGrid.refreshData();");

Смачно. Сейчас попробую.

"Шамуилов Александр" написал:

Не совсем я понял.

Я добавил в процесс сохранения записи детали генерацию события RefreshBaseGrid

Мне его где ловить? На странице раздела?


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

"Андрей Каспаревич" написал:

Александр, из страницы редактирования добрался до грида раздела следующим образом:

Page.AddScript("window.opener.window.PageContainer_ContactsModulePage_Grid_TreeGrid.refreshData();");

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки


ИМХО, попахивает костылями. А если эту же страницу возможно открыть не только с этой детали? Соответственно opener будет совершенно другой, да и вложенность в контейнеры может варьироваться...
Ну это лично мои соображения - возможно так и будет правильней

эээээ, работает, есть тока одна проблема, если я это вешаю на кнопку OK карточки, то основной реестр раздела обновляется ДО того как сохранятся изменения.....соответственно, ничего не меняется. :smile:
Не могу сообразить, куда вставить сие произведение.

"Шамуилов Александр" написал:

эээээ, работает, есть тока одна проблема, если я это вешаю на кнопку OK карточки, то основной реестр раздела обновляется ДО того как сохранятся изменения.....соответственно, ничего не меняется. :smile:

Не могу сообразить, куда вставить сие произведение.


Генерируйте сигнал после сохранения DataSourc'a
Тогда точно будет после:smile:

Действительно, Константин дело говорит. Можно обновлять с реестра детали по событию "DataSourceSaved".

Не ловится сигнал.
В процессе карточки редактирования записи детали делаю так:
refresh

В процессе страницы РАЗДЕЛА делаю так:
refresh

В скрипте написано

bool RefreshBaseModuleGridScriptTaskExecute(ProcessExecutingContext context){
 
Page.BaseMessagePanel.AddMessage("DEBUG", "ВНИМАНИЕ!!!", 
			"REFRESH GRID SIGNAL CATCHED!!!", 
			MessageType.Warning); //ЭТО ДЛЯ ОТЛАДКИ
 
Page.AddScript("window.PageContainer_DocumentsModulePage_Grid_TreeGrid.refreshData();");
 
return true;
 
}

НИЧЕГО НЕ ПРОИСХОДИТ.......

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

Попробуйте обновлять реестр в скрипте так:

Page.TreeGrid.Clear();
Page.DataSource.LoadRows();
Page.TreeGrid.RefreshData();

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

Не работает, не понимаю.......

Как мне понять, что сигнал доходит?

Александр, тогда не нужно передавать сигнал в родительский процесс. Просто используйте предложенный скрипт прямо на событии сохранения датасета:
Page.AddScript("window.PageContainer_DocumentsModulePage_Grid_TreeGrid.refreshData();");

АААААА, заработало, чтоб ей пусто было!!!! :smile:

Всем спасибо огромное!
Хороших выходных!

Показать все комментарии
ItemInGroupDatasetID
Мастер разделов
Технические вопросы
Разработка

1) При создание нового раздела мастером поле [ItemInGroupDatasetID] таблицы [tbl_Workspace] неправильно заполняется(ссылка на tbl сервис, а нужно на ds). Прошу подтвердить. Версия 3.4.0.141
2) При создание двух разделов, если один сошлеться на другой, то падает здесь, когда в интерфейсе создаешь ссылку в карточке:

FUNCTION AddFilterAndParameter(JOIN, SelectQuery) {
        var Filters = SelectQuery.Items(0).Filters;
        var TableAlias = JOIN.LeftTableAlias;
        var Parameters = SelectQuery.Parameters;
        var Parameter = Parameters.ItemsByName('GroupID');
        IF (!Assigned(Parameter)) {
            Parameter = AddParameter(Parameters, pdtGUID, NULL);
            Parameter.Name = 'GroupID';
        }
        var TableFileds = JOIN.LeftField.ParentFields;

Это уже после исправления ItemInGroupDatasetID. Причем, если новый раздел ссылаеться на что то уже существующее, то все хорошо.
3) Попытка создать два раздела с одинаковым началом имени ни к чему хорошему не приведет. При создание доп таблиц, индексов идет какое то отсечение букв(7 что ли) от названия, уникальность теряеться.

Нравится

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

Михаил, добрый день!

По первому пункту - проверил на 3.4.0. Проблема не воспроизвелась:

По второму пункту - после создания первого раздела необходимо нажать "ОК", и на ответ "Продолжить работу с мастером" ответить "Да". После чего создать второй раздел со ссылкой на первый.

По третьему пункту: ситуацию также не воспроизвел. Создал два раздела с именами TestWorkspace, TestWorkspace2 соответственно:

С индексами все в порядке:

ITestWorkspace2CreatedByID
ITestWorkspaceCreatedByID

3)
2) Все создаеться, но когда открываешь интерфейс и создаешь новую запись, стоит нажать лупу для выбора ссылки на вторую сущность, все падает. А если ссылку не трогать, все работает.

Михаил, сравните, пожалуйста, Araxis'ом Вам скрипт и скрипт во вложении. Если есть отличия - попробуйте загрузить с заменой и проверить, предварительно запросите через письмо на support@terrasoft.ru последние бинарные файлы 3.4.0.

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

Заранее спасибо и хорошего вечера!

Собственно скрипт:

wnd_createnewworkspacescript.rar


Логично -), ошибка 1 исправлена.
Все остальные на месте. Может есть свежие файлы:
scr_GenTable - Имя объекта 'FLEscalationzzRightAdminUnitID' превышает 30 знаков, а в тексте ошибки "nzz" - уже срезано, ошибка 3
scr_GenSelectQuery - просто грешу на этот модуль
scr_SelectDataWithGroupUtils - падает из-за отсуствие объекта, ошибка 2

Для меня сейчас очень критична ошибка 2. С ошибкой 1 все понятно, обойти 3 ничего не стоит.

Новая версия бинарников ничего не изменила.

проверьте текст функции, особенно if (Caption.length > MaxDBObjectSqlNameLength) {

function AddRelationToTable(Table, FieldName, RelationDatasetCode) {
	var Relation = Table.Relations.CreateItem();
	var ChildField = Table.Fields.ItemsByName(FieldName);
	Relation.ChildField = ChildField;
	var TableSQLName = Table.SQLName;
	if (TableSQLName.substr(0,4) == 'tbl_') {
		TableSQLName = TableSQLName.substr(4);
	}
	var Caption = 'F' + TableSQLName + FieldName;
	if (Caption.length > MaxDBObjectSqlNameLength) {
	    TableSQLName = TableSQLName.substr(0, 10);
	    FieldName = FieldName.substr(0, 17);
	    Caption = 'F' + TableSQLName + FieldName;
	}
	Relation.SQLName = Caption;
    var RelationDataset = GetSingleItemByCode(RelationDatasetCode, 'Wizard');
    var ParentField = RelationDataset.SelectQuery.Items(0).FromTable.Fields.
		ItemsByName('ID');
	var RelationDatasetTable = RelationDataset.SelectQuery.Items(0).FromTable;
	Relation.ParentField = ParentField;
	Table.Relations.Add(Relation);
	if (RelationDatasetTable.ParentTableGroup != DictionaryTableGroup) {
		AddIndexToTable(Table, ChildField, TableSQLName);
	}
	return Relation;
}

"Андросов Дмитрий" написал:проверьте текст функции, особенно if (Caption.length > MaxDBObjectSqlNameLength) {

Есть отличая:

    var ParentField = RelationTable.Fields.ItemsByName('ID');
	Relation.ParentField = ParentField;
	Table.Relations.Add(Relation);
	if (IsCascade) {
		Relation.IsCascade = IsCascade;	
	}
                if (RelationDatasetTable.ParentTableGroup != DictionaryTableGroup)

Версия моего файла: Service AppVersion="3.4.0.54" Запрос в поддержку с просьбой выслать мне последнии версии трех сервисов, включая scr_GenTable уже послал.

Можете предоставить скриншот отладчика, на какой строке система падает, и call-stack?
У себя на 3.4.0 не воспроизвел.

пс: идеальный вариант - предоставьте базу, с указанием в каком разделе по нажатию на какой лукап система падает.

Вот архив с запрошенными Вами сервисами

downloads.rar

"Олейник Дмитрий" написал:

Можете предоставить скриншот отладчика, на какой строке система падает, и call-stack?
У себя на 3.4.0 не воспроизвел.

пс: идеальный вариант - предоставьте базу, с указанием в каком разделе по нажатию на какой лукап система падает.

С уважением,
Олейник Дмитрий
Эксперт 3-й линии поддержки


Это у меня:
var ParentField = RelationTable.Fields.ItemsByName('ID');
Это у Дмитрия:
var ParentField = RelationDataset.SelectQuery.Items(0).FromTable.Fields.ItemsByName('ID');
На скришоте видно, что падает на join.leftfield.ParentFields. В ParentFields оказываеться null. Просто нужен файл где исправлена ошибка, функцию менять не хочу, скорей всего все заработает, но что если там еще много чего исправленно.

"Олейник Дмитрий" написал:

Вот архив с запрошенными Вами сервисами

downloads.rar

С уважением,
Олейник Дмитрий
Эксперт 3-й линии поддержки


Спасибо!

Критическая ошибка исчезла. Ошибка с именами осталась, буду ее обходить стороной.

Михаил, не за что.
Если возникнут дополнительные вопросы/проблемы - обращайтесь.

Показать все комментарии
Технические вопросы
Разработка

Добрый день!
Подскажите пожалуйста как лучше запретить пользователю редактирование данных на форме.
Пока я сделал следующим образом:
в событии onPrepare формы
wnd_BaseDBEditOnPrepare(Window);
if (dlData.Dataset.IsActive) {
if (dlData.Dataset.State == dstEdit) {
if (dlData.Dataset('HasRight') != 1) {
SwitchControlForm(Window,false);}
else {SwitchControlForm(Window,true);}
}
}
function SwitchControlForm(Window,Enable) {
for (var i = 0; i Window.ComponentCount; i++) {
var DataField = Window.Components(i).DataField;
if((!IsUndefined(DataField)) || (Window.Components(i).Name == 'btnOK')) {
Window.Components(i).IsEnabled = Enable;
/*if (Window.Components(i).Name == 'btnOK') {
Window.Components(i).IsEnabled = Enable;}
else
{DataField.IsReadOnly = !Enable;}*/
}
}
}

Но смущает что при открытии формы происходит явное мигание, т.е. вероятнее всего сначала отрисовывается форма с закрытыми на редактирование контролами, потом открываются контролы по доступу, а уже потом я их вновь закрываю. Причем, что Window.Components(i).IsEnabled = Enable; что DataField.IsReadOnly = !Enable это явно видно. Такое ощущение что можно сделать и по другому.

Нравится

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

Александр, а если использовать функции

Window.BeginUpdate();

и

Window.EndUpdate();

Первую до начала перерисовки, вторую — после. Можно даже попробовать первую до вызова wnd_BaseDBEditOnPrepare, но не уверен, что заработает без ошибок.

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

Александр, если приведенные выше рекомендации не помогут - обращайтесь.
Хорошего вечера!

Александр, использование Window.BeginUpdate(); практически не помог, я во всяком случае на глаз разницы не заметил.
Борис, включить администрирование по записям в данном случае не вариант, т.к. идет логическая проверка на основании неких условий, имеет или нет пользователь доступ к данной записи.
Коллеги, а где вообще происходит проверка и закрытие формы по доступу? Я рылся, по wnd_BaseDBEdit, но так и не нашел.

Не вижу смысла все ставить в readonly. Может просто блокировать всю форму?
Не знаю, как у вас там называются, например, у контрагентов будет так:

function SwitchControlForm(Window,Enable) {
     frmMain.IsEnabled = Enable;
     btnOK.IsEnabled = Enable;
}

Александр, да я пробовал у формы подергать свойство IsEnabled, но оно почему-то не работает, т.е форма не закрывается и вообще ничего не происходит
function wnd_MP_KredEditOnPrepare(Window) {
wnd_BaseDBEditOnPrepare(Window);
wnd_MP_KredEdit.IsEnabled = false;
}

"Крупский Александр" написал:

Александр, да я пробовал у формы подергать свойство IsEnabled, но оно почему-то не работает, т.е форма не закрывается и вообще ничего не происходит
function wnd_MP_KredEditOnPrepare(Window) {
wnd_BaseDBEditOnPrepare(Window);
wnd_MP_KredEdit.IsEnabled = false;
}


Сталиквался с тем, что есть есть код который передергивает это свойство для всех эллементов(скорей всего механизм администрирования). Так что xxxxxx.IsEnabled = false; писал в событие Show и все работало, а вот в Prepare ничего не работало.

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

Все равно этот IsEnabled не функционирует, ни на форме, ни на фрайме, ни в OnPrepare, ни в OnShow ((
function wnd_MP_KredEditOnShow(Window) {
wnd_BaseDBEditOnShow(Window)
frmData.IsEnabled = false;
wnd_MP_KredEdit.IsEnabled = false;
}

Каким то ведь образом происходит закрытие формы при отсутствии доступа. Мне бы посмотреть на этот механизм, вот только найти его не могу.

"Крупский Александр" написал:

Все равно этот IsEnabled не функционирует, ни на форме, ни на фрайме, ни в OnPrepare, ни в OnShow ((
function wnd_MP_KredEditOnShow(Window) {
wnd_BaseDBEditOnShow(Window)
frmData.IsEnabled = false;
wnd_MP_KredEdit.IsEnabled = false;
}


function wnd_IncidentEditOnShow(Window) {
if (Pages.ActivePage != pgIncident) {
Pages.ActivePage = pgIncident;
}
debugger;
wnd_IncidentEdit.IsEnabled=false;

}
wnd_IncidentEdit - отлично блокируется, кнопки Ок, Отмена становятся неактивными. Может после события OnShow у вас еще что то выполняйтся? (сборка 3.4.0)

Нет, больше ничего не выполняется. Сборка (3.3.2)
Еще одна странность, поставил я дебаг посмотреть ставиться ли это свойство и к моему изумлению в событии OnShow оно уже стоит в false. Дерганье данного свойства тоже не помогает. На тестовой базе попробовал сделать это с инцидентами, как показано выше. Результат тот же, т.е. никакого ))

"Крупский Александр" написал:

Нет, больше ничего не выполняется. Сборка (3.3.2)
Еще одна странность, поставил я дебаг посмотреть ставиться ли это свойство и к моему изумлению в событии OnShow оно уже стоит в false. Дерганье данного свойства тоже не помогает. На тестовой базе попробовал сделать это с инцидентами, как показано выше. Результат тот же, т.е. никакого ))


Значит, что то не так в начальном коде. Обновляйтесь или отсылайте дамп тестовой базы на припарирование. У меня например есть scr_SelectDataWithGroupUtils.xml трех версий от 3.4.0, код везде разный, последняя версия работает отлично, самая старая почти не работает.

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

Показать все комментарии
Технические вопросы
5.x

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

Нравится

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

Эта страница сделана на уровне ядра и из конфигурации недоступна.

А могу ли я исправлять ее не в конфигурации, а в файле Login.aspx?
Смогу ли я из этого файла обращаться к бд с запросами?

Или манипулировать этим файлом никак нельзя?

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

Антонина, добрый день.

Дело в том, что выполнять запросы к БД, или запускать какой либо бизнес процесс до логина пользователя, не корректно с точки зрения безопасности. Выходит что любой переход на Login.aspx будет вызывать не авторизированные запросы к БД. Можно будет отправляя GET запросы к Вашему сайту нагрузить БД до такой степени, что сайт окажется не работоспособен.
Поэтому любые действия, которые происходят до логина - осуществляются "ядром" системы и влиять на них пользователь не может. В связи с этим, хотелось бы уточнить Вашу бизнес задачу. Возможно её можно решить другим способом.

Озвучить свою бизнес идею пока не готова. Тем не менее спасибо за развернутый ответ.

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

Добрый день.
Подскажите возможно ли при помощи БП ловить залогиненного только что пользователя?
Идея такая: Когда пользователь вводит свой логин и пароль, нажимает кнопку Ок, прежде чем пустить пользователя в систему, запускается БП, который бы проверял набор каких-то параметров. Если эти параметры отвечают условиям, то пользователя запускают в систему, если нет, то соответственно не запускают?

Какими средствами можно реализовать подобное?
И еще подскажите в разделе Конфигурация как может называться страница авторизации?
На всякий случай моя версия: Версия 5.4

Нравится

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

Антонина, возможно бизнес-процесс можно прикрепить на вставку записи в таблицу "Сеанс пользователя" (SysUserSession).

Здравствуйте, Антонина!

Возможно запускать процесс программно из MainPage, более подробно решение описано в посте http://www.community.terrasoft.ru/forum/topic/9178

В этом случае мне необходимо сначала пустить пользователя в систему, а мне необходимо ловить его еще не пуская в систему.

"Резвов Роман" написал:Возможно запускать процесс программно из MainPage

Роман, извините, не совсем поняла вашу идею. Можно поподробнее?

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

Как вариант, возможно на уровне БД джобом отлавливать изменения SysUserSession (как и писал Александр) и отталкиваться от этого.

"Резвов Роман" написал:

Как вариант, возможно на уровне БД джобом отлавливать изменения SysUserSession (как и писал Александр) и отталкиваться от этого.


Зачем джобом? Разве логика на объекте не отработает?

Или там вставка в обход методов EntitySchemaQuery?

Александр, ни Ваш ни мой пример Антонине не подойдет, т.к. есть необходимость выполнять запрос(БП) до логина пользователя, т.е. никаких INSERT'ов в таблицу SysUserSession еще не будет.

В таком случае, решить задачу не получится:

http://www.community.terrasoft.ru/forum/topic/10181#comment-45730

"Чемезова Антонина" написал:
Резвов Роман пишет:

Возможно запускать процесс программно из MainPage

Роман, извините, не совсем поняла вашу идею. Можно поподробнее?

Антонина, я имел в виду, что при старте системы (после логина), запускается процесс главной страницы-контейнера (MainPage). На событии PageLoadComplete можно добавить программный код по запуску того или иного бизнес-процесса.

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

"Зверев Александр" написал:

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


MainPage запускается, но не все методы. PageLoad должен запускаться один раз.

Показать все комментарии
Технические вопросы
5.x

Если я в элементе-сценарии событийного процесса на событие Object1Saved напишу:

Entity.SetColumnValue("Column", "Value");
Entity.Save();

где Entity это Object2, то у меня отработает событие Object2Saved и связанный с ним событийный процесс?

Нравится

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

Да, сработает. Конечно, если перед этими 2 строками уже была создана новая или открыта из БД конкретная Entity.

Добрый день, Александр.

Если Вам не принципиально задавать значение колонки после сохранения записи, используйте событие Object1Saving, которое генерируется перед сохранением.
Если обязательно выполнять код по событию Saved, Вы можете использовать insert или предварительно открыть Entity, как правильно заметил Зверев Александр.

"Maxim Gritsenko" написал:Если Вам не принципиально задавать значение колонки после сохранения записи, используйте событие Object1Saving, которое генерируется перед сохранением.

Автор темы спрашивает о двух разных таблицах. Тут не так важно, Saving или Saved. Saved даже предпочтительнее, если мы хотим в Object2 вставить ссылку на сохранённую запись в Object1.

Кстати, если использовать Insert (а не Entity), то события не отработают.

Александр, если у Вас появятся дополнительные вопросы - обращайтесь.

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