Вопрос

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

 

 

define("InvoiceProductPageV2", [], function() {
    return {
        entitySchemaName: "InvoiceProduct",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        attributes: {
                "Usrcenabez": {
                    dataValueType: Terrasoft.DataValueType.FLOAT,
                    dependencies: [
                        {
Amount].
                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],
                            methodName: "calculatecenabezNDS"
                        }
                    ]
                },
                "UsrNDS": {.
                    dataValueType: Terrasoft.DataValueType.FLOAT,
                    dependencies: [
                        {
                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],
                            methodName: "calculatebezNDS"
                        }
                    ]
                },
                "UsrbezNDS": {
                    dataValueType: Terrasoft.DataValueType.FLOAT,
                    dependencies: [
                        {
                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],
                            methodName: "calculateNDS"
                        }
                    ]
                },
                "UsrStoimsdos": {
                    dataValueType: Terrasoft.DataValueType.FLOAT,
                    dependencies: [
                        {
                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],
                            methodName: "calculateStoim"
                        }
                    ]
                },
                "Usrcenasdost": {
                    dataValueType: Terrasoft.DataValueType.FLOAT,
                    dependencies: [
                        {
                            columns: ["UsrStoimsdos", "Quantity"],
                            methodName: "calculateCena"
                        }
                    ]
                }
            },

            methods: {
                onEntityInitialized: function() {
                                        this.callParent(arguments);
                                        this.calculateCena();
                                    },
                calculateCena: function() {
                                        var ct = this.get("UsrStoimsdos");
                                        var kol = this.get("Quantity");
                                            //}
                                        var res = ct / kol;
                                        this.set("Usrcenasdost", res);
                                    },
                onEntityInitialized: function() {
                                        this.callParent(arguments);
                                        this.calculatecenabezNDS();
                                    },
                calculatecenabezNDS: function() {
                                        var q = this.get("UsrbezNDS");
                                        var g = this.get("Quantity");
                                        var rez = q / g;
                                        this.set("Usrcenabez", rez);
                                    },.
                onEntityInitialized: function() {
                                        this.callParent(arguments);
                                        this.calculatebezNDS();
                                    },
                calculatebezNDS: function() {
                                        var ob = this.get("UsrStoimsdos");
                                        var dt = this.get("UsrbezNDS");
                                        var rez = ob - dt;
                                        this.set("UsrNDS", rez);
                                    },
                onEntityInitialized: function() {
                                        this.callParent(arguments);
                                        this.calculateNDS();
                                    },
                calculateNDS: function() {
                                        var st = this.get("UsrStoimsdos");
                                        var rez = st / 1.18;].
                                        this.set("UsrbezNDS", rez);
                                    },
                onEntityInitialized: function() {
                                        this.callParent(arguments);
                                        this.calculateStoim();
                                    },
                calculateStoim: function() {
                                        var amount = this.get("TotalAmount");
                                        var dost = this.get("Usrfff");
                                        var result = amount + dost;\
                                        this.set("UsrStoimsdos", result);
                                    }
            },
            rules: {},
            businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/
        };
});
 

У меня такой же вопрос

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

Алена, добрый день. Если под "добавление записи" вы подразумеваете сохранение, вам необходимо переопределить метод save или onSaved и вызвать в нем ваши методы. Если речь об открытии карточки новой записи - аналогичные действия для методы onEntityInitialized.

Кот Владимир Владимирович,

Можете подробно рассказать как мне это сделать?

Алена, да, конечно. Повторно посмотрев ваш код стало ясно что вы были на правильном пути. Ваши methods должны выглядеть так: 

