Есть группа пользователей, которая входит в "Все сотрудники компании". Я удаляю права доступа этой группе на все записи раздела, а после выдаю права на некоторые записи (БП). Но пользователи этой группы видят все записи, т.к. права всех сотрудников не меняются. Как дать права на определенные записи раздела данной группе, не затрагивая права всех пользователей?

Нравится

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

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

Подскажите как добавить роль, которая не будет входить в "Все сотрудники компании"? И почему у меня может не быть возможности добавить роль в группу "Все пользователя портала"? Кнопки добавить организацию/подразделение не доступны (даже Supervisor'у).

Роль "Все сотрудники компании" является родительской, все остальные подчиненные. Но это не значит, что права будут применяться для всех сотрудников, если настраиваете их для определенной роли. Вы можете раздавать права нужной Вам роли, при этом это никак не отразится на роли "Все сотрудники компании". Что касается роли "Все пользователи портала", то данная роль работает только в продуктах линейки Service, так как портал есть только там.
Для большего понимания настройки прав доступа в системе рекомендую посмотреть видеоролик: https://www.youtube.com/watch?v=x5C6VcOhKj4&feature=youtu.be&list=PLDp-…

"Сафонов Олег" написал:Подскажите как добавить роль, которая не будет входить в "Все сотрудники компании"? И почему у меня может не быть возможности добавить роль в группу "Все пользователя портала"? Кнопки добавить организацию/подразделение не доступны (даже Supervisor'у).

Олег, добавить роль на одном уровне с "Все сотрудники компании" можно только инсертом в базу данных. Лучшим вариантом будет настройка механизма раздачи прав по умолчанию на записи + настройка БП, который бы изменял права по необходимости.

В портальных пользователях иерархия вообще отключена, поэтому добавить туда дочернюю группу не выйдет. Насколько мне известно, включение структуры портальных пользователей произовйдёт в одном из будущих релизов bpm'online.

Настраивал права и для подчиненной роли, входящей в "Все сотрудники компании", и на одном уровне со всеми сотрудниками (инсертом). Если открыть Действия - Настроить права доступа на карточке - там нету группы, для которой были настроены права, но записи все-равно видны.
Роли актуализировал. Галочка "Администрируется по записям" стоит.

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

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

"Адасюк Валерий Викторович" написал:

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

Прикрепленный файлРазмер

skripty.zip
2.47 кб


На примере раздела продукты:
- убрал права у всех сотрудников компании на все записи раздела
- выполнил скрипт на перераздачу прав (благодаря чему права на все записи вернулись всем сотрудникам компании)
- раздал права на половину записей нужной мне группе пользователей
- снова выполнил скрипт на перераздачу прав (благодаря чему розданные мной права удалились)
Ну и собственно все осталось как есть. Группа видит все записи.
Перепробовал разные варианты, при перераздаче прав скриптом все возвращается на свои места.
Что я делаю не так?

Олег, данная ситуация требует индивидуального рассмотрения. Предлагаю перенести рассмотрение данного вопроса в рамках отдела технической поддержки, с последующим подключением к Вашему сайту. Напишите на адрес support@terrasoft.ru какие права, какой группе и на какой раздел нужно раздать, а также ссылку на сайт, о котором идет речь.

Здравствуйте! Интересует такой вопрос. Я сосдал учетную запись для Бухгалтера и в администрировании доступа к обекту выдал ему права на чтение Кто создает: Все сотрудники компании.
В итоге он начал видеть счета которые создаются после того как это правило создалось. Но мне нужно чтобы он видел и счета которые были раньше создани, а не только начиная с сегодня 16-30. Можна ли както сделать чтобы бухгалтер смог видеть счета например с 01.07.2016 не выдавая ему админские права на доступ.

Николай, добрый день.

Все администрируемые права доступа по записям применяются на записи созданные только после настройки прав доступа, о чем написано в документации (первый абзац) -

https://academy.terrasoft.ru/documents/sales-enterprise/7-8-0/detal-dos…

Для того, чтобы распространить права на существующие записи, есть несколько вариантов:

1) Запрос в БД - решается при помощи написания SQL-запроса
2) БП - бизнес-процесс, в котором есть элемент "Изменение прав доступа".

