7.x
Технические вопросы

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

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

Версия 7.7.0.2325

Нравится

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

Добрый день!

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

Пример Вы сможете найти в хранимых процедурах FindAccountDuplicate(для контрагента) и FindContactDuplicate(для контакта)).

В случае возникновения дополнительных вопросов прошу обращаться на support@terrasoft.ru

Хотелось бы узнать, что нужно переопределить на клиентской части, что бы стандартный поиск дублей работал в разделе продукты.
Насколько я понял "главной" является схема DuplicatesPageV2, можно ли кратко описать принцип работы, чтобы я знал что искать. И есть ли еще схемы требующие переопределения? или достаточно будет разобраться с работой DuplicatesPageV2 и добавить то что необходимо для работы с разделом продукты.

Добрый день!

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

Необходимо:
1. Добавить новую запись в таблицу DuplicatesRule с названием нового правила поиска дублей.
2. Добавить новую хранимую процедуру по аналогии с FindAccountDuplicate(для контрагента) или FindContactDuplicate(для контакта), в которых можно посмотреть пример реализации поиска дублей.

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

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

Версия 7.7.0.2325

Реализована пользовательская деталь с двумя справочными полями и редактируемым реестром.
Подскажите как можно реализовать фильтрацию одного справочного поля по значению другого.
С помощью BusinessRuleModule не получилось.

Нравится

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

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

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

Проверьте, чтобы у детали есть страница редактирования и прописаны корректно бизнес-правила.

Не срабатывают бизнес правила (делал по примеру из академии), попробовал добавить фильтрацию справочного поля по аналогии с примером из академии:

attributes: {
"UsrProductParamValue": {
	dataValueType: Terrasoft.DataValueType.LOOKUP,
	lookupListConfig: {
		filters: [
			function() {
				debugger
				var filterGroup = Ext.create("Terrasoft.FilterGroup");
 
				return filterGroup;
			}
		]
	}
}
}				

но при открытии поля, debugger не срабатывает, т.е. функция не вызывается и ошибок нет. Бизнес правило тоже не срабатывает, выводиться вся таблица.

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

"Щиголь Максим" написал:

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

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

Посмотрите эту тему, там подобную задачу решили.
http://www.community.terrasoft.ru/forum/topic/13684

Илья спасибо. Проблема решилась добавлением страницы редактирование и созданием бизнес правила в ней.

Есть еще момент, на детали при повторном создание нового значения по полю UsrProductParamValue, через функционал быстрого создания(в поле вводиться значение и если его нет появляется "Создать ..."), возникает ошибка в функции SectionBundleModule.tryCreateEntityOrOpenCard
...
valuePairs.add(columnPath, {columnPath: columnPath, columnValue: columnValue});
Текст ошибки: Элемент с ключём "UsrProductParam" Уже существует.
Если обновить страницу и повторить действия то значение добавляется без ошибок, но если выбрать другую запись и попытаться добавить новое значение UsrProductParamValue, то возникает ошибка.

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

Подскажите в чем может быть проблема и возможно ли ее исправить своими силами?

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

Илья, подскажите пожалуйста как подписаться на событие компонента, т.е. как мне узнать что пользователь выбрал "Создать ..."?

Подписаться на данное событие невозможно. Данная логика описана в миксине LookupQuickAddMixin. В данном случае событие можно поймать в методе onLookupChange. Привязка данного метода к лукапному полю происходит в модуле ViewGeneratorV2, от которого наследуется ConfigurationGridGenerator, который в свою очередь и строит грид детали. Вы можете создать свой генератор по аналогии с ConfigurationGridGenerator где и заместить данный метод, в котором бросать событие, используя sandbox. Так же можно напрямую заместить LookupQuickAddMixin, переопределив нужный метод.

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

activeRowSaved: function(row, callback, scope) {
	scope = scope || this;
	callback = callback || this.Terrasoft.emptyFn;
	callback.call(scope);
	debugger;
	this.updateDetail({
		reloadAll: true
	});
}

Но проблема повторяется, подскажите как нужно обновлять грид?

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