onEntityInitialized: function() {
	this.callParent(arguments);
	this.calculateCena();
	this.calculateNDS();
	this.calculatebezNDS();
	this.calculatecenabezNDS();
	this.calculateStoim();
},
calculateCena: function() {
	var ct = this.get("UsrStoimsdos");
	var kol = this.get("Quantity");
		//}
	var res = ct / kol;
	this.set("Usrcenasdost", res);
},
calculatecenabezNDS: function() {
	var q = this.get("UsrbezNDS");
	var g = this.get("Quantity");
	var rez = q / g;
	this.set("Usrcenabez", rez);
},
calculatebezNDS: function() {
	var ob = this.get("UsrStoimsdos");
	var dt = this.get("UsrbezNDS");
	var rez = ob - dt;
	this.set("UsrNDS", rez);
},
calculateNDS: function() {
	var st = this.get("UsrStoimsdos");
	var rez = st / 1.18;].
	this.set("UsrbezNDS", rez);
},
calculateStoim: function() {
	var amount = this.get("TotalAmount");
	var dost = this.get("Usrfff");
	var result = amount + dost;\
	this.set("UsrStoimsdos", result);
}

 

Кот Владимир Владимирович,

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

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

save: function() {
	this.calculateCena();
	this.calculateNDS();
	this.calculatebezNDS();
	this.calculatecenabezNDS();
	this.calculateStoim();
	this.callParent(arguments);
}

 

Кот Владимир Владимирович,

Владимир.   

    "Usrcenabez": {
                // Тип данных колонки модели представления.
                    dataValueType: Terrasoft.DataValueType.FLOAT,
                // Массив конфигурационных объектов, определяющих зависимости колонки [UsrBalance].
                    dependencies: [
                        {
                        // Значение колонки [UsrBalance] зависит от значений колонок [Amount] 
                        // и [PaymentAmount].
                            columns: ["TotalAmount", "Usrfff", "Quantity", "Price", "DiscountPercent"],
                        // Метод-обработчик, который вызывается при изменении значения одной из колонок [Amount] 
                        // и [PaymentAmount].
                            methodName: "calculatecenabezNDS"
                        }
                    ]
                },

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

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

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

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

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

Возникла необходимость доработать раздел шаблонов email сообщений. Добавил замещающую схему для раздела и страницы. Если входить в раздел из справочников, то всё работает нормально, но если зайти в раздел напрямую из меню разделов, то страница падает с ошибкой 