Детальнее о правах доступа Вы можете узнать здесь - https://www.youtube.com/watch?v=x5C6VcOhKj4&feature=youtu.be&list=PLDp-…

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

Добрый день.

Версия BPMOnline 7.2

Пытаюсь по пункту меню "Добавить" в детали открыть страницу выбора объектов.

В методе onClick пункта меню "Добавить" детали делаю так:

                        var lookupConfig = {
                                entitySchemaName: "BankingService",
                                columnName: "Name",
                                columns: ["ClientType"],
                                multiSelect: true
                        };
                        LookupUtilities.Open(
                                this.sandbox,
                                lookupConfig,
                                this.addBankingServiceItemsCallback,
                                this,
                                null,
                                false,
                                false
                        );

Однако при нажатии на пункт меню получаю бесконечно крутящийся значок "Загрузка" и ничего не происходит. В чем моя ошибка?

Буду благодарен за консультацию.

Нравится

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

Здравствуйте, Артем.

Предоставте полный листинг кода схемы для анализа.

Вот полный листинг кода детали

define('SynchronizedProductDetail', ['ext-base', 'terrasoft', 'SynchronizedProduct',
'SynchronizedProductDetailStructure', 'SynchronizedProductDetailResources', 'LookupUtilities'],
function(Ext, Terrasoft, entitySchema,  structure, resources, LookupUtilities) {
	var viewModel;
	structure.userCode = function() {
		this.entitySchema = entitySchema;
		this.name = 'SynchronizedProductDetailViewModel';
		this.editPageName = 'SynchronizedProductPage';
		this.columnsConfig = [
			{
				cols: 10,
				key: [
					{
						name: {
							bindTo: 'BankingService.Name'
						},
						type: 'title'
					}
				]
			}
		];
		this.loadedColumns = [
			{
				columnPath: 'Id'
			}, {
				columnPath: 'BankingService'
			}
		];
		this.modifyUtilsButton = function(utilsButton) {
			var utilsMenuItems = utilsButton.menu.items;
			//NOTE: Change Select button caption
			utilsMenuItems[1].caption = "Выбрать продукты";
			utilsMenuItems[1].enabled = {bindTo: "isProductChooseForSelection"};
			utilsMenuItems[1].click = {bindTo: "selectBankingServiceItems"};
			return utilsButton;
		};
 
		this.methods.setEntitySchema = function() {
			this.entitySchema = entitySchema;
		};
 
		this.methods.getSenderSandboxId = function() {
			return this.sandbox.id.replace('_detail_SynchronizedProduct', '');
		};
 
		this.methods.init = function() {
			viewModel = this;
			this.sandbox.subscribe("UpdateDetail", this.processUpdateDetailMessage, [this.getSenderSandboxId()]);
		};
 
		this.methods.processUpdateDetailMessage = function(arg) {
			viewModel.set('isProductChooseForSelection', arg.param);
		};
 
		this.methods.selectBankingServiceItems = function() {	
			var lookupConfig = {
				entitySchemaName: "BankingService",
				columnName: "Name",
				columns: ["ClientType"],
				multiSelect: true
			};
			LookupUtilities.Open(
				this.sandbox,
				lookupConfig,
				this.addBankingServiceItemsCallback,
				this,
				null,
				false,
				true
			);
		};
 
		this.methods.addBankingServiceItemsCallback = function(args) {
			console.log(args);
		};
	};
	return structure;
});

Здравствуйте, Артем.

Метод "LookupUtilities.Open" пятым параметром принимает контейнер, в который будет производиться рендер. Он не может быть null. Сделайте printscreen ошибки в консоли браузера.

Добрый день. Проблема в том, что в консоли браузера нет ошибок. Скриншот прилагаю.

