исполнитель
обращение
права доступа по умолчанию
Технические вопросы
5.x

Для BPMonline Service Desk. Подскажите, как технически реализуется возможность сортировки и прав доступа новых обращений в зависимости от сервиса/подсервиса для конечного исполнителья. Т.е. чтобы ряд групп исполнителей мог видеть обращения исключительно указанной для нее специфики. Если возможно в качестве детальной инструкции. Спасибо!

Нравится

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

Добрый день.

В свойствах объекта ServiceRequest укажите значение колонки Группа и опубликуйте объект.

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

Не совсем то, что я хотел. Допустим, что есть 10 предоставляемых видов сервисов. 2 из них делает одна группа, 2 из них другая, 2 из них третья и так далее. В разделе обращений каждая из групп может видеть только обращения предназначенные именно им(зависимость от выбранного типа сервиса при создании обращения для конкретной группы). Может быть создать несколько папок до раздела обращений и на них дать права? Тем не менее как нацелить на них необходимые сервисы? Пожалуйста, подскажите.

Если вопрос удобства, то корректнее всего было бы создать динамические группы с фильтрами по сервисам, выбранным в инциденте/запросе на обслуживание.
Если вопрос безопасности, то необходимо дописывать логику на сохранении записи. В объекте ServiceRequest, в процессе, на событии ServiceRequestInserted в задании-сценарии ServiceRequestInsertedScriptTask дописать insert, наподобие уже существующего:

var portalUsersSysAdminUnitUId = new Guid("f858d1b9-334b-e111-b408-00155d054c02");
Guid recordUId = Entity.PrimaryColumnValue;
int defPosition = 0;
var defaultSourceUId = new Guid("f41e0268-e324-4228-9e9e-5cb7cc906398");
var nowParameter = new QueryParameter("now", DateTime.Now, "DateTime");
var currentUserContactIdParameter = new QueryParameter("currentUserId", UserConnection.CurrentUser.ContactId);		
for (int operation = 0; operation <= 2; operation++) {
	var insertRight = new Insert(UserConnection)
		.Into("SysServiceRequestRight")
			.Set("CreatedOn", nowParameter)
			.Set("CreatedById", currentUserContactIdParameter)
			.Set("ModifiedOn", nowParameter)
			.Set("ModifiedById", currentUserContactIdParameter)				
			.Set("RecordId", Column.Parameter(recordUId))
			.Set("SysAdminUnitId", Column.Parameter(portalUsersSysAdminUnitUId))
			.Set("Operation", Column.Parameter(operation))
			.Set("RightLevel", Column.Parameter(true))
			.Set("Position", Column.Parameter(defPosition))
			.Set("SourceId", Column.Parameter(defaultSourceUId))
		as Insert;
	insertRight.Execute();
}

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

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

Guid groupId;
Guid subserviceId = Entity.SubserviceId;
switch (subserviceId.ToString()) {
	case "d79f2070-f36b-1410-f18a-0050ba5d6c38": //если такой-то подсервис
	groupId = new Guid("f15d4059-e23e-4ed9-9041-88a12736c031"); //то, даем права такой-то группе
	break;
	case "jf75j070-f36b-1410-f18a-hr7dj45d6c38": //а если такой-то подсервис
	groupId = new Guid("r45d4059-e23e-4ed9-9041-88a12736c741"); //то, даем права другой группе
	break;
	default: //условие по умолчанию
	groupId = new Guid("6e0a1b5e-7738-4a9c-9d2d-995f62e51e26"); //даем права группе такой-то
	break;
}
var defaultSource = new Guid("f41e0268-e324-4228-9e9e-5cb7cc906398");
var now = new QueryParameter("now", DateTime.Now, "DateTime");
var currentUserContactId = new QueryParameter("currentUserId", UserConnection.CurrentUser.ContactId);		
for (int operation = 0; operation <= 2; operation++) {
	var insertRight1 = new Insert(UserConnection)
		.Into("SysServiceRequestRight")
			.Set("CreatedOn", now)
			.Set("CreatedById", currentUserContactId)
			.Set("ModifiedOn", now)
			.Set("ModifiedById", currentUserContactId)				
			.Set("RecordId", Column.Parameter(Entity.PrimaryColumnValue))
			.Set("SysAdminUnitId", Column.Parameter(groupId))
			.Set("Operation", Column.Parameter(operation))
			.Set("RightLevel", Column.Parameter(true))
			.Set("Position", Column.Parameter(0))
			.Set("SourceId", Column.Parameter(defaultSource))
		as Insert;
	insertRight1.Execute();
}
Показать все комментарии
Технические вопросы
5.x

