Добрый день!

Есть такой метод

            calcCountRec: function() {

                    var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

                        rootSchemaName: "UsrProductInActivity"

                    });

                    esq.addAggregationSchemaColumn("Id",

                        Terrasoft.AggregationType.COUNT, "UsrProductInActivityCount");

                    esq.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "UsrActivity",  this.get("UsrActivity").value));

                    esq.getEntityCollection(function(response) {

                        if (response.success) {

                            var collection = response.collection;

                           if (collection) {

                                this.set("CountRec", collection.getByIndex(0).get("UsrProductInActivityCount"));

                            }

                        }

                    }, this);

                    

                },

 

где CountRec - это виртуальный атрибут

            "CountRec": {

                "type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                "dataValueType": this.Terrasoft.DataValueType.FLOAT

            }

 

 

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

Подскажите, где и как можно вызвать метод calcCountRec, чтобы значение CountRec не было undefined ? (может быть надо как-то сам метод изменить?)

если в save вызвать, и потом в save проверки - то значение undefined

если в onEntityInitialized вызвать, а потом в save проверки - то значение undefined

 

 

Нравится

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

Можно вообще всё вычислять без арибута прямо в методе сохранения. Или сделать обычное поле и заполнять значением суммы при сохранении записи на детали продуктов при помощи БП или триггера.

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

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

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

Так же само, как сейчас вычисляете внутри функции. Но зачем каждый раз вычислять сумму, если можно сделать поле и хранить в нём.

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

Это одно из вычислений(просто пример вычисления)

Есть второе вычисление - в другом методе

                

                calcCurrencyIdFromActivity: function() {

                var activityId = this.get("UsrActivity");

                if (activityId) {

                    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                        rootSchemaName: "Activity"

                    });

                    esq.addColumn("Id");

                    esq.addColumn("UsrCurrency.Id", "CurrencyActivity");

                    esq.filters.add("ActivityId", this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "Id", activityId.value));

                    esq.getEntityCollection(function(response) {

                        if (response && response.success) {

                            if (!response.collection.isEmpty()) {

                                var result = response.collection.getItems()[0];

                                this.set("CurrencyIdActivity", result.get("CurrencyActivity"));

                            }

                        }

                    }, this);

                }

            }

В результате вызова этих двух методов должны получиться значения у двух виртуальных атрибутов. Должны быть некие проверки, зависящие от совокупности значений двух виртуальных атрибутов - в методе сохранения.

типа if this.get("CurrencyIdActivity").value==.. &&  this.get("CountRec").value

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

 

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

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

то есть те же самые 2 метода,вызвать их в методе save, но  внутри методов вместо записи  в виртуальные атрибуты запись в локальную переменную?

то есть вместо, например,

this.set("CountRec", сollection.getByIndex(0).get("UsrProductInActivityCount"));

будет

var cc= сollection.getByIndex(0).get("UsrProductInActivityCount"))

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

Или вы имеете ввиду объединить 2 метода в один как-то?

 

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

 

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

Его не надо записывать в таблицу, подсчет количества был просто в качестве примера. Например, при сохранении карточки "Продукты в активности" нужно вычислить(получить) значение поля Валюта из Активности,  а еще получить значение любого другого связанного поля из другой связанной таблицы(не важно, например, должность контакта).  Вопрос-то же.. не в этом был изначально.. Вопрос был в том как работать с результатом метода...Может быть можно как-то переделать сам метод, чтобы после его выполнения получить значение на выходе, и работать с ним дальше?..

 

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

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

Функция нижеприведенная, к сожалению, не может вернуть ни значения currencyActivity, ни значения sumQuantity, ни значения сс, потому что все эти переменные существуют только  в рамках esq.getEntityCollection(function(response) {...}

calcCheckCurrency: function() {

                var activityId = this.get("UsrActivity");

                if (activityId) {

                    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                        rootSchemaName: "Activity"

                    });

                    esq.addColumn("Id");

                    esq.addColumn("UsrCurrency.Id", "CurrencyActivity");

                    esq.addColumn("UsrSumQuantity","SumQuantity");

                    esq.filters.add("ActivityId", this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "Id", activityId.value));

                    esq.getEntityCollection(function(response) {

                        if (response && response.success) {

                            if (!response.collection.isEmpty()) {

                                var result = response.collection.getItems()[0];

                                var currencyActivity=result.get("CurrencyActivity");

                                var sumQuantity=result.get("SumQuantity");

                                

                                

                                if ((currencyActivity !==this.get("UsrCurrency").value) &&

                                    (

                                    ((this.isAddMode() || this.isCopyMode()) && (sumQuantity>=1))

                                    ||

                                    ((this.isEditMode()) && (sumQuantity>1))

                                    )

                                   )

                                    {

                                        var cc=1;

                                        //this.showInformationDialog("Валюта не совпадает //с ранее выбранной");

                                    }

    

                            }

                        }

                    }, this);

                }

        },

 

                

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