Метод "LookupUtilities.Open" должен выглядеть следующим образом:

LookupUtilities.Open(sandbox, lookup.config, this.addBankingServiceItemsCallback, this, this.renderTo);

Сергей, я смотрел значение свойства this.renderTo с помощью

console.log(this.renderTo)

оно равно в этом случае undefined

И я пытался сделать так, как вы написали - ничего не меняется.

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

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

Добрый день!

При установке значения по умолчанию в поле типа DateTime (отображается только Time) - перестает загружаться вся карточка редактирования объекта. Пробовала устанавливать через системные настройки, но при задании системной настрой необходимо указать день + время, после она не отображается в списках настроек конкретного поля. При добавлении строгой константы и публикации - раздел перестает функционировать.
Возможно это связано с типом поля. Подскажите как это реализовать правильно?

Нравится

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

Здравствуйте, Евгения!

Вы можете задать значение по умолчанию непосредственно в объекте. Для того, чтобы подставлялось и дата, и время значением по умолчанию необходимо выбрать [#Системная переменная.Текущая дата и время#]

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

Добрый день
Допустим, у меня есть некий список записей в реестре КЕ. Теперь мне нужно обновить этот список : т.е. добавить в каждую запись определенное значение в поле "Внутренний Инвент.номер". Что я сделала:
1) создала шаблон, где указала только значения в поле "Инвент.номер" и "Внутренний Инвент.номер"
2) пытаюсь закачать шаблон т.обр., чтобы система нашла по "Инвент.номер" нужные записи КЕ и в них заполнила поле "Внутренний Инвент.номер":

В итоге: у меня создается новая запись КЕ, т.е. имеющаяся не обновляется. Что не так я делаю?

Нравится

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

Здравствуйте, Вы пишите что создали шаблон, и указали там “Инвент.номер”, в то же время, видно что колонка в объекте, для идентификации записи называется “Инв. номер”.

Необходимо что бы имя поля совпадало 1 к 1, то есть, что бы в шаблоне было написано не “Инвент.номер” а именно “Инв. номер”.

Рекомендуем не создавать шаблоны самостоятельно, а пользоваться кнопкой “Скачать шаблон” после того как Вы выберете объект. Там заголовки колонок будут названы корректно.

Если проблема повторится и после указания верного заголовка, обратитесь в support@terrasoft.ru с предоставлением доступа к вашему сайту.

Добрый день
Я именно скачала Шаблон, в нем поле указано "Инв.номер". Я обратилась по этому вопросу в техпод Террасофт

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

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

Версия 7.7.0.2293

В раздел Документы по аналогии с разделом Счета добавил мультивалютное поле (код страницы в приложении).

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

Подскажите пожалуйста в чем дело?

Нравится

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

Здравствуйте! Сверьте, пожалуйста, код. Затем попробуйте отладить код в консоли и посмотреть на каком моменте происходит свал. Если не получиться решить вопрос, то прикрепите с крин с ошибкой.

Добрый день.
Я думаю что данное поведение наблюдается из-за того что в модуле MultiCurrencyEditUtilities в методе onCurrencyMenuItemClick грубо идет запись в поле Currency, т.е. если если у вас есть префикс Usr и т.п. то оно не сработает. Я сталкивался с данной проблемой и т.к. нужно было добавить мультивалютное поле в пользовательский раздел то помогло замещение данного модуля и переопределение метода следующим образом(лучше было конечно взять префикс с системной настройки, а не грубо забивать):

onCurrencyMenuItemClick: function(menuItem) {
			var currency = this.get("CurrencyRateList").find(menuItem);
			var prefix = "Usr";
			if(this.entitySchemaName.substring(0, prefix.length) == prefix) {
				this.set(prefix + "Currency", currency);
			} else {
				this.set("Currency", currency);
			}
		}

В случае с документами это возможно вам не поможет, но хоть будете знать куда смотреть)

Илья, ошибок не было.