Вопрос следующий:Пользователь, под которым заходишь в систему, имеет связь с Контактом 1:1, Контакт имеет связь с Контрагентом 1:1. Как сделать, чтобы пользователь мог работать только с определённой группой Контрагентов (например видеть в поле справочника)

Нравится

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

Ольга, добрый день!

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

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

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

Всем привет. Сам начинающий пользователь и сразу же вопрос просьба. Проверьте плз скрипт.
Во вложении результат и сам запрос sumpotipu2.zip

Нравится

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

Добрый день, чтобы проверить отчет недостаточно файла repx. нужно дополнительно выгрузить файл с данными.
Еще один способ выгрузить весь отчет:
- В приложении BPMonline перейти в раздел [Конфигурация].
- Найти схему отчета и выгрузить ее используя действие "Экспорт в файл".

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

Доброго времени суток уважаемые коллеги, подскажите пожалуйста где и как можно работать с печатной формой?
1.Как ее запустить в карточке продажи и т.д.
2.Как можно создать печатную форму?

Нравится

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

Добрый день.
В карточке продажи есть предустановленные в базовой версии печатные формы "Коммерческое предложение" и "Досье продажи". Что бы добраться до них, необходимо открыть продажу на просмотр и воспользоваться элементом Действия:

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

Максим, огромное спасибо.

А как добавить свои печатные формы (уже созданные) в конкретном модуле?

1. Регистрация печатной формы:

1. Перейдите в раздел [Справочники].
2. Откройте для редактирования справочник [Печатные формы].
3. В меню [Добавить] выберите команду [MS Word]
4. Введите название формы.
5. Выберите раздел, в действиях которого должна быть доступна печатная форма. Например, чтобы добавить печатную форму договора, укажите раздел [Документы].
6. Установите признаки [Отображать в разделе] и/или [Отображать в карточке].
7. Сохраните карточку печатной формы.

Более детальную информацию можно найти в справке в разделе НАСТРОЙКА СИСТЕМЫ-->настройка печатных форм MS Word

Юрий, спасибо!

Common ->>> Printables
в разделе который у вас на скрине, название Printables.
Вот пишу и уже уверен что Вы нашли))
на русском: Общие --> Печатные формы

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

Здравствуйте уважаемые коллеги, скажите пожалуйста как в боковую панель добавить новый раздел
допустим "Турист" создать для него карточку которую в дальнейшем можно будет заполнить и реализовать к ней печатную форму. И где можно отредактировать или создать новую печатную форму?
Заранее спасибо.
С Уважением Юрий.

Нравится

1 комментарий
Технические вопросы
5.x

Есть текстовое поле, в нем URL, хочу кнопку, чтобы этот url открыть в новом окне браузера.

Нравится

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

Александр, никогда такого не реализовывал, но по идее на Init'e нужно прописать клиентскую js-функцию клика на кнопку:

что-то вроде

button1.Attributes.Add("onclick", "window.open('help.htm', '', '', 'height=200,width=400'");
// or whatever
//button1.Attributes.Add("onclick", "anyJavaScriptFunction");

Примеры добавления js-функций можно поискать в конфигурации.

весело :smile:
хотя казалось бы что уж проще.....

Решил пойти другим путем, но почему не срабатывает.
На карточке редактирования сделал надпись URLLinkLabel рядом с полем, но код

Page.URLLinkLabel.Caption = "<center><a href=\"http://yandex.ru/\"">Zzz...</a></center>"";

То есть идей ни у кого нет....прискорбно.....

Если код

Page.URLLinkLabel.Caption = "<center><a href=\"http://yandex.ru/\"">Zzz...</a></center>"";

Событие Init, я писал в первом посте :)

Не срабатывает, хотя проверю еще раз....

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

Попробуйте либо после базового события Init, либо после базового PageLoadComplete.

тоже дома не сидится по выходным? :biggrin: сейчас попробую, только сервера переставлю на положенное место