Для замещения LookupQuickAddMixin, необходимо создать новый миксин, унаследовавшись от LookupQuickAddMixin. Примеров такого замещения достаточно в конфигурации, к примеру, CtiPanelCommunicationHistoryUtilities. Затем добавляете созданный миксин в нужное Вам место. Добившись вызова методов созданного миксина, достаточно будет установить дополнительную проверку перед вызовом строки valuePairs.add(columnPath, {columnPath: columnPath, columnValue: columnValue}); Данная строка и выдает ошибку.

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

Да, вы правильно поняли по поводу замещения миксинов. Как вариант, можете посмотреть в сторону ConfigurationGridGenerator и разобраться как он генерирует лукапы. Далее попробовать подменить методы. Данная задача будет не из простых. Так же посмотрите в сторону метода generateActiveRowControlsConfig из ConfigurationGridUtilites. Ошибка возникает после вызова строки:
BusinessRulesApplier.applyRules(rowClass, gridLayoutItems);

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

В разделе "Заказ" добавил новую деталь "Адреса доставки", в ней добавил поле-справочник "Адрес контакта". Нужно сделать фильтрацию этого поля, чтоб отображались только те адреса которые есть на детале "Адреса контакта". Этот контакт указан в поле "Клиент"(контакт) в карточке "Заказы".
Заранее спасибо

Нравится

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

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

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

Вот пример кода который я раньше написал:
rules: {
"Car": {
"FiltrationInvoiceByAccount": {
"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
"autocomplete": true,
"baseAttributePatch": "UsrAutoContact",
"comparisonType": Terrasoft.ComparisonType.EQUAL,
"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
"attribute": "Contact"
}
}
но здесь два поля на одной карточке, а мне нужно что то вроде "attribute": "Order.Contact"

Здравствуйте, Виталий Владимирович!

Предоставьте полный листинг страницы раздела и страницы детали для анализа.

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

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

Нравится

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

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

Для решения подобной задачи Вам необходимо создать таблицу развязки и добавить в схему пользовательский фильтр (бизнес-правило).
Пример Вы можете посмотреть в базовом функционале - деталь «Команда» (раздел «Продажи»).

Также прикрепляю файл с примерным алгоритмом реализации.
ispolzovaniebazovyhshemdetaleysreestromsosvyazyuodinkomnogimmnogiekomnogim.doc

Показать все комментарии
MS_Word_Report_Designer
Repot Designer
Отчет в MS Word
7.x

Здравствуйте!
Нужен BPMonline MS Word Report Designer, Для версии 7.5.0.1275 bank sales. Заранее благодарен :-)

Нравится

2 комментария
7.6
MobileApplicationManifest
Мобильное приложение
7.x

В описании (которого почему-то не нашел в оглавлении) http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/MobileAppli...
для секции ModelDataImportConfig есть пример с макросом. А возможно ли сделать зависимость от какого-то поля контакта пользователя?

Например у Активности есть поле Участок (справочник) и у Контакта есть такое поле Участок. Нужно чтобы Активность загружалась если её участок совпадает с участком указанным в Активности

Нравится

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

Здравствуйте.
Вы пишите "Нужно чтобы Активность загружалась если её участок совпадает с участком указанным в Активности" - это как понимать?
Опишите пожалуйста детальней - что ожидается увидеть на выходе. какой бизнес-кейс решается?

Есть Пользователь П1 (торговый представитель), с ним связан Контакт К1, у которого есть кастомное поле Участок (типа справочник) со значением У1. Есть задачки (простите Активности!) З1, З2, ...., З99999, у которых кроме всего прочего так же есть кастомное поле Участок из того же справочника. Так вот если нет надобности грузить 99999 задачек, а только те у которых поля Участок совпадают с одноименным полем Контакта, то как построить данный фильтр типа Пользователь.Контакт.Участок = Задачка.Участок.

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

В етом случае Вас тоит вносить код в секцию ModelDataImportConfig Манифеста мобильного приложения.

Пример фильтрации данных для загрузки описан в документе, приведенном Вами выше:
Активность. Загружаются все колонки. Выполняется фильтрация модели - загружаются только те активности, у которых участником является текущий пользователь.

