Технические вопросы
Разработка

Версия 3.0.2.244
Можно ли как-то определить в каком состоянии находится узел дерева (DataTreeGrid), в смысле свернут он, или развернут?

Нравится

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

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

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

печально...

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

Есть 3 поля:
[сумма], [процент], [комиссия]

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

комиссия = сумма * процент / 100
процент = комиссия * 100 / сумма

{
        type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
        name: 'Amount',
        columnPath: 'Amount',
        dataValueType: Terrasoft.DataValueType.FLOAT,
        visible: true
},
{
        type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
        name: 'Percent',
        columnPath: 'Percent',
        dataValueType: Terrasoft.DataValueType.FLOAT,
        visible: true,
        dependencies: ['Commission'],
        methodName: 'OpportunityPercentGenerate'
},
{
        type: Terrasoft.ViewModelSchemaItem.ATTRIBUTE,
        name: 'Commission',
        columnPath: 'Commission',
        dataValueType: Terrasoft.DataValueType.FLOAT,
        visible: true,
        dependencies: ['Amount', 'Percent'],
        methodName: 'OpportunityCommissionGenerate'
}

this.methods.OpportunityCommissionGenerate = function() {
        var amount = this.get('Amount');
        var percent = this.get('Percent');
        if (Ext.isEmpty(amount) || Ext.isEmpty(percent)) {
                this.set('Commission', 0);
                return;
        }
        var commission = ((amount * percent) / 100);
        this.set('Commission', commission);
};

this.methods.OpportunityPercentCenerate = function() {
        var amount = this.get('Amount');
        var commission = this.get('Commission');

        if (Ext.isEmpty(amount) || Ext.isEmpty(commission)) {
                this.set('Percent', 0);
                return;
        }
        var percent = ((commission * 100) / amount);
        this.set('Percent', percent);
};

работает только первое условие (комиссия = сумма * процент / 100);

Что нужно еще сделать чтобы работало все?

Нравится

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

Здравствуйте, Василий.

Необходимо без опечатки назвать метод. У вас в свойстве поля:
OpportunityPercentGenerate
А определен:
OpportunityPercentCenerate

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

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

Нравится

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

Акмаль, добрый день.

Пользовательски - никак. Программно так:

byte[] data = entity.GetBytesValue(dataQueryColumn.Name);

где entity - экземпляр Entity полученный посредством EntitySchemaQuery.
dataQueryColumn - колонка в EntitySchemaQuery.

Показать все комментарии
дерево групп
Технические вопросы
Разработка

Нужно, чтобы дерево групп раскрывалось(все плюсики были раскрыты) автоматически.
Как можно это реализовать?

Нравится

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

Воспользуйтесь методом ExpandAll().
Вызов метода разворачивает все узлы дерева (при этом видимыми становятся все дочерние узлы дерева).
Пример вызова:

grdData.ExpandAll();

Написал вот так:

wndGroups.Window.ComponentsByName('grdData').CanUseExpandAll = true;
wndGroups.Window.ComponentsByName('grdData').ExpandAll();

но ни чего не произошло(дерево свернуто в одну корневую группу)

Василий, завтра в первую половину дня предоставим рекомендации по этому вопросу.

Василий, добавьте на событии OnShow Workspace'а:

wnd_BaseWorkspaceOnShow(Window);
grdData = wndGroups.Window.ComponentsByName('grdData');
grdData.ExpandAll();

Должно работать.

Например:

function wnd_CashflowWorkspaceOnShow(Window) {
wnd_BaseWorkspaceOnShow(Window);
grdData = wndGroups.Window.ComponentsByName('grdData');
grdData.ExpandAll();
}
Показать все комментарии
7.3
безопасность
копирование записей
технические вопросы
Технические вопросы
7.x

Добрый день, коллеги.
Необходимо запретить возможность копирования содержимого реестра в разделах Лиды, Контрагенты, Контакты, Продажи.
Как это можно реализовать?
Сейчас при выделении всего списка в реестре, пользователь может одним нажатием Ctrl+C скопировать все записи.
Заранее спасибо!

Нравится

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

Добрый день, Антон.

Можно организовать только защиту от дурака, ведь записи уже загружены пользователю и он их уже видит.
Отключить копирование можно создав замещающий модуль, указать в качестве родительского объекта "Раздел лиды" и добавить следующий код:

define("LeadSectionV2", ["terrasoft", "GeneratedWebFormUtilities"],
	function(Terrasoft, GeneratedWebFormUtilities) {
		return {
			entitySchemaName: "Lead",
			methods: {
				init: function() {
					this.callParent(arguments);
					document.body.oncopy = function() { return false; };
				}
			}
		};
	});
Показать все комментарии

Здравствуйте! Подскажите, пожалуйста. Мне нужно запускать бизнес-процесс при первичном открытии карточки редактирования Лида после импорта. Бизнес-процесс у меня запускается, но и карточка редактирования Лида тоже открывается. Вопрос состоит в следующем: как мне запускать процесс и при этом не открывать карточку??

Нравится

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

Виктория, каким образом реализован запуск БП?
Если через карточку редактирования, тогда принудительно закрывайте окно.
Если на стороне страницы реестра, не пробрасывайте сообщение (EditButtonClick).

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

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

Добрый день!
Столкнулся с задачей - необходимо сбросить чекбокс в карточке счета при выполнении бизнес-процесса.
Какое значение нужно присвоить колонке?
скрин

Нравится

2 комментария
5.x
динамическое поле
событие поля
Технические вопросы

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

var ControlName = GetByNameControlOnAdditionalTab("ControlName");
ControlName.AjaxEvents.Change.Event += ControlNameEditChange;

Но при компиляции ошибка что тип Terrasoft.UI.WebControls.Controls.BaseEdit не содержит метода AjaxEvents

Нравится

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

Здравствуйте, Эмин!
Свойства AjaxEvents действительно нет в классе BaseEdit, оно появляется в наследниках, например, TextEdit, потому что набор событий отличается для различных контролов.
Вашу задачу можно решить проще, сразу добавив все необходимые контролы и обработчики событий базовыми средствами, но сделать их невидимыми, а при загрузке страницы просто отображать нужные с помощью свойства "Hidden".

"Андрей Каспаревич" написал:

Здравствуйте, Эмин!

Свойства AjaxEvents действительно нет в классе BaseEdit, оно появляется в наследниках, например, TextEdit, потому что набор событий отличается для различных контролов.

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

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки


Андрей ,спасибо за ответ. Я знаю, что можно скрывать и показывать поля в зависимости от значения поля Категория. Наверное так и реализую.
Просто динамическое добавление полей уже реализовано в базовой версии BPM и мне показалось, что раз существует базовый способ менять наборы полей, то и обработчик для динамического контрола добавить тоже можно.

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

Здравствуйте! У меня есть деталь с полями "Застрахование лица" с одним типом данных. При первой загрузке страницы на который расположена деталь вылетает ошибка в DetailViewModelGenerator на строке: itemViewModelConfig.columns[entitySchema.primaryColumn.name]. и entitySchema = undefined. Если нажать обновить страница деталь раскрывается нормально. Ошибка вылетает только при первому переходе на эту страницу. Подскажите пожалуйста в чем проблема и как ее решить. Спасибо.

Нравится

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

Здравствуйте, Владимир!
Попробуйте явно в коде детали указать entitySchema, как, например, в детали "Участники активности":