Вопрос вот в чем: если я открываю процесс своей карточки редактирования, то у меня там нет ничего...ни init, ни pageloadcomplete, а есть они если открыть родительский процесс. Если я изменю родительский процесс, то есть процесс Базовой страницы редактирования, от которой унаследована моя страница, то эти изменения будут для всех страниц редактирования, которые я унаследую потом от базовой?

Да, так делать не стоит.

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

Мммммм, понял, попробую...

Сделал вот так, в скрипте одна срочка

Page.URLLinkLabel.Caption = "<center><b><a href=\"" + Page.LotURLTextEdit.Value + ""\"" target=\""_blank\"">>>>></a></b></center>"";

Поместите все эти элементы в событийный продпроцесс:

гм.....заработало, только я, наверное как не так значение поля достаю по всей видимости.
Так как вместо ссылки, вроде http://yandex.ru, которое и написано в поле, подставляет туда ссылку НА САМУ КАРТОЧКУ ЭТОЙ ЗАПИСИ.....
на скриншоте видно, слева поле с URLом, справа ссылка в виде >>>>>, курсор мыши как раз на ней и внизу показывается адрес куда она ведет........

URL Link

Значение поля достаю так:

Page.LotURLTextEdit.Value

Короче, проблема в том, что я никак не могу достать значение колонки LotURL
Пробовал через поле редактирования, не получается, так как если брать Page.LotURLtextEdit.Value то получается какой то бред, а если добавить .ToString(), то вообще пустая строка.....

Если пойти через DataSource, все еще хуже: просто падает:

Exception Message: Object reference not set to an instance of an object.
на вызове
Page.DataSource.ActiveRow.GetTypedColumnValue("LotURL")

Вот такая диагностика....

Проблема в ActiveRow.....
То ли в данный момент ее ещё нет, то ли текущая строка по другому называется....

Так оно и есть, как показала диагностика

DataSource.ActiveRowPrimaryColumnValue

на данном этапе весь из себя нулевой, то есть и ActiveRow пуст напрочь, почему оно и падает.

Все верно, на Init'e DataSource не заполнен еще.

Попробуйте сделать тоже самое, но в скрипте после базового PageLoadComplete:

PageLoadComplete > BasePageLoadComplete > Script.

А на какое сообщение вешаться?

PageLoadComplete

При попытке добавить сообщение PageLoadComplete ругается что такой идентификатор уже существует....

Сделал скрипт
PageLoadComplete -->> MyScript -->> PageLoadComplete в родительский процесс
НО! DataSource.ActiveRowPrimaryColumnValue все равно пустое!!!
Не понимаю куда повесить скрипт....

После BasePageLoadComplete пробовали?

PageLoadComplete -->> PageLoadComplete в родительский процесс -->> MyScript

Да, все точно так, просто сначала не понял, все заработало, спасибо.
Я просто сначала не понял, что надо сразу после перехвата PageLoadComplete пнуть родительский процесс, а потом уже после того как все отработает творить свои гнусности :smile:

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

Здравствуйте, и вновь работая в Bpm online 7 я наткнулся на проблему!
Подскажите пожалуйста как в дизайнере страницы в группу элементов добавить новые колонки.
При попытке добавления поля либо улетают куда то вниз, либо обходят группу элементов стороной)
ну, а если уж и получилось добавить поле то после сохранения оно просто отображается как самостоятельный объект)Как с этим бороться?)

Нравится

12 комментариев
var leftPanel = this.schema.leftPanel;
			for (var i = 0; i < leftPanel.length; i++){
				if (leftPanel[i].name == 'client') {
					leftPanel[i].items.push({
						type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
						name: 'AccountPaymentCondition',
						columnPath: 'AccountPaymentCondition',
						dataValueType: Terrasoft.DataValueType.LOOKUP,
						visible: true,
						advancedVisible: true,
						rules: [
							{
								ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
								autocomplete: true,
								baseAttributePatch: 'Supplier',
								comparisonType: Terrasoft.ComparisonType.EQUAL,
								type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
								attribute: 'Supplier'
							},
							{
								ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
								autocomplete: true,
								baseAttributePatch: 'Account',
								comparisonType: Terrasoft.ComparisonType.EQUAL,
								type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
								attribute: 'Account'
							}
						]
					});
					continue;
				}
			}

Ольга, спасибо за код, но мне кажется что в дизайнере процессов не зря есть раздел Группа элементов и она как минимум должна работать)), и да, мне кажется что данный код должен размещаться в базовом объекте, а его редактирование запрещено))
Если я не прав укажите пожалуйста куда разместить данный код!
С уважением Беляев Юрий.