ModelDataImportConfig: [
// Конфигурирование модели Activity.
{
Name: 'Activity',
SyncFilter: {
type: 'Terrasoft.FilterTypes.Group',
logicalOperation: 'Terrasoft.FilterLogicalOperations.Or',
subfilters: [
{
property: 'Participant',
modelName: 'ActivityParticipant',
assocProperty: 'Activity',
operation: 'Terrasoft.FilterOperations.Any',
valueIsMacros: true,
value: 'Terrasoft.ValueMacros.CurrentUserContact'
}
]
},
SyncColumns: ['Title', 'StartDate', 'DueDate', 'Status', 'Result', 'DetailedResult', 'ActivityCategory', 'Priority', 'Owner', 'Account', 'Contact',
'Lead', 'Opportunity', 'ShowInScheduler', 'Author', 'Type'
]
},

"Клименко Николай" написал:загружаются только те активности, у которых участником является текущий пользователь.

так ведь нет участников :smile: есть УЧАСТОК

Предоставленый код является примером реализации.
По аналогии, Вы можете настроить свою фильтрацию.

"Клименко Николай" написал:

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

По аналогии, Вы можете настроить свою фильтрацию.


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

Нужно понимание как сделать фильтры по полям и в левой и в правой части выражения сравнения, что-то типа (ActivityAccount - деталь Контрагенты в Активностях):

ModelDataImportConfig: [
        // Конфигурирование модели Activity.
        {
            Name: 'ActivityAccount',
            SyncFilter: {
                type: 'Terrasoft.FilterTypes.Group',
                logicalOperation: 'Terrasoft.FilterLogicalOperations.Or',
                subfilters: [
                    {
                        property: 'PartOf',
                        valueIsMacros: true,
                        value: 'Terrasoft.ValueMacros.CurrentUserContact.PartOf'
                    }
                ]
            },    

В Вашем случае необходимо применить вариант решения с использоваием view

1. Создать View (например VwActivityAreaByContactArea) с колонками Активности и Контакта

2. Добавить в конфигурацию скрипт (Подразумевается колонка Участок = Area) и установить
------------------------------------------------------------------------
IF EXISTS (SELECT 1 FROM sys.views WHERE name = 'VwActivityAreaByContactArea')
DROP VIEW dbo.VwActivityAreaByContactArea
go
------------------------------------------------------------------------
CREATE VIEW dbo.VwActivityAreaByContactArea AS
SELECT
a.Id,
a.CreatedOn,
a.CreatedById,
a.ModifiedOn,
a.ModifiedById,
a.ProcessListeners,
a.Id as ActivityId,
c.Id as ContactId
FROM Activity a
JOIN Contact c ON c.Area = a.Area
Where c.Area <> ''

3. В манифесте добавить фильтрацию
"ModelDataImportConfig": [
{
"Name": "Activity",
"SyncFilter": {
"type": 'Terrasoft.FilterTypes.Group',
"logicalOperation": 'Terrasoft.FilterLogicalOperations.And',
"subfilters": [
{
"property": 'Participant',
"modelName": 'ActivityParticipant',
"assocProperty": 'Activity',
"operation": 'Terrasoft.FilterOperations.Any',
"valueIsMacros": true,
"value": 'Terrasoft.ValueMacros.CurrentUserContact'
},
{
"property": "Contact",
"modelName": "VwActivityAreaByContactArea",
"assocProperty": "Activity",
"operation": 'Terrasoft.FilterOperations.Any',
"valueIsMacros": true,
"value": "Terrasoft.ValueMacros.CurrentUserContact"
}
]
}
},
{
"Name": "VwActivityAreaByContactArea",
"SyncFilter": {
"property": "Contact",
"valueIsMacros": true,
"value": "Terrasoft.ValueMacros.CurrentUserContact"
}
}
]
И указать модель View

"Models": {
"Activity": {
"Grid": "MobileActivityGridPage",
"Preview": "MobileActivityPreviewPage",
"Edit": "MobileActivityEditPage",
"RequireLookupColumnsModels": true,
"RequiredModels": [

"VwActivityAreaByContactArea"
]
}

"Клименко Николай" написал:В Вашем случае необходимо применить вариант решения с использоваием view

Николай, спасибо большое! Всё гениальное... не так то и просто :sad:

Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.
Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".
Добавляю в манифест фильтр:

"SyncFilter": {
					"property": "Status",
// Название модели, для которой выполняется фильтрация.
					//"modelName": "Case",
// Колонка связанной модели, по которой осуществляется связь с основной моделью.
					//"assocProperty": "Id",
					//"operation": "Terrasoft.FilterOperations.Any",
					"compareType": "Terrasoft.ComparisonType.NotEqual",
					//"value": {
						//"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",
						//"displayValue": "Закрыт"}
                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
				},

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

"SyncFilter": {
					"type:" "Terrasoft.FilterTypes.Simple",
					"property": "SolutionOverdue",
					"compareType": "Terrasoft.ComparisonType.Equal",
					"value": true
				},

В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

"Михайловский Илья Викторович" написал:

Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.

Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".

Добавляю в манифест фильтр:

"SyncFilter": {

                                        "property": "Status",

// Название модели, для которой выполняется фильтрация.

                                        //"modelName": "Case",

// Колонка связанной модели, по которой осуществляется связь с основной моделью.

                                        //"assocProperty": "Id",

                                        //"operation": "Terrasoft.FilterOperations.Any",

                                        "compareType": "Terrasoft.ComparisonType.NotEqual",

                                        //"value": {

                                                //"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",

                                                //"displayValue": "Закрыт"}

                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"

                                },

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

Пробовал еще такой фильтр:

"SyncFilter": {

                                        "type:" "Terrasoft.FilterTypes.Simple",

                                        "property": "SolutionOverdue",

                                        "compareType": "Terrasoft.ComparisonType.Equal",

                                        "value": true

                                },

В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

Добрый день, Илья!
Примеры описаны для версии 7.6.
Уточните, пожалуйста, версию системы и мобильного приложения.

"Вильшанский Дмитрий" написал:
Михайловский Илья Викторович пишет:

Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.

Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".

Добавляю в манифест фильтр:

"SyncFilter": {

                                        "property": "Status",

// Название модели, для которой выполняется фильтрация.

                                        //"modelName": "Case",

// Колонка связанной модели, по которой осуществляется связь с основной моделью.

                                        //"assocProperty": "Id",

                                        //"operation": "Terrasoft.FilterOperations.Any",

                                        "compareType": "Terrasoft.ComparisonType.NotEqual",

                                        //"value": {

                                                //"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",

                                                //"displayValue": "Закрыт"}

                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"

                                },

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

Пробовал еще такой фильтр:

"SyncFilter": {

                                        "type:" "Terrasoft.FilterTypes.Simple",

                                        "property": "SolutionOverdue",

                                        "compareType": "Terrasoft.ComparisonType.Equal",

                                        "value": true

                                },

В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

Добрый день, Илья!

Примеры описаны для версии 7.6.

Уточните, пожалуйста, версию системы и мобильного приложения.

7.8
Я уже сделал, но через модуль, создал с именем UsrMobileCaseModelConfig со след кодом:

Terrasoft.sdk.Module.addFilter("Case", Ext.create("Terrasoft.Filter", {
	name: "CaseCustomFilter",
	type: "Terrasoft.FilterTypes.Group",
	subfilters: [
//Не закрытый статус
		Ext.create("Terrasoft.Filter", {
			name: "CaseStatusFilterValue",
			property: "Status",
			compareType: Terrasoft.ComparisonTypes.NotEqual,
			value: "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
		}),
//Ответственный - текущий пользователь
		Ext.create("Terrasoft.Filter", {
			name: "CaseOwnerFilterValue",
			property: "Status",
			compareType: Terrasoft.ComparisonTypes.Equal,
			valueIsMacros: true,
			value: "Terrasoft.ValueMacros.CurrentUserContact"
		}),
//Не отменен статус
		Ext.create("Terrasoft.Filter", {
			name: "CaseStatusFilterValue",
			property: "Status",
			compareType: Terrasoft.ComparisonTypes.NotEqual,
			value: "6e5f4218-f46b-1410-fe9a-0050ba5d6c38"
		})
	]
}));

И затем в манифесте в PageExists подключил этот модуль, и все заработало.

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

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

Нравится

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.

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

Добрый день!

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

Нравится

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

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

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

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

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

Версия 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... как результат и считает в обратную строну - т.е. сумма в б.в. получается меньше чем сумма в валюте (в случае с евро).

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