Роман, спасибо навели на решение, добавил виртуальную колонку Currency, когда она изменяется устанавливаю значение в UsrCurrency:

attributes: {
...
    "Currency": {
		"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"dataValueType": this.Terrasoft.DataValueType.LOOKUP,
		"lookupListConfig": {
			"columns": ["Division"]
		},
		"dependencies": [
			{
				"columns": ["Currency"],
				"methodName": "onVirtualCurrencyChange"
			}
		]
    }
},
methods: {
...
	onVirtualCurrencyChange: function() {
		var currency = this.get("Currency");
		this.set("UsrCurrency", currency);
	}
}

Помогите разобраться. Делал на версии платформы 7.8. Вроде как-то работает, но не то что-то.

1) Название поля получилось не "Сумма, р.", а "500, р." именно цифрами сумма:

2) Как исправить логику пересчета суммы в валюте в сумму в б.в.

Курс валюты пишет хххх EUR = 1 руб, а должно быть наоборот ххх руб. = 1 EUR... как результат и считает в обратную строну - т.е. сумма в б.в. получается меньше чем сумма в валюте (в случае с евро).

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

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

Первым делом посмотрел в конфигурации - все на месте:

Скомпилировал, вышел, почистил кеш Цклинером, зашол, открываю карточку но поля не появились.
База ондеманд 7.х
Спасибо за помощь

Нравится

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

Если поля есть в объекте, значит их уже будет видеть мастер раздела как существующие, попробуйте снова добавить их в карточку через следующее контекстное меню:


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

Проблему решил, немного по другому. У меня было два поля Город(хотя один назывался - City, а другой - UstCity). Подумал в этом ошибка, удалил поле из объекта и вручную удалил поле из страницы редактирования - все поля появились. Странно что ошибки не выбило никакой...

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

Здравствуйте.
Почему-то не создается активность при создании нового лида.

Но когда запустить вручную - создается.

И тут проблема не в сигнале, ибо вот тут сигнал срабвтывает и БП работает.

В чем может быть проблема?
Спасибо.

Нравится

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

Добрый день!

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

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

Сегодня утром еще раз запустил - все работает. Видимо нужно было одну ночь подождать)

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

Задаю довольно таки распространенный вопрос, как ни странно, я не нашел подобной темы.
Допустим есть поле статус, при его изменении должно автозаполняться другое поле - дата(возможно текстовое или даже справочник). И сразу усложню задание, изменения должны вступить в силу когда поле статус меняет одно конкретное значение в другое(например из "В работе" в "Выполнено").
BPMonline 7.x
Заранее спасибо.

Нравится

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

Есть кто живой и знающий?

Здравствуйте, данный кейс решается стандартной подпиской на событие. И выполнением интересующей Вас логики по событию.

Подписка на событие в том или ином виде проскакивала на форуме, к примеру:
http://www.community.terrasoft.ua/forum/topic/13908

А по скольку Вы говорите про статусы "В работе", "Выполнено" могу предположить что речь идет про карточку активности, а в ней уже есть, если посмотреть исходный код, в родительских схемах, атрибут:

"Status": {
  "isRequired": true,
  lookupListConfig: {
    columns: ["Finish"]
  },
  dependencies: [
    {
      columns: ["Status"],
      methodName: "onStatusChanged"
    }
  ]
},

В котором задан метод "onStatusChanged" на изменение данной колонки, и метод этот уже написан, достаточно его переопределить, и дописать недостающей логики.

К примеру:

define("ActivityPageV2", ["ActivityPageV2Resources", "GeneralDetails"],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
		]/**SCHEMA_DIFF*/,
		attributes: {
			"StatusValue": {
				dataValueType: this.Terrasoft.DataValueType.TEXT
			}
		},
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				var statusValue = this.get("Status");
				this.set("StatusValue", statusValue);
			},
			onStatusChanged: function() {
				this.callParent(arguments);
				var oldStatus = this.get("StatusValue");
				var statusValue = this.get("Status");
 
				console.log("был: " + oldStatus.displayValue + ", стал: " + statusValue.displayValue);
				// тут любая логика проверки, и установки
				if (oldStatus.displayValue === "Не начата" && statusValue.displayValue === "В работе") {
					this.set("DetailedResult", "Взята в работу");
				}
 
				this.set("StatusValue", statusValue);
			}
		},
		rules: {},
		userCode: {}
	};
});