define('ActivityParticipantDetail', ['ext-base', 'terrasoft', 'sandbox', 'ActivityParticipant',
'ConfigurationConstants', 'ActivityParticipantDetailStructure', 'ActivityParticipantDetailResources',
'LookupUtilities'], function(Ext, Terrasoft, sandbox, ActivityParticipant, ConfigurationConstants, structure,
resources, LookupUtilities) {

structure.userCode = function() {
this.entitySchema = ActivityParticipant;
this.name = 'ActivityParticipantDetailViewModel';
...

А также добавить объект детали в зависимости:

Это у меня уже било сделано. Также я пробовал вручную прописывать entitySchema.
if(!InsuredPerson) {
InsuredPerson = Terrasoft.decode("{\"initialConfig\"":{}

Вот код моей детали с полями:

define('UsrInsuredPersonDetail', ['ext-base', 'terrasoft', 'UsrInsuredPerson', 'UsrInsuredPersonDetailStructure',
'UsrInsuredPersonDetailResources'], function(Ext, Terrasoft, UsrInsuredPerson, structure, resources) {

var filterSchemaName;

var getContainerConfig = function(id, styles) {
var container = {
className: 'Terrasoft.Container',
items: [],
id: id,
selectors: {wrapEl: '#' + id}
};
if (styles) {
container.classes = {wrapClassName: styles};
}
return container;
};

structure.userCode = function() {

this.entitySchema = UsrInsuredPerson;
this.name = 'UsrInsuredPersonDetailViewModel';
filterSchemaName = 'Document';

this.name = 'UsrInsuredPersonDetailViewModel';
//this.primaryColumnName = "UsrInsuredPersonField";
this.methods.getCustomItemView = function(viewModel, itemKey, action,types) {

Terrasoft.each(types, function(item) {
item.click = {
bindTo: 'myTypeChanged'
};
});
var columns = viewModel.attributes;
var UsrInsuredPerson = columns[0];

var viewConfig; // = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');
switch (action) {
case 'add':
case 'copy':
case 'edit':
//var titleConfig = getContainerConfig(itemKey + '-title', 'controlCaption');
viewConfig = getContainerConfig(itemKey + '-view');
var valueConfig = getContainerConfig(itemKey + '-value');

var deleteButtonConfig = {
id: itemKey + '-delete',
className: 'Terrasoft.Button',
classes: {
wrapperClass: 'detail-delete-btn-user-class'
},
imageConfig: resources.localizableImages.DeleteIcon,
style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
selectors: {
wrapEl: '#' + itemKey + '-delete'
},
click: {
bindTo: 'delete'
},
width: '10%'

};

var editConfig = {
id: itemKey + '-edit',
className: 'Terrasoft.TextEdit',

markerValue: UsrInsuredPerson.name,
value: {
bindTo: UsrInsuredPerson.name
},

classes: {
wrapperClass: 'detail-delete-btn-user-class'
},
// style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
selectors: {
wrapEl: '#' + itemKey + '-delete'
}

};

//titleConfig.items.push(deleteButtonConfig);
valueConfig.items.push(deleteButtonConfig,editConfig);
viewConfig.items.push(valueConfig);
break;

case 'view':
viewConfig = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');

var valueLabel = {
className: 'Terrasoft.Label',
caption: {
bindTo: UsrInsuredPerson.name,
bindConfig: {converter: Terrasoft.getTypedStringValue}
}

};

viewConfig.items.push(valueLabel);
break;
}

return viewConfig;

};

this.loadedColumns = [
{
columnPath: 'Id'
}, {
columnPath: 'UsrInsuredPersonField'
},{
columnPath: 'UsrDocument'
}
];

this.name = 'UsrInsuredPersonDetailViewModel';
this.parentColumnPath = 'Id';
this.filterColumnPath = filterSchemaName;
this.attributes = [{
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrInsuredPersonField',
columnPath: 'UsrInsuredPersonField',
dataValueType: Terrasoft.DataValueType.TEXT,
isRequired: true
},{
type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrDocument',
columnPath: 'UsrDocument',
dataValueType: Terrasoft.DataValueType.LOOKUP
}
];

};
return structure;
});

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

BPM Online 7.2.0.1002.

Деталь расположена на ContractPage.
Переход на эту страницу осуществляется в моем HomeDocumentSection.

Владимир, а при переходе просто из раздела "Документы" нормально работает?

Да, при переходе просто из раздела "Документы" работает нормально.
А при переходи из моего HomeDocumentSection работает нормально только после перегрузки страницы.

Здравствуйте, Владимир!
В таком случае, скорее всего, при переходе не из раздела не инициализируется объект или страница детали.
Попробуйте добавить и то, и другое в блок "Dependencies" страницы "ContractPage".

Добавил, но это не помогло осталась та же ошибка.

Владимир, попробовал воспроизвести ошибку. Выполнил следующее:
1. Добавил объект детали:

2. Добавил страницу детали. Код:

define('UsrInsuredPersonDetail', ['ext-base', 'terrasoft', 'UsrInsuredPerson', 'UsrInsuredPersonDetailStructure',
    'UsrInsuredPersonDetailResources'], function(Ext, Terrasoft, UsrInsuredPerson, structure, resources) {
    var filterSchemaName;
    var getContainerConfig = function(id, styles) {
        var container = {
            className: 'Terrasoft.Container',
            items: [],
            id: id,
            selectors: {wrapEl: '#' + id}
        };
        if (styles) {
            container.classes = {wrapClassName: styles};
        }
        return container;
    };
 
    structure.userCode = function() {
 
        this.entitySchema = UsrInsuredPerson;
        this.name = 'UsrInsuredPersonDetailViewModel';
        filterSchemaName = 'Document';
        this.methods.getCustomItemView = function(viewModel, itemKey, action,types) {
 
            Terrasoft.each(types, function(item) {
                item.click = {
                    bindTo: 'myTypeChanged'
                };
            });
            var columns = viewModel.attributes;
            var UsrInsuredPerson = columns[0];
 
            var viewConfig; // = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');
            switch (action) {
                case 'add':
                case 'copy':
                case 'edit':
//var titleConfig = getContainerConfig(itemKey + '-title', 'controlCaption');
                    viewConfig = getContainerConfig(itemKey + '-view');
                    var valueConfig = getContainerConfig(itemKey + '-value');
 
                    var deleteButtonConfig = {
                        id: itemKey + '-delete',
                        className: 'Terrasoft.Button',
                        click: {
                            bindTo: 'delete'
                        }
                    };
 
                    var editConfig = {
                        id: itemKey + '-edit',
                        className: 'Terrasoft.TextEdit',
                        markerValue: UsrInsuredPerson.name,
                        value: {
                            bindTo: UsrInsuredPerson.name
                        }
                    };
 
                    valueConfig.items.push(deleteButtonConfig,editConfig);
                    viewConfig.items.push(valueConfig);
                    break;
 
                case 'view':
                    viewConfig = getContainerConfig(itemKey + '-view', 'detail-view-container-user-class');
 
                    var valueLabel = {
                        className: 'Terrasoft.Label',
                        caption: {
                            bindTo: UsrInsuredPerson.name,
                            bindConfig: {converter: Terrasoft.getTypedStringValue}
                        }
 
                    };
 
                    viewConfig.items.push(valueLabel);
                    break;
            }
 
            return viewConfig;
 
        };
 
        this.loadedColumns = [
            {
                columnPath: 'Id'
            }, {
                columnPath: 'UsrInsuredPersonField'
            },{
                columnPath: 'UsrDocument'
            }
        ];
        this.parentColumnPath = 'Id';
        this.filterColumnPath = filterSchemaName;
        this.attributes = [{
            type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
            name: 'UsrInsuredPersonField',
            columnPath: 'UsrInsuredPersonField',
            dataValueType: Terrasoft.DataValueType.TEXT,
            isRequired: true
        },{
            type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
            name: 'UsrDocument',
            columnPath: 'UsrDocument',
            dataValueType: Terrasoft.DataValueType.LOOKUP
        }
        ];
 
    };
    return structure;
});

На странице добавил в Dependencies объект детали, назвал зависимость по имени объекта - "UsrInsuredPerson".
3. Заместил ContractPage и добавил объект "UsrInsuredPerson" в Dependencies. Код замещающей страницы:

define('ContractPage', ['ext-base', 'terrasoft','sandbox', 'ContractPageStructure','ContractPageResources', 'BusinessRuleModule','ConfigurationEnums'],
    function(Ext, Terrasoft,sandbox, structure, resources, BusinessRuleModule,ConfigurationEnums) {
        structure.userCode = function() {
            this.schema.leftPanel.push({
                name: 'UsrInsuredPerson',
                schemaName: 'UsrInsuredPersonDetail',
                type: Terrasoft.ViewModelSchemaItem.DETAIL,
                filterPath: 'UsrDocument',
                filterValuePath: 'Id',
                caption: 'insured person',
                leftWidth: '60%',
                collapsed: false,
                rightWidth: '40%',
                wrapContainerClass: 'control-group-container',
                visible: true
            });
            this.methods.init = function() {
                this.setReadOnlyDetails(['UsrInsuredPerson'], true);
 
            };
        };
        return structure;
    });

4. Пробую воспроизвести путем перехода на страницу редактирования документа напрямую, то есть чищу кэш, вставляю в адресную строку браузера строку вида "http://localhost:7201/0/Nui/ViewModule.aspx#CardModule/ContractPage/edi…" и все загружается без проблем.
Может я что-то упустил при воспроизведении?

Я уже нашел ошибку. Ошибка была в моем HomeDocumentSection с которого осуществляется переход на страницу где расположена деталь. Спасибо за помощь.

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

Здравствуйте! Я создаю бизнес-процесс, после вопроса пользователя при выборе ответа «Да» хотела добавить «Действия -> Карточка редактирования» возникает ошибка:

Exception Message: Элемент с идентификатором "94c08123-af96-44e5-bb85-4489159613da" не найден
Exception Type: Terrasoft.Common.ItemNotFoundException
Exception Source: Terrasoft.Core

что делать???

Нравится

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

Здравствуйте, Виктория!

Описанную Вами ошибку воспроизвели. На данный момент вопрос передан в департамент разработки. Ответ по данному вопросу будет предоставлен Вам в рамках обращения №0213690.

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

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