Добрый день! Внутри это где? Не поняла вас.

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

Нужно, если условие не выполняется (условие проверяется внутри getEntityCollection), то выводить предупреждение и не сохранять карточку. Если выполняется, то сохранять карточку.

О методе save написан текст вышеприведенный, условие проверяется внутри getEntityCollection, предупреждение выводится - все прекрасно. Но не понятно, как вызвать здесь родительское стандартное сохранение

Если написать так:

                                if ((currencyActivity !==this.get("UsrCurrency").value) &&

                                    (

                                    ((this.isAddMode() || this.isCopyMode()) && (sumQuantity>=1))

                                    ||

                                    ((this.isEditMode()) && (sumQuantity>1))

                                    )

                                   )

                                    {

                                        var cc=1;

                                        this.showInformationDialog("Валюта не совпадает с ранее выбранной");

                                    }

                                   else this.callParent(arguments);

то возникает ошибка (Cannot read property 'superclass' of undefined)

                            

Если this.callParent(arguments) поставить в методе save в конце всей вышеприведенной функции, то тогда предупреждение выводится, но и сохранение также происходит ( а надо, чтобы не происходило)

 

 

 

 

 

Похожий вопрос решают тут.

 

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

Спасибо, помогла связанная тема 

https://community.terrasoft.ru/questions/pereopredelenie-metoda-save-pr…

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

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

Очень хочется, чтобы вызывался callback при завершении задачи в инструментальной панели. Есть ли такая возможность?

Нравится

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

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

Либо же модифицировать логику при нажатии кнопки в самой миникарточке задачи на этой панели, она реализована в схеме ActivityDashboardItemViewModel.

 

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

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

Всем доброго времени суток!

Нужна Ваша помощь.

Развернул приложение на локальном ПК v7.12

Сайт запускается. но когда аутентифицируюсь в консоли выбивает ошибки:

http://prntscr.com/jav3ap

 

Во вложении так же логи ошибок.

Подскажите, что может быть не так?

Благодарю!

Прикрепленные файлы

Нравится

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

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

Запросите в поддержке "чистые" бинарные файлы 7.12.0.2702-sales-enterprise-marketing-service-enterprise-en и разверните приложение на них. Ранее полученные файлы с облачного приложения отличаются от коробочных, вследствие чего возникает указанная ошибка.

Сергей Кy6риш,

Здравствуйте! Так мне необходима именно данная сборка для доработки функционала и дебага. Ранее разворачивал 7.11.3 данных ошибок не было.

 

Нигрескул Алексей,

У вас и будет именно ваша сборка для доработок и дебаггинга, все что вам нужно хранится в вашей БД.

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

Литвинко Павел,

здравствуйте. У меня SalesEnterprise + Marketing

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

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

Есть файл *.dbf около 25 столбцов и 300000 строк. Нужно импортировать в бд bpm. На данный момент импорт реализован в БП через "Задание-сценарий" и данные успешно импортируются, но это занимает ооочень много времени и блокирует приложение полностью. Как можно ускорить процесс или хотя-бы сделать так, чтобы приложение не висло?

Нравится

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

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

Если система используется on site и вариант выше всё равно работает слишком долго,  то можно подключиться к базе dbf и залить данные в основную базу bpm'online при помощи SQL Server Management Studio. Учтите, при таком сохранении не отработает логика на уровне объектов и БП, её нужно будет реализовать самостоятельно.

Чубко Илья,

Спасибо!

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

Всем привет, есть необходимость подключить стороннюю JS библиотеку.

Создаю свою папку с библиотекой, в этой директории: Terrasoft.WebApp\Resources\ui

папка "ExternalLib", файл ExternalLib.js