"Щиголь Максим" написал:А по скольку Вы говорите про статусы "В работе", "Выполнено" могу предположить что речь идет про карточку активности

Это карточка заказа, нужно поставить дату окончания(текущую дату) в определенное поле когда статус стает определенным значением. Не знаю как это работает но у меня выбивает ошибку, с помощью вывода данных в консоль определил что выбивает на
"Щиголь Максим" написал:this.set("StatusValue", statusValue);

подумал раз это поле то и тип должен быть не DataValueType.TEXT а DataValueType.LOOKUP, но ничего не помогло, этот код: var statusValue = this.get("Status"); срабатывает(вывожу в консоль данные из statusValue)

this.set("StatusValue", statusValue);

В данном месте ошибка может быть только по двум причинам:

1) неправильный контекст выполнения.
2) проблемы с аттрибутом StatusValue.

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

Получилось, поменял местами немного, написал так:
this.set("StatusValue", statusValue.displayValue);
а в остальных местах пользовался просто statusValue и oldStatus

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

Версия BPMOnline 7.2

Простая задача: в зависимости от чекбокса на основной карточке разрешить или запретить добавление элементов в деталь.

1. В коде основной карточки:

добавим чекбокс на страницу

{
                                        type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
                                        name: 'IsProductChoose',
                                        columnPath: 'IsProductChoose',
                                        dataValueType: Terrasoft.DataValueType.BOOLEAN,
                                        visible: true,
                                        customConfig: {
                                                click: {
                                                        bindTo: "IsProductChooseClicked"
                                                }
                                        }
                                }

обработчик изменения чекбокса

this.methods.IsProductChooseClicked = function() {
                       
                        var args = {
                                param: this.get("IsProductChoose")
                        };
                        sandbox.publish(
                                "IsProductChooseChanged",
                                args,
                                [sandbox.id]
                        );
                };

2. В коде детали:

изменим конфиг выпадающего меню

this.modifyUtilsButton = function(utilsButton) {
                        var utilsMenuItems = utilsButton.menu.items;
                       
                        utilsMenuItems[1].caption = "Выбрать продукты";
                        utilsMenuItems[1].enabled = {bindTo: "isProductChooseForSelection"};
                        return utilsButton;
                };

обработчик "включить/выключить пункт меню"

this.methods.isProductChooseForSelection = function() {                
                        this.sandbox.subscribe("IsProductChooseChanged", function(arg) {
                                console.log(arg);
                        }, this, [this.getSenderSandboxId()]);
                };
               
                this.methods.getSenderSandboxId = function() {
                        return this.sandbox.id.replace('_detail_SynchronizedProduct', '');
                };

Однако при открытии карточки получаю ошибку в консоли браузера:
Uncaught Terrasoft.UnsupportedTypeException: Message IsProductChooseChanged is not defined in undefined module

К сожалению в документации не описано как работать с событиями через sandbox.

Буду благодарен за консультацию.

Нравится

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

как раз недавно обсуждались сообщения: http://www.community.terrasoft.ru/forum/topic/15210
по версиям, насколько я знаю, отличий нет

К сожалению, отличия есть. В 7.2 как минимум нет такого объекта Terrasoft.MessageMode.PTP

Для BPM'Online 7.2 Вы можете воспользоваться уже существующими месседжами, к примеру "UpdateDetail".

Вот пример кода для общения страницы "Контакт" с деталью "Средства связи". Код для страницы контакта в методе "init":