Не совсем понимаю, при чем тут дизайнер процессов, но вот что я имела ввиду:
У меня есть страница редактирования договора, в ней есть группа Клиент, в нее я добавляю поле. Для этого я создаю новую схему через меню кнопки добавить пункт "Замещающую клиентсткий модуль". Чтобы не удалились уже существующие элементы в схеме, а только добавились новые, я использую метод push. Ниже полный код моей замещающей схемы:

define('ContractPage', ['ext-base', 'terrasoft', 'sandbox', 'Document',
	'DocumentModule', 'ContractPageStructure', 'ContractPageResources', 'ConfigurationEnums',
	'BusinessRuleModule', 'BaseFiltersGenerateModule', 'MoneyModule', 'ConfigurationConstants'],
	function(Ext, Terrasoft, sandbox, Document, DocumentModule, structure, resources, ConfigurationEnums,
	         BusinessRuleModule, BaseFiltersGenerateModule, MoneyModule, ConfigurationConstants) {
		structure.userCode = function() {
			var leftPanel = this.schema.leftPanel;
			for (var i = 0; i < leftPanel.length; i++){
				if (leftPanel[i].name == 'client') {
					leftPanel[i].items.push({
						type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
						name: 'AccountPaymentCondition',
						columnPath: 'AccountPaymentCondition',
						dataValueType: Terrasoft.DataValueType.LOOKUP,
						visible: true,
						advancedVisible: true,
						rules: [
							{
								ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
								autocomplete: true,
								baseAttributePatch: 'Supplier',
								comparisonType: Terrasoft.ComparisonType.EQUAL,
								type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
								attribute: 'Supplier'
							},
							{
								ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
								autocomplete: true,
								baseAttributePatch: 'Account',
								comparisonType: Terrasoft.ComparisonType.EQUAL,
								type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
								attribute: 'Account'
							}
						]
					});
					continue;
				}
			}
			leftPanel.push({
				type: Terrasoft.ViewModelSchemaItem.GROUP,
				name: 'paymentsumm',
				caption: resources.localizableStrings.PaymentSummGroupCaption,
				visible: true,
				collapsed: false,
				wrapContainerClass: 'control-group-container',
				items: [
					{
						type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
						name: 'PaymentDate',
						columnPath: 'PaymentDate',
						dataValueType: Terrasoft.DataValueType.DATE,
						visible: true
					},
					{
						type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
						name: 'PaymentAmount',
						columnPath: 'PaymentAmount',
						dataValueType: Terrasoft.DataValueType.FLOAT,
						visible: true,
						advancedVisible: true
					},
					{
						type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
						name: 'PrimaryPaymentAmount',
						columnPath: 'PrimaryPaymentAmount',
						dataValueType: Terrasoft.DataValueType.FLOAT,
						visible: true,
						customConfig: {
							enabled: false
						},
						dependencies: ['CurrencyRate', 'PaymentAmount'],
						methodName: 'RecalcPaymentAmount'
					}
				]
			})
 
			this.methods.RecalcPaymentAmount = function() {
				MoneyModule.RecalcBaseValue.call(this, 'CurrencyRate', 'PaymentAmount', 'PrimaryPaymentAmount');
			};
		};
 
		return structure;
	});

Ольга, прошу прощение, это моя ошибка! я написал в дизайнере процессов, а на самом деле имел виду
Дизайнер страницы в Bpm online 7), но не чего страшного код мне тоже пригодится)

Кстати да! Присоединяюсь к вопросу! Имею у себя аналогичную проблему! Поля "прыгают" по странице как хотят.

Тема попала не в тот раздел. Это 2-ой Террасофт, а нужно BPMonline. Как и соседняя тема этого же автора.

Оо, вчера был случай)), после добавления Группы элементов "Налоги" мне добавило около 200 групп)) Одна в одной) типа: Налоги -->Налоги-->Налоги .... Налоги N-количество)

"Наталия П." написал:Кстати да! Присоединяюсь к вопросу! Имею у себя аналогичную проблему! Поля "прыгают" по странице как хотят.

Наталья, пожалуйста, продемонстрируйте скрин-шотами.

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

создаю новую группу

Начинаю туда добавлять поля :

