Добрый день!
Стоит задача дать права на запись для пользователей, входящих в определенную команду и принадлежащих к одному филиалу (Доп. поле Контакт.Филиал).
Пытался раздать права с помощью БП, но в элементе "Изменение прав доступа" нет возможности добавить права нужным пользователям. Доступны либо все пользователи определенной роли, либо сотрудники, удовлетворяющие условиям фильтрации, в которых можно сделать фильтр по филиалу, но невозможно настроить фильтр по принадлежности пользователя к определенной роли (в агрегирующем фильтре нет Объекта администрирования).
Буду признателен за помощь...

Нравится

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

Здравствуйте, Иван!

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

1) Получить идентификатор пользователя и роли (это можно сделать, обращаясь к объектам Сотрудник и Объект Администрирования).
2) Проверять вхождение пользователя в роль, читая данные из объекта Роль Пользователя. В качестве условий передавать Пользователя и Роль. Если возвращает больше нуля, значит, пользователь входит в роль, иначе - нет.

Это понятно и вполне работает в EntitySchemaQuery, но в БП все сложнее...
Объект Роль Пользователя не доступен в фильтре элемента "Изменение прав доступа".
Добавить в фильтр результат выборки получается только один, а нужна все выборка..
Проблема остается.

Здравствуйте, Иван!

Определенная команда - это определенная роль? Если так, то почему нет возможности отфильтровать по ролям? Или необходимо давать права конкретным людям в определенной роли? Может я не правильно понял суть вопроса?

Команда - это роль(к примеру команда кассиры). Почему нет возможности фильтровать - этот вопрос меня тоже интересует)). В том то и дело, что нужно взять контакта, который входит в определенную роль и принадлежит к нужному филиалу, но в агрегирующем фильтре БП не доступны системные объекты, такие как VwSysAdminUnit. Вопрос в том как применить элемент Изменение прав доступа к нужной выборке сотрудников.

Здравствуйте, Иван!

Действительно, можно выбрать либо конкретную "Роль - группу пользователей в иерархии", либо контакта/ов по определенным условиям (без роли). Но я предлагаю пойти немного иным путем - на странице контакта есть поле "Роль", добавьте в справочник "Роль", необходимое значение, например "Кассир_1" и тогда можно будет по данному условию отфильтровать именно необходимого пользователя или группу.

Приятного дня!

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

Здравствуйте, нужно отобразить сообщение с полями ввода.
Одно из полей должно быть справочником.
Каким образом можно привязать Control к объекту.
Также необходимо задать обязательность полей.
Пробовал реализовать задачу следующим образом:

inputMessage:function () {
                var callback = function(returnCode, controlData) {
                    if (returnCode === 'ok' && controlData.StartDate.value) {
                        debugger;
                        var StartDate = controlData.StartDate.value;
                    }
                };
                var config= {
                    warehouse: {
                        dataValueType: Terrasoft.DataValueType.LOOKUP,
                        caption:'Для филиала', //resources.localizableStrings.GroupNameInputTitle,
                        entitySchemaName:'SxWarehouses',
                        ReferenceSchemaName:'SxWarehouses',
                        isRequired:true,
                        values: {
                            ReferenceSchemaName:'SxWarehouses',
                            isRequired:true,
                            entitySchemaName:'SxWarehouses'
                        }

                        //value: 0
                    },
                    StartDate: {
                        dataValueType: Terrasoft.DataValueType.DATE,
                        caption:'Дата начала', //resources.localizableStrings.GroupNameInputTitle,
                        isRequired:true
                        //value: 0
                    },
                    DueDate: {
                        dataValueType: Terrasoft.DataValueType.DATE,
                        caption:'Дата завершения', //resources.localizableStrings.GroupNameInputTitle,
                        isRequired:true
                        //value:
                    }

                };
                var caption = 'Отчет';
                //inNew ? resources.localizableStrings.NewGroupInputBoxCaption :
                //  resources.localizableStrings.ExistingGroupInputBoxCaption;
                Terrasoft.utils.inputBox(
                    caption,
                    callback,
                    ['ok', 'cancel'],
                    this,
                    config,
                    {
                        defaultButton: 0,
                        classes: {
                            coverClass: ['cover-calss1', 'cover-calss2'],
                            captionClass: ['caption-calss1', 'caption-calss2']
                        }
                    }
                );
            },

но справочник не привязан к объекту и обязательность полей не задается.
Подскажите, как можно решить данную задачу?