var moduleId = sandbox.id + '_detail_communications';
            this.on("change:Name", function(){
                if(this.get("Name") === "Some name"){
                    sandbox.publish('UpdateDetail', null, [moduleId]);
                }
            });

Код в методе "init" детали:

var moduleId = sandbox.id;
            sandbox.subscribe("UpdateDetail", function() {
                alert("GOAL!")
            }, [moduleId]);

Данный код тестировался для версий 720 и 722. Основное условие работоспособности - идентичность содержания переменной moduleId как для модуля так и для страницы редактирования.

Спасибо большое, все получилось. А не подскажете - для того, чтобы использовать свои месседжи - необходимо писать свой модуль?

Да, в версии 7.2 создавать месседжи можно только в модулях.

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

Добрый день
Подскажите, пожалуйста, как лучше сделать логику заполнения поля в карточке КЕ:
нужно, чтобы поле содержало строго 10 символов (или цифр?), при заполнении этого поля должна быть проверка на уникальность (значения этого поля не должны повторяться).
Примеры заполнения поля: 0000000001, 0000000002, ..., 0000000011, ....

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

Нравится

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

Здравствуйте, Татьяна!

С примером настройки автонумерации в 5.x вы можете ознакомиться в этом посте - ссылка.

Подскажите, пожалуйста, как на с# сделать проверку поля, чтобы в нем было не более 10-ти символов?

Проверку можно сделать на нажатии ОК в карточке. Как здесь, только без вопроса.

понятно. А на С# как написать, как подсчитать кол-во символов?

А если надо, чтобы первые две цифры в значении поля были 69, как можно написать условие проверки на С#?

В MSDN описана работа со строками в C#, смотрите там.

Решила сделать сист.настройку "Текущий номер КЕ" (числовое, не кешируется. Наименование - KELastNumber), без маски номера.

В дизайнере процессов Конф.единица делаю:

Сохранила, опубликовала без ошибок.
При создании новой КЕ - в поле ITNumber (в котором и должен подставляться текущий номер) вообще нет никаких значений. В чем моя ошибка, подскажите, пожалуйста.

// не поняла, должна ли в схеме "Сгенерировать номер по порядку" указываться моя новая системная настройка KELastNumber и где именно указывается связь этой настройки с полем ITNumber в карточке КЕ

Татьяна, смотрите, как сделано в других разделах и делайте всё аналогично.
Если не хотите аналогично, изучайте схему «Сгенерировать номер по порядку», переделывайте её по-своему.
По стандартной логике, название системных настроек должно быть совпадающим с названием схемы плюс «LastNumber» и «CodeMask» соответственно.

Я хочу воспользоваться станд.логикой, смотрю, как сделано в других разделах. Изменила название своей новой сист.настройки ConfigurationItemLastNumber (чтобы соответствовала станд.логике), добавила сист.настройку маска номера КЕ (ConfigurationItemCodeMask). Все равно не работает, ничего в поле ITNumber в карточке КЕ не записывает. Подскажите, пожалуйста, на что еще обратить внимание?

нужно ли чистить Redis?

Да, попробуйте очистить Redis и профиль.

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

Добрый день.
Решили не использовать маску номера, а сделать проверку на уникальность: т.е. значение цифрового поля не должно повторяться (не обязательно следующее должно быть больше на 1). Подскажите, пожалуйста, как это сделать? Заранее спасибо

Такую функциональность вообще можно реализовать на уровне СУБД.

1. В bpm'online создайте системную настройку, в которой будет храниться номер последней созданной записи.
2. Потом на уровне СУБД реализовать триггер, который будет срабатывать на добавление новой записи. В этом триггере нужно считывать номер из системной настройки, вычислять значение нового номера = номер из системной настройки + 1, устаналивать его в нужное поле в таблицу и обновлять значение системной настройки новым номером.

мне не нужно хранить номер последней записи, т.к. к ней не нужно добавлять +1.
Мне нужно сделать проверку на уникальность, т.е. новая запись в этом поле должна быть не равна имеющимся.