В LeadPage:

 define("LeadPageV2", ["LeadPageV2Resources", ......, "jQuery","ExternalLib"

В консоле получаю ошибку("Файл не найден") :

https://xxx.ru/0/ExternalLib.js?hash=0ccc17c0d48d40469d1f114c719c305a

Подскажите пожалуйста, в чем проблема?

 

Нравится

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

Приветствую, Роман!

Таким образом вы не подключите внешнюю библиотеку, т.к. система не знает, что она существует.

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

Здравствуйте! Посмотрите в данной статье описано как использовать файловый контент в пакетах: https://academy.terrasoft.ru/documents/technic-sdk/7-12/ispolzovanie-fa…

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

Добрый день!

Есть активность, продукты в активности.

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

Пересчет общей стоимости происходит в объекте продукты в активности (событие после удаления, после сохранения) в событийном подпроцессе.

 

Общая стоимость пересчитывается, но для того, чтобы обновленное значение общей стоимости отобразилось на странице, приходится перегружать эту страницу(например, f5)

Подскажите, пожалуйста, как можно автоматическое обновление?

 

 

 

Нравится

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

"как можно автоматическое обновление?" это пять :)

обновление можно так:

1) поставить subscriber на деталь

2) делать loadEntity/или просто подгрузку единичного поля

подсмотреть пример - в реализации детали продуктов в заказе. (чтобы долго не искали: функция updateAmount вызывается в ProductEntryPageUtils)

Большое спасибо)

Варфоломеев Данила, сделал как в продуктах в заказе, при создании договора. При изменении продукта в детали сумма не меняется

Без конкретики сложно сказать. Если в оригинале меняется, а в Вашей копии — нет, значит, не всё скопировали.

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

Печатные формы не сохраняются из Ворда в ВРМ.

В логах IIS вижу

PUT /0/ServiceModel/EntityDataService.svc/SysModuleReportCollection(guid'dba75638-ad82-4a16-a64b-60dad3243605')/File - 443 Supervisor 31.44.80.30 Microsoft+ADO.NET+Data+Services - 405 0 0 0

Гуид действительно мой.

Чего не хватает IIS-у?

Нравится

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

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

Проблема может быть в том, что у Вас активна надстройка WebDAV. Для того, чтоб ее деактивировать, необходимо открыть Стартовое меню, найти "Включение или отключение компонентов Windows" ("Turn Windows features on or off"), в блоке IIS найти WebDAVPublishing и деактивировать.

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

Одеяненко Юлия,

нужно ли после деактивации перезагружать сервер или сайт?

Алексей-Карягин, 

такой необходимости нет. Можно только переподключиться к приложению через плагин.

Одеяненко Юлия,

Оказалось что есть :) Но главное, что всё заработало, спасибо!

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

Добрый день!

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

В связи с этим вопрос - какой объект отвечает за Доступ почтового ящика для других пользователей?Изображение удалено.

Нравится

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

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



Права на почтовые ящики храняться в объекте EmailDefRights. В нем Вы можете просматривать/изменять пользователей, которым дано право на тот или иной почтовый ящик.

Анна Журавель,

Добрый день!

Благодарю за ответ. Подскажите пожалуйста, как изменить права в EmailDefRights на Отправку писем (например, через процесс, для manager2 дать доступ на не только к письмам, но и на Отправку писем для manager1)?

Чакур Александр,

Добрый день, Александр!

Наиболее простым способом реализовать данную бизнес-задачу можно использую пользовательские средства системы bpm'online.



В версии 7.12.0 был реализован функционал более гибкой настройки прав доступа на почтовый ящик.

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

После этого Вы сможете выбрать какие права и каким ролям раздавать.

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



Данный способ раздачи прав будет более корректный чем использование запросов в БД поскольку таблица EmailDefRights связана с другими таблицами и устанавливать все необходимые связи между колонками трудоемкая задача, результатом которой могут быть ошибки в работе системы.

 

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

Здравствуйте. Добавила модуль AccountProfile в карточку раздела. Он не отображается. Подскажите что я не правильно сделала?

Ниже представлен код