Нравится

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

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

"Пащенко Александр Сергеевич" написал:Здравствуйте, нужно отобразить сообщение с полями ввода.

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

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

для этого вызывается метод inputMessage()
Проблема заключается в том, что поле типа lookup не привязано к объекту, следовательно страница справочника не открывается

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

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

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

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

В InputBox не получится работать с лукапом. Рекомендую Вам посмотреть, как пример, работу страницы SimpleTaskAddModule. Вызывается при работе с представлением "Расписание", в разделе "Активности".

Не очень правильный но самый простой вариант. Отловить событие нажатия на лупу и открыть нужный справочник.

$('.base-edit-right-icon-wrapper').click(function(){
	self.openLookup(configLookup, function(response) {
		// Тут записать данные выбранные из справочника в поле лукапа и в переменную.
	});
	$('.ts-modalbox').css('z-index','3000'); //эта строчка нужна чтобы окно справочника было поверх inputBox
});

А в коллбеке получать выбранное значение из переменной.

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

Здравствуйте.
Есть деталь, с одним справочным полем UsrTest, у этого справочника есть поле UsrText (строковой тип). Необходимо отфильтровать выдаваемые значения этого справочника по полю UsrText.

rules: {
    "UsrTest": {
        FiltrationUsrTest: {
            ruleType: ConfigurationEnums.BusinessRule.RuleType.FILTRATION,
            baseAttributePatch: "UsrText",
            comparisonType: Terrasoft.ComparisonType.EQUAL,
            type: ConfigurationEnums.BusinessRule.ValueType.CONSTANT,
            attribute: {value:"77-0"}
                                }
                        }
                }
        };
});

В консоле ошибок нет, но и не фильтрует.
Подскажите пожалуйста в чем проблема. Спасибо.

Нравится

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

Решение нашел))
Нужно не attribute:, а value:

Извините за беспокойство.

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

Здравствуйте!
Возник вопрос в продолжение данной темы.
https://community.terrasoft.ru/forum/topic/11426

Во вложение постоянно попадает один и тот же счет. В чем может быть проблема? Похоже, что не накладывается фильтрация, или накладывается неверно.

Нравится

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

Здравствуйте, Александр!
Приведите, пожалуйста, фргменты кода, где передаются и накладываются фильтры, чтобы можно было быстро проанализировать и понять, в чем проблема.
Вы также можете самостоятельно провести анализ, воспользовавшись советом из темы http://www.community.terrasoft.ru/forum/topic/10810 .
текст запроса не обязательно логировать, его можно вывести в сам отчет в элемент "Текст" следующим образом:

ErrorLabel.Text = "error text";

Спасибо!

Здравствуйте, Андрей!
Я уже разобрался,неверно передавал фильтры. Спасибо!

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

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

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

Нравится

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

Если существует необходимость обработки событий объект, то Update лучше всего сделать через ESQ

public static void ExampleUpdateEntity(Guid contactId)
{
    EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
    EntitySchemaQuery esq = new EntitySchemaQuery(schema);
    esq.AddAllSchemaColumns();
    Entity entity = esq.GetEntity(UserConnection, contactId);
    entity.SetColumnValue("Name", "New Name");
    entity.Save();
}

а можно ли contactId как-то заменить фильтрами? Либо нужно сначала получить Id необходимой записи, а потом его использовать?
Каким образом можно после обработки обновить значения в карточке(перетянуть значения из базы, не обновляя страницу)?

Можно заменить и фильтрами. Сама идея просто работать с Entity.

    EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("Contact");
    EntitySchemaQuery esq = new EntitySchemaQuery(schema);
    esq.AddAllSchemaColumns();
    esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", "FilterName"));
    EntityCollection entities = esq.GetEntityCollection(UserConnection);
    foreach (Entity entity in entities)
    {
        entity.SetColumnValue("Name", "NewName");
        entity.Save();
    }

Спасибо за подсказку, все работает.

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

В базовой версии реализована проверка на дубли Контактов/Контрагентов. Можно ли проверять на дубль и Лиды тоже?

Нравится

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

Добрый день! В системе bpm'online поиск дублей возможен только в разделах "Контакты" и "Контрагенты". Если речь идет о продукте Terrasoft 3.x, в нем возможно добавлять правила поиска дублей для нужных Вам разделов, настраиваются данные правила в меню "Файл" - "Настройки" - "Правила поиска дублей".

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