Татьяна, чтобы сделать проверку на уникальность, можете на нажатии OK в обработчике сделать запуск Select, который ищет в разделе записи с таким же значением. И если находит таковых больше нуля, показывать пользователю сообщение. А если таких нет — запускать базовую логику кнопки OK, которая проведёт сохранение и закрытие карточки.

В системе есть похожие проверки с помощью Select? Если -да, то где я могу их посмотреть?

Правильно понимаю?:

var select = new Select(userConnection)
.Column("%Имя колонки Инвент.номер%")
.From(%раздел КЕ%)
.Where(Column.Const("%Имя колонки Инвент.номер%")).IsEqual(%Введенный Инвент.Номер%);

А IsEqual(%Введенный Инвент.Номер%) - здесь что имеется в виду?

Нет, неправильно. В Const передавать значение, а не название поля.

в Const передавать значение: это значение ч/з Guid получать?

и еще вопрос: не поняла, select – это что будет? Да или НЕТ? Т.е. как я пойму, что в таблице найдены значения колонки?

Татьяна, класс Select — это представление обычных SQL-запросов. Напишите сначала запрос в СУБД, убедитесь, что он работает правильно и возвращает что нужно, и тогда переписывайте на C#.

// выбираю все записи в КЕ, где значение колонки ITNumber равно конкретному значению, выбранному не из справочника.

// На обработчике нажатии ОК в карточке КЕ:

var text = Page.ITNumberEdit.Value;

var select = new Select(userConnection)
.Column(Column.Asterisk())
.From("ConfigurationsItem")
.Where(Column.Const("text")).IsEqual("ITNumber");

// дальше нужно сравнивать, найдено или нет такое же значение?

Не забудьте также, что при редактировании записи (а не созании новой) в базе уже будет запись с таким кодом. То есть в запросе нужно отбросить запись с Id как у записи, открытой в карточке.

И кавычки вокруг text лишние.

Подскажите, пожалуйста, каким методом на С# можно сравнить, найдено или нет такое же значение?

Татьяна, напишите сначала SQL-запрос, который удовлетворяет нужную потребность, затем переведите на C#. Поскольку проверяется только факт наличия или отсутствия, лучше вытягивать не все колонки, а только Id.

Затем делаете чтение из Select и если в нём было хотя бы значение, то одно, если нет — то другое.

using (var dbExecutor = UserConnection.EnsureDBConnection()) {
	using (IDataReader dr = select.ExecuteReader(dbExecutor)) {
		if (dr.Read()) {
			//do something
		} else {
			//do something else
		}
 
	}
}

Посмотрите многочисленные примеры в конфигурации, там Select используется часто.

var text = Page.ITNumberEdit.Value;

SELECT *
FROM ConfigurationsItem
WHERE ITNumber = text;

так?

var text = Page.ITNumberEdit.Value;

SELECT Id
FROM ConfigurationsItem
WHERE ITNumber = text;

так?

Татьяна, ну возьмите базу и проверьте.

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

Не забудьте также, что при редактировании записи (а не созании новой) в базе уже будет запись с таким кодом. То есть в запросе нужно отбросить запись с Id как у записи, открытой в карточке.

Добрый день

var select = new Select(UserConnection);
- ошибка "имя UserConnection отсутствует в текущем контексте" исчезла.

осталось две ошибки

Татьяна, почитайте текст сообщения. Оно требует подключения нужного using (пространства имён).
Они подключаются в дереве элементов БП. Какого именно — можно помотреть в аналогичных случаях других карточек, где есть работа с классом Select.

Открыла исх.код на странице редактирования Конф.единицы - там нет using Terrasoft.Core.DB.Query;
Заходила в каждый элемент БП страницы редактирования Конф.Единицы и объекта Конф.единица - не нашла, где идет подключения using. Не там смотрю?

Using в дереве справа в редакторе процессов БП. Откройте любой другой аналогичный процесс и посмотрите, что подключать.