Передвигаю поле внутрь группы :
Потом добавляю следующее поле :
И вот уже предыдущее поле "вылетело" из группы :

И так далее... Любое последующее добавление поля на экран приводит к очередному "вылету" уже добавленных в группу полей в часть экрана ВНЕ группы. И не факт, что эти поля удастся потом обратно в группу поставить. Они иногда просто "перескакивают" группу - ставятся выше нее. Или вообще нет реакции на стрелки. Причем я не вижу никакой последовательности/логики. Один раз будет так, другой раз как-то по другому.

Ну и вот еще пример... Вот как выглядит страница в режиме Page Designer :

И вот она же в режиме Edit :

Причем сколько раз я зайду в режим Page Designer, столько раз у меня будет дублироваться строка. Могу показать и с 10-ю строками....

Причем это поле - родное для системы, не мною созданное....

Спасибо за подробную инструкцию, передал в отдел разработки для анализа.

Здравствуйте, столкнулся с той же проблемой и нашел решение!)
Дело в том что при установке на более старые версии windows 2003 server и тд, (не выше Windows 2008 r2) web компоненты находящиеся в iis неполные! все что нужно сделать это запустить web установщик iis и установить все что касается iss and Asp! так как 7 версия работает в новом интерфейсе и компонентов для ее запуска не хватает она не выполняет свои функции на полную и из-за этого часто не работаю БП и групповые элементы ну и еще всякая мелочь) Так что не нужно обращаться к силам зла) танцевать с бубнами а просто почитайте тех документацию по установке Bpm 7) там подробно описано какие компоненты iss нужны для Bpm! если что то не понятно обращайтесь опишу процесс установки по подробней)

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

Здравствуйте, помогите пожалуйста решить задачу.
Мне нужно отредактировать базовую карточку контрагента.
Мои действия:
Я создал заменяющую карточку для контр агента где указал в родительскую страницу контрагент.
В замещающей карточки отредактировал так как мне нужно было, изменил название полей и добавил новые, также описал скрипт по сокрытию полей в зависимости от типа контрагента, и вот уже добавлял поля в новом интерфейсе и при тестировании увидел что скрипт не выполняется.
Скажите пожалуйста, можно ли объединить базовую и замещающую карточки между собой что бы в новом интерфейсе работал скрипт или нужно это делать каким то иным способом??
Если нужна какая либо доп. информация, пишите, предоставлю все необходимое!
Заранее огромное спасибо.

Нравится

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

Юрий, добрый день.

Объединять карточки не нужно, по умолчанию система будет использовать замещающую карточку (+ логика из её родительской карточки).
Если скрипт не отрабатывает, скорее всего Вы допустили в нем ошибку.
Можете предоставить листинг?

Заранее спасибо!

Опять тема сохранена не в том разделе. :)
По своему опыту могу сказать, что менять в Setting-ах внешний вид карточек для BPM7 нет смысла. Они все равно будут выглядеть так, как и были сформированны ранее. Изменения делаются только через Page Designer на самой странице.

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

Как сделать так , чтобы при переходе по записям основного реестра, кнопки редактирования на Детали меняли свою доступность(Enabled) в зависимости от значения логического поля записи в основном реестре
Если у записи установлен флаг Заблокирован, то менять содержимое Детали нельзя
1 ая мысль: по событию "Активная строка сменена" в основном реестре в скрипте обращаться к кнопкам редактирования Детали и менять их состояние на неактивное

Нравится

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

Здравствуйте, Ольга!

Я бы рекомендовала попробовать выполнить эту доработку следующим образом:

В странице раздела подписаться на событие DetailsTabPanelTabChange, вычитывать на этом этапе активную деталь:

var detailsTabPanel = Page.PageContainer.FindPageControlByName("DetailsTabPanel") as Terrasoft.UI.WebControls.Controls.TabPanel;
var activeTab = detailsTabPanel.Tabs[detailsTabPanel.ActiveTabIndex];

и если это Ваша - отключать контролы:

var detailButtonContainer = (detailPageContainer.FindPageControlByName("ButtonsControlLayout"));
detailButtonContainer.Enabled = false;
//или так
//	script += string.Format("{0}.setEnabled(false);", detailButtonContainer .ClientID);

Анна, спасибо,воспользовалась вашим кодом, но сделала чуть по другому:
В странице раздела подписалась на событие GridActiveRowChanged, в скрипт вставила ваш код