Добрый день! Столкнулся с такой особенностью при работе с js файлами. Включаю редактирование клиентских файлов. Файлы можно править через WebStorm. Но при этом изменения через мастер раздела не сохраняются. Точнее при первой изменении страницы создаются файл в моем пакете и все сохраняется, а вот любые последующие изменения именно через мастер уже не сохраняются. Т.е. вносить изменения файл можно только через WebStorm.

Нравится

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

У меня предположение что в таком случаи нужно еще выполнять действие "Обновить клиентские модули из базы данных".

Здравствуйте, коллеги!
Это известная проблема, пока что не решена. Временным решением будет удаление js-файла из файловой системы перед сохранением изменений в мастере разделов.

Добрый день!

Исправления будут включены в релизные сборки 7.6 или 7.7.

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

Здравствуйте!
Есть проблема со свойством isRequired.
При установке значения isRequired: true система отображает * возле поля, но позволяет сохранить карточку с пустым значением (свойство обязательности не срабатывает)
При использовании бизнес-правил все работает корректно.

Тестировалось на релизах BPMOnline Sales 7.4
Omnichannel, Версия 7.4.0.2924
Team, Версия 7.4.0.2628

Нравится

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

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

Здравствуйте, Александр!
Ошибку не удалось воспроизвести.
Пожалуйста, уточните тип поля, для которого устанавливается обязательность, а также приведите фрагмент кода, где это происходит.
Спасибо!

Здравствуйте, Александр!
Ошибку не удалось воспроизвести.
Пожалуйста, уточните тип поля, для которого устанавливается обязательность, а также приведите фрагмент кода, где это происходит.
Спасибо!

Используется справочное поле(обязательно для заполнения по условию) и метод setSxAffiliateTransVisible для установки свойства обязательности
Также пробовал привязать в булевому полю.
Результат одинаковый: Звездочка возле обязательного поля появляется, но карточку можно сохранить не заполнив его.

define('SxServicePage', ['GeneralDetails','terrasoft','Constants','BusinessRuleModule'],
function(GeneralDetails,Terrasoft,Constants,BusinessRuleModule) {
	return {
		entitySchemaName: 'SxService',
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "SxType",
					"values": {
						"layout": {
							"column": 12,
							"row": 0,
							"colSpan": 12,
							"rowSpan": 1
						},
						"contentType": 3
					},
					"parentName": "Header",
					"propertyName": "items"
				},
				{
					"operation": "insert",
					"name": "SxAffiliateTransp",
					"values": {
						"layout": {
							"column": 12,
							"row": 2,
							"colSpan": 12,
							"rowSpan": 1
						},
						"visible": {"bindTo":"IsSxAffiliateTransVisible"},
						"isRequired": {"bindTo":"IsSxAffiliateTransVisible"}
						//"isRequired": true // тоже не работает
					},
					"parentName": "Header",
					"propertyName": "items"
				}
			]/**SCHEMA_DIFF*/,
		attributes: {
			/*
			 * Зависимость поля Филиал* от поля тип.
			 * Скрытие по условию. Для тип=Транспортировка
			 * */
			"SxType": {
				dependencies: [
					{
						columns: ["SxType"],
						methodName: "setSxAffiliateTransVisible"
					}
				]
			}
		},
		methods: {
			setSxAffiliateTransVisible:function () {
				var type= this.get("SxType");
				if (type!=undefined && type.value==Constants.ServiceType.Transportation) {
					this.set("IsSxAffiliateTransVisible",true);
 
				}
				else {
					this.set("IsSxAffiliateTransVisible",false);
					this.set("SxAffiliateTransp", null);
				}
			}
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.setSxAffiliateTransVisible();
			}
		},
		rules: {
//C ДАННЫМ ПРАВИЛОМ РАБОТАЕТ КОРРЕКТНО
			/*"SxAffiliateTransp":{
				"BindParameterRequiredSxAffiliateTranspToSxType": {
					ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
					property: BusinessRuleModule.enums.Property.REQUIRED,
					conditions: [
						{
							"leftExpression": {
								"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
								"attribute": "SxType"//,
								//"attributePath": "Finish"
							},
							"comparisonType": Terrasoft.ComparisonType.EQUAL,
							"rightExpression": {
								"type": BusinessRuleModule.enums.ValueType.CONSTANT,
								"value": Constants.ServiceType.Transportation
							}
						}
					]
				}
			}*/
		},
		userCode: {}
	};
});

Александр, неправильно делаете. Нужно это свойство задавать атрибуту, к которому привязан контрол, а не контролу. Вот так:

attributes: {
//...
	"SxAffiliateTransp": {
		"isRequired": {"bindTo":"IsSxAffiliateTransVisible"}	
	}
}

Действительно работает, спасибо за подсказку!

Попробовал, работает не так (BPM 7.5 off-site) - если поле уже обязательное по условию, и условие меняется так, что функция возвращает false, то пропадает только красненький текст валидации, а само поле продолжает вести себя как обязательное.. т.е. сильно просит заполнить себя....

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

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

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

prepareOpenLookup:function () {

                    var addParams = this.get('addParams');
                    //Строим ExistsFilter
                     var filterValue = this.get("MasterRecordId");
                     var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                     rootSchemaName: this.entitySchemaName
                     });
                     esq.addColumn("Id");
                     esq.addColumn(addParams.item1 + '.Id');
                     esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
                     esq.filters.add("filterChild", Terrasoft.createColumnFilterWithParameter(
                     this.Terrasoft.ComparisonType.EQUAL, addParams.item2, filterValue));

                     esq.getEntityCollection(function(result) {
                        var existsContactsCollection = [];
                         if (result.success) {
                            result.collection.each(function(item) {
                                existsContactsCollection.push(item.get(addParams.item1 + '.Id'));
                            });
                        }
                        //config открытия справочника
                         var config = {
                            entitySchemaName: addParams.parentTable,
                            multiSelect: true,
                            columns: addParams.columns,
                            filters:(Terrasoft.createColumnFilterWithParameter(
                                Terrasoft.ComparisonType.EQUAL, "SxRequest", addParams.ParentId))
                         };
                     if (existsContactsCollection.length > 0) {
                         var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);
                         existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
                         existsFilter.Name = "existsFilter";
                         var filterGroup = Terrasoft.createFilterGroup();
                         filterGroup.logicalComparisonTypes = Terrasoft.LogicalOperatorType.AND;


                        var requestFilter=Terrasoft.createColumnFilterWithParameter(
                             Terrasoft.ComparisonType.EQUAL, "SxRequest", addParams.ParentId)
                         requestFilter.Name = "requestFilter";
                         requestFilter.comparisonType = Terrasoft.ComparisonType.EQUAL;
                         //Добавляем фильтр по заявке
                         filterGroup.add(requestFilter);

                         //Добавляем existsFilter
                         filterGroup.add(existsFilter);
                         //Устанавливаем фильтрацию для справочника
                         config.filters = filterGroup;
                     }
                     this.openLookup(config, this.addCallBack, this);
                     }, this);
                },

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

Нравится

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

Выяснил в чем проблема filterGroup.add(ИМЯ,Filter) принимает 2 параметра.
а я использовал
filterGroup.add(requestFilter);

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

Никак не получается отображать/скрывать по условию элемент tab:

{
        "operation": "insert",
        "name": "TestTab",
        "values": {
                "caption": {
                        "bindTo": "Resources.Strings.OwnerCaption"
                },
                "items": []
        },
        "parentName": "Tabs",
        "propertyName": "tabs",
        "index": 0
}

Подскажите как это сделать.

Нравится

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

Все вкладки хранятся в коллекции TabsCollection
получить доступ к ней можно следующим образом:
this.get("TabsCollection");

В примере реализовано скрытие вкладки для контрагента с типом клиент (функционал не базовый)

this.get("TabsCollection");

 attributes: {
                "Type": {
                    dependencies: [
                        {
                            columns: ["Type"],
                            methodName: "typeChange"
                        }
                    ]
                }
            },
 typeChange: function () {
 
                    /*  Добавление/удаление вкладки */
                    var tabsCollection = this.get("TabsCollection");
                   //TestTab- название вкладки, которую необходимо спрятать
                    var TestTab = tabsCollection.contains("TestTab")?tabsCollection.get("TestTab"):false;
 
                    //прячем вкладку "TestTab" для всех, кроме клиента
                    if( Type === Constants.Client && 
                        !TestTab){
                        tabsCollection.insert(4, "TestTab", Terrasoft.Account.TestTab);
                    }else if(!(Type === Constants.Client) &&
                        TestTab){
                        Terrasoft.Account.TestTab= TestTab;
                        tabsCollection.removeByKey("TestTab");
                    }
 
                }

Также можете ознакомиться с данной темой:
http://www.community.terrasoft.ru/forum/topic/11180

Спасибо, получилось !

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