define("UsrTSiPO2Page", [], function() {

    return {

        entitySchemaName: "UsrTSiPO",

        details: /**SCHEMA_DETAILS*/{

            "AccountAddressDetailV210d08457": {

                "schemaName": "AccountAddressDetailV2",

                "entitySchemaName": "AccountAddress",

                "filter": {

                    "detailColumn": "UsrTS",

                    "masterColumn": "Id"

                }

            },

            "UsrSchema7Detaila426f654": {

                "schemaName": "UsrSchema7Detail",

                "entitySchemaName": "UsrKontLic",

                "filter": {

                    "detailColumn": "UsrTS",

                    "masterColumn": "Id"

                }

            },

            "ActivityDetailV2c61ee416": {

                "schemaName": "ActivityDetailV2",

                "entitySchemaName": "Activity",

                "filter": {

                    "detailColumn": "UsrTSiliPR",

                    "masterColumn": "Id"

                }

            },

            "UsrSchema10Detail2f193796": {

                "schemaName": "UsrSchema10Detail",

                "entitySchemaName": "UsrR",

                "filter": {

                    "detailColumn": "UsrTSiP",

                    "masterColumn": "Id"

                }

            },

            "UsrSchema13Detail0d52d3c2": {

                "schemaName": "UsrSchema13Detail",

                "entitySchemaName": "UsrTSiPOFile",

                "filter": {

                    "detailColumn": "UsrTSiPO",

                    "masterColumn": "Id"

                }

            }

        },

        modules: /**SCHEMA_MODULES*/{

            // Модуль профиля контрагента.

            "AccountProfile": {

                // Конфигурация профиля.

                "config": {

                    // Название схемы.

                    "schemaName": "AccountProfileSchema",

                    // Признак, сообщающий о том, что конфигурация схемы проинициализирована.

                    "isSchemaConfigInitialized": true,

                    // Признак, сообщающий о том, что не используется HistoryState.

                    "useHistoryState": false,

                    // Параметры профиля.

                    "parameters": {

                        // Конфигурация модели представления.

                        "viewModelConfig": {

                            // Название колонки связанной сущности.

                            masterColumnName: "Account"

                        }

                    }

                }

            }, /**SCHEMA_MODULES*/

            diff: /**SCHEMA_DIFF*/[

                {

                    "operation": "insert",

                    "parentName": "LeftModulesContainer",

                    "propertyName": "items",

                // Название профиля.

                    "name": "AccountProfile",

                // Значения.

                    "values": {

                    // Тип элемента — модуль.

                        "itemType": Terrasoft.ViewItemType.MODULE

                    }

                }

            ]/**SCHEMA_DIFF*/

        }

    };

});

 

Нравится

5 комментариев
"viewModelConfig": {
   // ̶ ̶Н̶а̶з̶в̶а̶н̶и̶е̶ ̶к̶о̶л̶о̶н̶к̶и̶ ̶с̶в̶я̶з̶а̶н̶н̶о̶й̶ ̶с̶у̶щ̶н̶о̶с̶т̶и̶.̶
   //Теперь по-русски. Здесь прописывается колонка из ТЕКУЩЕГО объекта (у вас это UsrTSiPO), которая ссылается на справочник контрагентов. Я так подозреваю название колонки что-то вроде UsrAccount
   masterColumnName: "UsrAccount"
}

 

А в консоли отображаются какие-то ошибки?

Потому что написано все правильно. Возможно у вас в вашем пользовательском объекте нет связанной сущности "Account"?

Добавить комментарий

Золотарев Артем Андреевич,

 ошибок в консоли нет. карточку открываю там отображается только лента

Варфоломеев Данила,

 создала справочник контрагента, Назвала UsrAccount. Изменила в коде ничего не изменилась


 
UsrAccount

 

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

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

Приветы,

 

Все методы работали. 

Разработка велась в "своем" пакете, а создавалось изначально поле в кастоме.

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

 

Есть описание

{

                    "operation": "insert",

                    "name": "BpSpeekAddr",

                    "parentName": "GeneralInfoGridLayout",

                    "propertyName": "items",

                    "values": {

                        "dataValueType": this.Terrasoft.DataValueType.ENUM,

                        "caption": "Адрес собеседования",

                        "controlConfig": {

                            "list": {

                                "bindTo": "SpeakAddressItems"

                            },

                            "prepareList": { bindTo: "initSpeakAddressItems" },

                            "placeholder": {

                                "bindTo": "Адрес собеседования"

                            }

                        },

                        "layout": {

                "colSpan": 12,

                "rowSpan": 1,

                "column": 12,

                "row": 4,

                        }

                    }

                },

Нравится

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

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

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

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