7.4
доступ
права
Технические вопросы
7.x

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

Нравится

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

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

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

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

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

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

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

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

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

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

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

Показать все комментарии
7.4
Lookup
ввод
сообщение
Технические вопросы
7.x

Здравствуйте, нужно отобразить сообщение с полями ввода.
Одно из полей должно быть справочником.
Каким образом можно привязать 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. Вызывается при работе с представлением "Расписание", в разделе "Активности".

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

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

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

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

Здравствуйте.
Есть деталь, с одним справочным полем 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:

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

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

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

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

Нравится

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

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

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

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

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

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

Нравится

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

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

[csharp]

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();
}

[/csharp]

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

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

[csharp]
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();
}
[/csharp]

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

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

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

Нравится

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

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

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

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

Нравится

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

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

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

Добрый день!

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

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

Здравствуйте!
Есть проблема со свойством 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: {}
};
});

Александр, неправильно делаете. Нужно это свойство задавать атрибуту, к которому привязан контрол, а не контролу. Вот так:
[javascript]
attributes: {
//...
"SxAffiliateTransp": {
"isRequired": {"bindTo":"IsSxAffiliateTransVisible"}
}
}
[/javascript]

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

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

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

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

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

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);

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

Никак не получается отображать/скрывать по условию элемент 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

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

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