var treeGrid = Page.Grid.FindPageControlByName("TreeGrid") as TreeGrid;
bool bl = treeGrid.DataSource.ActiveRow.GetTypedColumnValue<bool>("IsBlocked");
 
var detailsTabPanel = Page.PageContainer.FindPageControlByName("DetailsTabPanel") as Terrasoft.UI.WebControls.Controls.TabPanel;
int activetabindex = detailsTabPanel.ActiveTabIndex;
if(activetabindex==1)
{
	var activeTab = detailsTabPanel.Tabs[detailsTabPanel.ActiveTabIndex];
	var detailButtonContainer = (activeTab.FindPageControlByName("AddButton"));
	if(bl) detailButtonContainer.Enabled = false;else detailButtonContainer.Enabled = true;
}

Но когда начинаю обращаться к активной строке,

bool bl = treeGrid.DataSource.ActiveRow.GetTypedColumnValue<bool>("IsBlocked");

к конкретному полю, вылетает NullReferenceException
Как в этом случае правильно обратиться к значению, возможно из параметров события

такаяже задача и таже проблема.

Page.DataSource.ActiveRow = null

Как еще можно получить текущую запись?

Здравствуйте, Илья!

Уточните, пожалуйста, на каком событии Вы пытаетесь это сделать и для какой страницы? Возможно, в момент, когда Вы обращаетесь к Page.DataSource.ActiveRow данные в реестр еще не загружены.

Попыток делалось много.
1. Страница раздела. событие RefreshDetails

var treeGrid = Page.Grid.FindPageControlByName("TreeGrid") as TreeGrid;
if (treeGrid.DataSource.ActiveRow == null)
{
return true;
}

или так

var dataSource = GetActiveDataSource();
if (dataSource .ActiveRow == null)
{
return true;
}

2. Страница реестра. событие DataSourceActiveRowChanged, Button1Click (добавил кнопку для теста)

if (Page.DataSource.ActiveRow == null)
{
return true;
}

во всех этих случаях ActiveRow = null

Илья, у меня заработало следующим образом

var treeGrid = Page.Grid.FindPageControlByName("TreeGrid") as TreeGrid;
bool b = (bool)treeGrid.SelectedNodes[0].Values["IsBlocked"];

т.е. обращаться к выбранной строке грида

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

Вот реализовал таким образом:

var dataSource = GetActiveDataSource();
 
var select = new Select(UserConnection)
                .Column("Affiliation","AffiliationTypeId")
             .From("Affiliation")
             .Where("Affiliation", "Id").IsEqual(Column.Const(dataSource.ActiveRowPrimaryColumnValue))
			 as Select;
 
var affType = select.ExecuteScalar<Guid>();
 
 
var userID = UserConnection.CurrentUser.Id;
 
var isEdit = false;
switch (affType.ToString()) {
	case //Gruppa klientov --All users
		isEdit = true;//everybody can edit
	break;
	case  //Struktura --ORM only
		isEdit = IsUserInGroup(userID, ORmid);
	break;
	default:
		isEdit = IsUserInGroup(userID, Sid);
	break;
}	
Page.DetailsTabPanel.SetVisible(isEdit);
 
return true;
Показать все комментарии
Обновление детали
Технические вопросы
5.x

В разделе Контрагенты добавляю новую вкладку в нее добавляю PageContainer2 со страницей "Страница реестра контрагентов" и опубликовываю.

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

И если зайти отладчиком то видно следующее:
в модуле BaseGridPage в процедуре

public virtual bool DataSourceActiveRowChangedScriptTaskExecute(ProcessExecutingContext context) {
  ActivateButtons(true);
  if(IsDetailGrid) {
        return true;
  }
  ListenerThrowEvent(ListenerPageProcessUId, "GridActiveRowChanged");
  return true;
}

ListenerPageProcessUId равен null
соответственно Event дальше не передается.

Вопрос, что я делаю не так, и как заставить обновляться детали?

Нравится

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

"Илья Т." написал:В разделе Контрагенты добавляю новую вкладку в нее добавляю PageContainer2 со страницей "Страница реестра контрагентов" и опубликовываю.

Как Вы это делаете?

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

Maxim Gritsenko

Большое спасибо. Сделал через рабочие места и все заработало. Но почему не работает через конфигурацию? Непонятно (.

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

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