Uncaught TypeError: Cannot read property 'primaryDisplayColumn'//msk10crm3.simple.ru:886/0/configuration/69de87c92ca4b610d0b1c9948902105fru-RU/ProfileUtilities.js
 line: 90
 column: 45
 message: Uncaught TypeError: Cannot read property 'primaryDisplayColumn' of undefined 
 date: Tue Dec 19 2017 19:47:38 GMT+0300 (Russia TZ 2 Standard Time)
 stack: TypeError: Cannot read property 'primaryDisplayColumn' of undefined
    at constructor.<anonymous> (https://msk10crm3.simple.ru:886/0/configuration/69de87c92ca4b610d0b1c9948902105fru-RU/ProfileUtilities.js:90:45)
    at constructor.nextStep (https://msk10crm3.simple.ru:886/0/core/hash/Terrasoft/utils/common/commonutils.js:103:10)
    at https://msk10crm3.simple.ru:886/0/core/hash/Terrasoft/utils/common/commonutils.js:488:12
    at Object.execCb (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:1693:33)
    at Module.check (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:881:51)
    at Module.enable (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:1173:22)
    at Module.init (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:786:26)
    at https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:1457:36

Также возникла проблема при попытке скрыть действие активной строки в зависимости от значения атрибута на странице. Если привязать видимость действия к атрибуту, то оно вообще перестаёт отображаться вне зависимости от его значения. Значение атрибута определяется при помощи запроса к сервису, сам метод вызывает из onRender. 

//attributes
            CanAddOrEdit: {
                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                value: false
            },
//diff
            {
                "operation": "merge",
                "name": "DataGridActiveRowCopyAction",
                "values": {
                    "visible": {"bindTo": "CanAddOrEdit"}
                }
            }

Кто-то либо сталкивался с подобными проблемами?

У меня такой же вопрос

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

Добрый день!
На счет первого вопроса: можете уточнить что именно вы дорабатывали, т.к. не совсем ясен характер ошибки. Если можете - представьте ваш код раздела шаблонов email.

А на счет второго вопроса - сложность в том, что строчка реестра - это чаще всего BaseSectionGridRowViewModel (если он для раздела не переопределен) и он не видит атрибуты и методы, которые определены в разделе. Для того, чтобы переопределить свой SectionGridRowViewModel необходимо для начала сообщить разделу, что у него будет другой SectionGridRowViewModel, переопределив метод в разделе:

getGridRowViewModelClassName: function() {
	return "Terrasoft.UsrEmailTemplateSectionGridRowViewModel";
}

В данном примере имя одной строки раздела будет определено как UsrEmailTemplateSectionGridRowViewModel. diff остается такой же, как указан у вас.

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

define("UsrEmailTemplateSectionGridRowViewModel", ["ext-base",
	"terrasoft", "BaseSectionGridRowViewModel"],
	function(Ext, Terrasoft) {
 
	Ext.define("Terrasoft.configuration.UsrEmailTemplateSectionGridRowViewModel", {
		extend: "Terrasoft.BaseSectionGridRowViewModel",
		alternateClassName: "Terrasoft.UsrEmailTemplateSectionGridRowViewModel",
		CanAddOrCopy: function() {
			var result = ... //логика для определения видимости кнопки
			return result;
		}
	});
	return Terrasoft.UsrEmailTemplateSectionGridRowViewModel;
});

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

Напишите, получилось ли у вас и уточните более подробно на счет первого вопроса, будем разбираться :)

Золотарев Артем Андреевич, Ошибку с замещением удалось исправить, проблема была в том, что в коде замещающей схемы не было явно указано значение entitySchemaName.

Спасибо за пример со строками реестра. Он заработал. Но у меня такой вопрос, как можно задать значение извне или самой RowViewModel взять его? У меня возможность добавлять, изменять или копировать определяется единоразово при обращении к сервису. Не хотелось бы делал вызов к сервису при клике на каждую строку.

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

define("SxEmailTemplateSectionGridRowViewModel", ["ext-base",
    "terrasoft", "BaseSectionGridRowViewModel"],
    function(Ext, Terrasoft) {
 
    Ext.define("Terrasoft.configuration.SxEmailTemplateSectionGridRowViewModel", {
        extend: "Terrasoft.BaseSectionGridRowViewModel",
        alternateClassName: "Terrasoft.SxEmailTemplateSectionGridRowViewModel",
        statics: {
            _canAddOrEdit: false,
            setCanAddOrEdit: function(value) {
                _canAddOrEdit = value;
            },
            getCanAddOrEdit: function() {
                return _canAddOrEdit;
            }
        },
        getCanCopy: function() {
            return Terrasoft.SxEmailTemplateSectionGridRowViewModel.getCanAddOrEdit();
        }
    });
    return Terrasoft.SxEmailTemplateSectionGridRowViewModel;
});

 

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

Помогите плз. с проблемой:

при попытке сохранить пакет в среде разработки, система выдает ошибку, якобы в пакете, от которого зависит текущая разработка, не указанно хранилище системы контроля версий. Но он - пакет, предоставленный вендером.

Как можно зафиксировать изменения моего пакета? 

У меня такой же вопрос

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

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

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

Denys Diachenko,

Да, спасибо. Именно так я и поступил:

- создал новый пакет

- перенес все схемы в него

- зафиксировал изменения

- успешно выгрузил из SVN

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

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

1. Можно ли использовать для детали filterMethod, как в основной версии, или каким-либо образом использовать произвольный фильтр, а не только по колонке родительской страницы?

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

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

У меня такой же вопрос

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

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

1. Для деталей можно указывать фильтры, используя метод configure() соотв. sdk-класса:

 

Terrasoft.sdk.Details.configure("Contact", "ActivityDetailV2StandartDetail", {
   filters: Ext.create("Terrasoft.Filter", {
      type: Terrasoft.FilterTypes.Group,
      subfilters: [
         Ext.create("Terrasoft.Filter", {
            compareType: Terrasoft.ComparisonTypes.NotEqual,
            property: "Type",
            value: Terrasoft.GUID.ActivityTypeEmail
         })
      ]
   })
});

2. В целом, изменение режима работы детали делается так:

Terrasoft.sdk.Details.setChangeModes("Contact", "ActivityDetailV2StandartDetail", [Terrasoft.ChangeModes.Read]);

Но если нужно менять режим работы от условия, то для этого в контроллерах страниц есть метод getChangeModes(). Т.е. в контроллерах соотв. страниц (грида, просмотра, редактирования) нужно расширить этот метод:

 

getChangeModeOperations: function() {
   var detailConfig = this.getDetailConfig();
   if (detailConfig) {
      var parentRecord = detailConfig.parentRecord;
      if (parentRecord.get("IsNonActualEmail") === false) {
         return {
            canCreate: false,
            canUpdate: false,
            canDelete: false
         };
      }
   }
   return this.callParent(arguments);
}
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Возможно ли расположить кнопку напротив каждой строки детали? Например кнопку "Удалить".

Примерно так:

У меня такой же вопрос

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

И "Редактировать"!

Не знаю как с кнопками в конце, но в схеме разделов можно подсмотреть код и реализовать такой вариант:

Чисто теоретически можно забиндаться к добавлению записи в грид и вставлять свой контейнер с кнопкой на то место что вам требуется. Ну и конечно придётся поиграться со стилями. Что-то подобное мы уже пытались делать. Одно могу сказать что к добавлению элемента в DOM мы уже имели опыт биндинга и выполнения своей логики, а так же создания произвольных HTML элементов на странице.

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

{
	id: "duplicateGrid",
	className: "Terrasoft.Grid",
	type: "tiled",
	primaryColumnName: "Id",
	activeRow: {bindTo: "activeRow"},
	columnsConfig: [columnsConfig],
	collection: {bindTo: "gridData"},
	activeRowAction: {bindTo: "onActiveRowAction"},
	activeRowActions: [
		{
			className: "Terrasoft.Button",
			style: Terrasoft.controls.ButtonEnums.style.BLUE,
			caption: resources.localizableStrings.IsNotDuplicateCaption,
			tag: "IsNotDuplicate",
			visible: {bindTo: "getGridButtonIsNotDuplicateVisible"}
		},
		{
			className: "Terrasoft.Button",
			style: Terrasoft.controls.ButtonEnums.style.BLUE,
			caption: resources.localizableStrings.IsDuplicateCaption,
			tag: "IsDuplicate",
			visible: {bindTo: "getGridButtonIsDuplicateVisible"}
		}
	]
}

 

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

Добрый день коллеги.

При попытке удалить Изменение из раздела "Изменения"

DELETE FROM [dbo].[Change]
Where Number = 'CR00001863'

получил ошибку типа:

The DELETE statement conflicted with the REFERENCE constraint "FK5Kbu9RCt70eQZWfPa41rONXsAM". The conflict occurred in database "NameDB", table "dbo.SysChangeRight", column 'RecordId'.

Залез в таблицу dbo.SysChangeRight - да, там есть записи с данным Id изменения.

Вопрос: достаточно ли будет удаления из таблицы dbo.SysChangeRight записей с Id.изменения, чтобы получить возможность выполнить верхний скрипт? 

У меня такой же вопрос

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

Необязательно. Вдруг есть ещё ссылки из других таблиц.

А вообще, в таблице SysChangeRight должна быть каскадная связь на поле RecordId, чтобы удаляло вместе с основной записью автоматически. Если нет, можно добавить, поставив галочку в объекте.

 

Зверев Александр,

Ссылки из других таблиц были - (деталь: активности) - они удалились каскадно средствами дизайнера. Не удалились каскадно, средствами дизайнера, история по данному Изменению и Согласование данного изменения - это все я "навернул"  запросом в SQL. А дальше - проблема, описанная выше...

Если каскадной связи нет, можно удалить из SysChangeRight запросом.

Зверев Александр,

Спасибо, действительно после удаления из таблицы SysChangeRight смог удалить и само изменение. 

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

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

 

У меня такой же вопрос

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

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

if (this.isAddMode()) {....вызов функций...}

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

Добрый день. Не удается отсортировать справочное поле следующим образом:

"lookupListConfig": {
                    columns: ["Number"],
                    orders: [
                        {
                            columnPath: "Number",
                            direction: Terrasoft.OrderDirection.ASC
                        }
                    ]
                },

У меня такой же вопрос

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

скорее всего Number просто текстовое поле, поэтому сортировка происходит некорректно

Здравствуйте, Павел!

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

"название колонки страницы": {
    dataValueType: Terrasoft.DataValueType.LOOKUP,
        lookupListConfig: {
            orders: [
                  { 
                        columnPath: "колонка справочника, которая сортируется", 
                        direction: Terrasoft.OrderDirection.ASC 
                  }
            ]
        } 
    }

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

Добрый День, есть задача обоготить данные контактов с linkidin. Кто сталкивался с этим? 

У меня такой же вопрос

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

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

 

На текущий момент в базовой версии системы интеграция с LinkedIn не реализована.

Вы можете реализовать её самостоятельно с помощью API.

Более детально можно ознакомиться в статье Академии: https://academy.terrasoft.ru/documents/technic-sdk/7-11/integraciya-s-s…

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

Добрый день, Коллеги!

Кейс:

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

Речь идёт о действии FillEmailTemplateUserTask - обработать шаблон письма с макросами.

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

Необходимо:

1) Вызвать скриптом Обработку подготовленного шаблона, передавая в него необходимые параметры такие как:

RecordId

TemplateId

SysEntitySchemaId

2) Создать активность типа email.

В тело и тему подставить соответственно Subject и Body, обработанные FillEmailTemplateUserTask.

 

Пример выполняемого скрипта:

var userConnection = Get<UserConnection>("UserConnection");
 
var processEmailTemplateUserTask = new FillEmailTemplateUserTask(userConnection);
//передал Guid шаблона
    processEmailTemplateUserTask.TemplateId = new Guid("7EDBEDDE-9E1E-4D80-953D-B7652E6B5F97");
//get UId схемы объекта Изменение
    processEmailTemplateUserTask.SysEntitySchemaId = Get<Guid>("UsrSysShemaUId");
//get Id записи объекта Изменение
    processEmailTemplateUserTask.RecordId = cangeId;
    processEmailTemplateUserTask.Execute(context);
        
var activity = new Terrasoft.Configuration.Activity(userConnection);
    activity.SetDefColumnValues();
    activity.TypeId = Terrasoft.Configuration.ActivityConsts.EmailTypeUId;
    activity.Recepient = "testRecepient@yandex.ru";
    activity.Title = processEmailTemplateUserTask.Subject;
    activity.Body = processEmailTemplateUserTask.Body;
    activity.ChangeId = cangeId;
    activity.IsHtmlBody = true;
    activity.Sender = "testSender@yandex.ru";
    activity.Save();

Проблема:

Пытаюсь передать в создаваемую активность Title и Body после выполнения по идее элемента FillEmailTemplateUserTask.

Однако БП завершается с ошибкой: "Заголовок должен быть заполнен" (обязательная колонка). То есть На моменте создания активности я не получаю обработанной темы и тела письма шаблона с макросами.

 

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

Такое впечатление, что просто не правильно задаю Execute или чего-то не хватает.

 

У меня такой же вопрос

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

Добрый день!!

Элемент [Задание сценарий] не предназначен для запуска и обработки элементов процесса.

Попробуйте использовать связку [Выполнить действие процесса] + [Задание-сценарий]. В ScriptTask замапиться на параметры элемента [Выполнить действие процесса - > Обработать шаблон письма с макросами].

Зарицкий Олег,

Спасибо за информацию! Вытащили скрипт действия в методы!

Войдите или зарегистрируйтесь, чтобы комментировать