добавила в Usings:
Пространство имен: System.Data.IDataReader
Псевдоним: IDataReader

При опубликовании осталась только одна ошибка:

Если добавить в Using : Terrasoft.Core.DB.Query, то при опубликовании выходит ошибка о том, что Terrasoft.Core.DB.Query является типом, а не пространством имен.

Добавьте лучше Terrasoft.Core.DB

Terrasoft.Core.DB - это я уже добавила ранее

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

смотрела на странице редактирования карточки задачи, инцидента, запроса на изменение - все тоже самое, что и здесь. Подскажите, где еще можно уточнить? Может быть, какие -нибудь ссылки на документацию по С# ?

Либо не добавлено нужное Using, либо добавлено ненужное, либо опечатки в коде.
Раз везде работает, а тут нет, значит, не то же самое.
Попробуйте сравнить существующий код с новым, скопировать из существующего.
Документация по работе с Select.

В документации:
Select.ExecuteReader(DBExecutor) - метод
Terrasoft.Core.DB - пространство имен > Select - класс > ExecuteReader - метод : ExecuteReader(DBExecutor) - метод

в Using у меня указано Terrasoft.Core.DB

Тем не менее при опубликовании выходит ошибка:

Не знаю, может у Вас там в названии «ExecuteReader» нелатинские буквы оказались?

все латинское - проверяла.

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

Нет, ошибка сохраняется:

Причем, если я напишу "Execute" вместо «ExecuteReader», то ошибка уже:


Можно ли каким-нибудь другим способом выполнить проверку на уникальность значения поля?

Можно настроить уникальность на уровне базы.

Написала на обработчике нажатия ОК, после чего откомпилировалось без проблем:

var recordId = new Guid(Page.GetParameterValue("recordId").ToString());
var text = Page.ITNumberEdit.Value;

/*var select = SELECT ("recordId")
.FROM ("ConfigurationsItem")
.WHERE (("ITNumber" = text)&&("Id" != recordId));*/

var select = new Terrasoft.Core.DB.Select(context.UserConnection)
.Column(Column.Asterisk())
.From("ConfigurationsItem")
.Where(Column.Const(text)).IsEqual("ITNumber") as Terrasoft.Core.DB.Select;

using (var DBExecutor = UserConnection.EnsureDBConnection())
{
using (var reader = select.ExecuteReader(DBExecutor))
{
if (reader.Read())
{
//do something
Page.BaseMessagePanel.AddMessage(Warning, "Внутр.инвент.номер (ИТ) должен быть уникальным! ", MessageType.Warning);
return false;
}

else

IsServicesClosing = false;
var configurationItem = Page.DataSource.ActiveRow as Terrasoft.Configuration.ConfigurationItem;
if (configurationItem == null || configurationItem.StatusId == configurationItem.GetTypedOldColumnValue("StatusId")) {
return true;
}

if (!SetWrittenOffOnEditEnabled()) {
var entitySchemaManager = Page.Schema.SchemaManagerProvider.GetManager("EntitySchemaManager") as EntitySchemaManager;
var schema = entitySchemaManager.GetInstanceByName("ServiceInConfigurationItem");
var entitySchemaQuery = new EntitySchemaQuery(entitySchemaManager, schema.Name);
var idColumn = entitySchemaQuery.AddColumn(schema.PrimaryColumn.Name);
entitySchemaQuery.Filters.Add(entitySchemaQuery.CreateFilterWithParameters(
FilterComparisonType.Equal, "ConfigurationItem", configurationItem.Id));
var collection = entitySchemaQuery.GetEntityCollection(UserConnection);
IsServicesClosing = collection.Count > 0;
}
}}
return true;

Но если изменили поле ITNumber в карточке КЕ и хотим сохранить карточку, то система выдает ошибку:

Это значит, что у Вас в конфигурации нет объекта «ConfigurationsItem».

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

var recordId = new Guid(Page.GetParameterValue("recordId").ToString());

Подскажите, пожалуйста, как это учесть в Select ?

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