Здравствуйте.
Подскажите пожалуйста, есть ли документация (help), где описано какое событие окна или датасета за что отвечает и когда вызывается, последовательность их выполнения ?

Например, function dlDataOnDatasetBeforePost(Dataset, DoPost) работает когда нажимаю на кнопку "OK" документа.

Спасибо.

Нравится

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

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

Да есть, ссылка для ознакомления с событиями Dataset.

dlDataOnDatasetBeforePost - срабатывает не только в момент нажатия на кнопку [Ok], а перед попыткой отправить данные в базу для ее последующей вставки в таблицу,в момент вызова метода из кода:

Dataset.Post();

что на самом деле и происходит в момент нажатия на кнопку.

Если по какой либо причине, необходимо отменить событие post, то в событии dlDataOnDatasetBeforePost необходимо написать код:

DoPost.Value = false;

Здравствуйте Павел. Спасибо !

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

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

В карточке контакта есть поле "Email"
В карточке контрагента есть поле "Домен e-mail"

Нужно реализовать следующую задачу: если при создании контакта в карточке не был указан контрагент, то он определился по Домену e-mail.

Например:
В системе создан контрагент "Компания", у которого "Домен e-mail" указан "gmail.com"
Cоздали контакт "Иванов Иван", у которого указали почту "123@gmail.com" и не указали контрагента. После добавления записи, контрагент должен подставиться автоматически, то есть "Компания"

Создан БП, который должен запускаться при создании контакта и если в карточке контакта не указан контрагент. В качестве начального события используется Сигнал (если добавлен контакт), далее элемент Чтение контакта (считываем данные добавленного контакта). Далее нам нужно найти контрагента, чей домен содержится в e-mail клиента.

Как это реализовать? Ведь я от контакта получаю почту "123@gmail.com", а в домене контрагента указан gmail.com

Нравится

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

"Гольфельд Елена Андреевна" написал:В карточке контрагента есть поле "Домен e-mail"

Добрый день Елена!!!

поле "Домен email" это постоянное поле? или данное поле создано в средствах связи контрагента. поясните данный момент.

"Гольфельд Елена Андреевна" написал:Как это реализовать? Ведь я от контакта получаю почту "123@gmail.com", а в домене контрагента указан gmail.com

а в этом вам поможет следующая документация с сайта Майкрасофт. String.Split

т.е вам Елена после получения емайл его нужно распарсить (разделить на части) и полученный домен сравнить с доменом контрагента. вот решение вашего вопроса.

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

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

В системе такая логика реализована при загрузке писем в систему - на деталь "Участники активности" добавляются контакты, у которых на детали средство связи есть записи, которые совпадают со значениями в поле "От кого", "Кому", "Копия". Поскольку в email приходят значения вида test@test.test<'Test email user'>, то данное выражение по регулярному выражению преобразовывается в email вида test@test.test. И уже после преобразования значения сравниваются.

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

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

Нравится

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

Первое, что пришло в голову - для пользователей поле TextEdit вместо старого (или что там у вас, без привязки к датасету) на карточке, по ОК чтение содержимого поля, вызов хранимой процедуры (сначала предложил функцию, но возвращать нечего наверное ей:)) с параметрами (RecordID, EditValue) на сервере, которая пишет от имени db_owner что надо и куда надо.
Плюс понятное дело заполнение поля на событии onPrepare окна

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

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

"Радчук Виталий Владимирович" написал:по дебагеру прошелся записало и сохранило

правильно, на уровне сервисов TS как бы сохраняется, но у пользователя не прав на запись на уровне сервера в таблицу, вот это надо и обходить - процедурой, где запрос выполняется от другого имени

что то типа такого в коде
CREATE PROCEDURE [dbo].[tsp_NevermindRightsManagement]
WITH EXECUTE AS 'dbo'

не забудьте права пользователям на выполнение процедуры дать

Все получилось, спасибо

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

Добрый день.
Есть такой метод Terrasoft.showInputBox, который выводит всплывающее окно по центру экрана, в котором можно отобразить свои кастомные поля.
Как в такое окно добавить выпадающий список и наполнить его данными?
А также как расширить текстовое поле "Текст" на несколько строчек?
Вот наш код:

            SendSMS: function(){
                Terrasoft.showInputBox(
                    "Отправить СМС", function() {}, ["ok", "cancel"], null, {
                        caption: {
                            dataValueType: Terrasoft.DataValueType.ENUM,
                            caption: 'Шаблоны',
                            value: 'test',
                            isRequired: false
                        },
                        name : {
                            dataValueType: Terrasoft.DataValueType.TEXT,
                            caption: 'Текст',
                            value: '',
                            isRequired: true
                        }
                    },
                    {
                        defaultButton: 0
                    })
            },

 

Нравится

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

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

Заполнение выпадающего списка ранее обсуждалось в этой теме.

Для многострочности поля попробуйте добавить признак:

"contentType": Terrasoft.ContentType.LONG_TEXT

Спасибо за ответ.
Как я понял надо использовать list и prepareList.
Но я не понял откуда оно будет брать метод в bindTo (EntityVirtualList и getEntityItems).
Есть ли примеры реализации этих методов.
Также пробовал добавить "contentType": Terrasoft.ContentType.LONG_TEXT, не помогло.

Terrasoft.showInputBox(
                    "Отправить СМС", function() {}, ["ok", "cancel"], null, {
                        caption: {
                            dataValueType: Terrasoft.DataValueType.ENUM,
                            caption: 'Шаблоны',
                            list: {
                                bindTo: 'EntityVirtualList'
                            },
                            prepareList: {
                                bindTo: 'getEntityItems'
                            },
                            isRequired: false
                        },
                        name : {
                            dataValueType: Terrasoft.DataValueType.TEXT,
                            caption: 'Текст',
                            value: 'test',
                            "values": {
                                "layout": {
                                    "rowSpan": 3
                                },
                                "contentType": this.Terrasoft.ContentType.LONG_TEXT
                            },
                            isRequired: true
                        }
                    },
                    {
                        defaultButton: 0
                    })

"Маланчак Василий Тарасович" написал:Но я не понял откуда оно будет брать метод в bindTo (EntityVirtualList и getEntityItems).

Добрый день Василий!!!

- EntityVirtualList описываете в Атрибутах формы как коллекция
- getEntityItems это метод получения и загрузки в список результатов какой-либо SQL выборки, т.е с помощью EntitySchemaQuery создаете запрос, выполняете его. Результат выполнения запроса описываю ниже:

documentIssuanceSelect.getEntityCollection(function(response) {
     if (response.success) {
          var responseItems = response.collection.getItems();
          var columnList = {};
          Terrasoft.each(responseItems, function(item) {
               columnList[item.get("Id")] = {
                    value: item.get("Id"),
                    displayValue: item.get("Contact")
               };
          });
          list.clear();
          list.loadAll(columnList);
     }
}, this);

в данном примере я как раз загружал список контактов в выпадающее меню.

Спасибо за ответ.

Не работает.
Для теста взял выборку с таблицы SysCulture чтобы не меня запрос.
Сделал так:

attributes: {
            EntityVirtualList: {
                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                name: "EntityVirtualList",
                isCollection: true
            }
        },
...
 
SendSMS: function(){
                Terrasoft.showInputBox(
                    "Отправить СМС", function() {}, ["ok", "cancel"], null, {
                        caption: {
                            dataValueType: Terrasoft.DataValueType.ENUM,
                            caption: 'Шаблоны',
                            list: {
                                bindTo: 'EntityVirtualList'
                            },
                            prepareList: {
                                bindTo: 'getEntityItems'
                            },
                            isRequired: false
                        },
                        name : {
                            dataValueType: Terrasoft.DataValueType.TEXT,
                            caption: 'Текст',
                            value: 'test',
                            "values": {
                                "layout": { "column": 0, "row": 0, "colSpan": 24, "rowSpan": 2 },
                                "contentType": this.Terrasoft.ContentType.LONG_TEXT
                            },
                            isRequired: true
                        }
                    },
                    {
                        defaultButton: 0
                    })
            },
            getEntityItems: function() {
                var cultureSelect = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "SysCulture"});
                cultureSelect.addColumn("Id");
                cultureSelect.addColumn("Name");
                cultureSelect.getEntityCollection(function(response) {
                    var list = this.get("languageList");
                    if (response.success) {
                        var responseItems = response.collection.getItems();
                        var columnList = {};
                        Terrasoft.each(responseItems, function(item) {
                            columnList[item.get("Id")] = {
                                //value: item.get("Id"),
                                displayValue: item.get("Name")
                            };
                        });
                        list.clear();
                        list.loadAll(columnList);
                    }
                }, this);
            },
define("ContractPageV2", [],
    function() {
        return {
            entitySchemaName: "Contract",
            attributes: {
                 .....
            }
        };
    });        

вот пример где именно нужно описать EntityVirtualList как коллекция.

"EntityVirtualList": {
     "dataValueType": Terrasoft.DataValueType.COLLECTION
},

"Маланчак Василий Тарасович" написал://value: item.get("Id"),

Василий здесь комментировать не нужно. Вы как потом узнаете Id выбранной записи? И как описать коллекцию, об этом написал выше. Далее уже берем Дебаггер и смотрим что у вас получается. Но скорее всего не получается из-за того, что Запросы у нас асинхронные, а страница к тому моменту, как исполнится запрос уже отрисуется и конечно в коллекции будет НУЛЛ. Коллекцию нужно формировать перед отрисовкой страницы. И тогда у вас все будет работать корректно.

Здравствуйте, контролл «MessageBox» слишком упрощен, и не подходит для того что Вы хотите реализовать. Он не работает в контексте вызывающей страницы и не использует её атрибуты.

Вам необходимо использовать модальное окно, которое под собой имеет полноценную схему страницы. С атрибутами, сообщениями, методами.
Для Вашей задачи подходит «ModalBox», примеры использования которого, в системе, это: «WelcomeScreen», «MapsModule», «SupplyPaymentProductDetailModalBox», «TagModuleSchema».

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

Исходные коды:
modulmodalnogookna.txt
stranicamodalnogookna.txt
vyzovizkartochkikontakta.txt

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

Вызов из карточки контакта, это замещающая схема карточки контакта.

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

Добрый день Максим!!!

да я модальными окнами пользуюсь, пусть немного не так но пользуюсь. Я описываю свои модальные окна по отдельности, View и ViewModel. Так нас учили еще когда была 7.3 версия. Так приучает к дисциплинированности. Ваш вариант очень интересен и удобен, но в данном варианте большую часть работы делает Генератор страницы.

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

разъясните данную ситуацию. Спасибо!!!

Спасибо за ответ.
Но есть некие проблемы с отображением полей на карточке.
Если ставить "parentName": "MyGridContainer" то не работает коректно.
Не отображается поле для ввода, и кнопка работает с "глюками"(нажимается не с первого раза).
Если же "parentName": "MyContainer" то элементы отображаются и работают, но нет возможности использовать свойства layout .
Скрин окна прилагаю.

Василий день добрый!!!

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

Добрый день
Делал полностью по примеру.
1. Создал Схему модели представления карточки (UsrMyModalPage), скопировал код из stranicamodalnogookna.txt
2. Создал Модуль(UsrMyModalModule), Скопировал в него текст из modulmodalnogookna.txt, добавил зависимость на UsrMyModalPage ( Custom ).
3. Заместил страницу контакта. Скопировал код из vyzovizkartochkikontakta.txt.
Своей логики пока не добавлял никакой

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

Пример во вложении:
usrmymodalpage.txt

В случае если что-то нужно иначе спозиционировать, можно дописать и подключить к странице пользовательские CSS стили.

Результат:

Добрый день! подскажите, у кого нибудь получилось? Я повторяю пример и появляется только чистый модалбокс. В консоли ошибка : Script error for "UsrMyModalPageStructure"  :(

Надежда, обратите внимание, что это примеры для довольно старой версии 7.7, сейчас актуальна уже 7.17. Какой именно пример из переписки Вы использовали? Есть более подробная информация об ошибке, в отладчике выполнение не смотрели?

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

Добрый день!
Коллеги подскажите как реализовать следующую задачу,
мне нужно в разделе в пункте меню «Действия» , в базе выполнить запрос (select )
затем результат выгрузить в Excel файл.

спасибо!

Нравится

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

Добрый день Евгений!!!

зачем писать вам запрос если вы можете с помощью "Расширенного фильтра" выполнить фильтрацию и результат Экспортировать в Эксель в формате CSV. Для выполнения экспорта в Эксель в CSV формате в меню Действия есть пункт меню "Экспортировать список в файл".

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

Евгений, или использовать расшиенный фильтр (с/без агрегирующих фильтров)

или писать запрос с помощьб ESQ - https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/rabota-s-danny…

Евгений день добрый!!!

а зачем писать запрос, если результатом будет пользоваться пользователь. И как известно у пользователей всегда аппетиты меняются. Вам тогда все время придется переписывать запрос. А не легче вашу задачу разделить на более мелкие и уже отсюда настроить для пользователей Расширенные фильтры?

Добрый день!
Дело в том что задача именно поставлена таким образом, и результатом нужен файл который будет доступен другим пользователям (без врм), и потом это начальная задача нужна чтобы получить опыт работы с функционалом, в дальнейшем использовать для создания других более сложных отчетов.
Хотелось бы получить информацию именно по поставленной задаче, а не обходные пути решения при помощи фильтров.

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

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

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

Есть у меня нестандартная выгрузка.... Могу в почту скинуть инструкцию. Только select у вас "жесткий" будет в этом случае.

Добрый день! Рассматриваю все варианты, у меня запрос в любом случае там большой,
если не сложно то на envg@mail.ru можете скинуть?

к тому же в инструкции выше сам процесс выгрузки в excel не описан, или до него не дошел.

"Дмитрий Степанов" написал:Есть у меня нестандартная выгрузка.... Могу в почту скинуть инструкцию. Только select у вас "жесткий" будет в этом случае.

Дмитрий день добрый!!!

поделитесь пожалуйста и со мной нестандартной выгрузкой, для повышения опыта. Спасибо!!! мой емайл vlasov-mv@yandex.ru

коллеги возник вопрос

в запросе

showInfo: function() {
var test = this.get("ActiveRow");
var test1 = this.get("projektsumm");
this.showInformationDialog(test1);
},

значение ActiveRow (test) отображается в окне , а когда пытаюсь выдать сообщение
со значением в поле projektsumm пусто

"Евдокимов Евгений" написал:значение ActiveRow (test) отображается в окне , а когда пытаюсь выдать сообщение
со значением в поле projektsumm пусто

Евгений "projektsumm" - это объект или значение, т.е это справочная информация Lookup или Значение Decimal? плюс метод "showInformationDialog" первым значение "caption" принимает строковое значение. хотя это может быть не причиной. нужно смотреть вам Евгений, что у вас возвращает "this.get("projektsumm")".

это значение -дробное число.
так же пробовал выводить accountid (это ссылка на Контрагента)
тоже пустое окно выходит

Вы когда дробное число объявляли, точность указали? :)
Инструкция во вложении

да Decimal (18,2)
спасибо за инструкцию, будем рабираться

Да не то!

"InPrice": {
dataValueType: Terrasoft.DataValueType.FLOAT,
precision: 2
},

Вопрос Дмитрий. А как точность влияет на вывод данных на экран? Ваше мнение. Я все больше склонялся к тому, что тип данных не соответствовал входящим параметрам метода "showInformationDialog". Но какие только эксперименты на Яваскрипте не провел, это не повлияло. На C# да влияет все. Яваскрипт более гибгий оказался к данному вопросу. Как я уже писал выше не видя полностью кода, иногда очень сложно ответить на данные вопросы. так как у себя тестируешь все это-же самое элементарное, все работает.

как говорят в медецине. неверно собранный анамнез :)

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

вот весь кусок кода
define('DPZzayvkiSection', ['GridUtilitiesV2','GeneralDetails','BusinessRuleModule',"GoogleIntegrationUtilities", "RightUtilities",
"ConfigurationConstants", "GoogleIntegrationUtilitiesV2"],

function(resources,GoogleUtilities) {
return {
entitySchemaName: 'DPZzayvki',
contextHelpId: '1001',
diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
messages: {},
methods: {

getSectionActions: function() {
var actionMenuItems = this.callParent(arguments);
actionMenuItems.addItem(this.getButtonMenuItem({
//Type: "Terrasoft.MenuSeparator",
Caption: "Проверить суммy на лимит",
Enabled: { "bindTo": "isAnySelected" },
Click: { bindTo: 'showInfo'},
}));
actionMenuItems.addItem(this.getButtonMenuItem({
//Type: "Terrasoft.MenuSeparator",
Caption: "in Excel",
Enabled: { "bindTo": "isAnySelected" },
Click: { bindTo: 'report'},
}));

return actionMenuItems;
},
showInfo: function() {
var test = this.get("number");
this.showInformationDialog(test);
},

проблемное место выделил поле number строковое
и в этом случае диалоговое окно пустое
я в замешательстве , кроме ActiveRow никакие значения не выводятся(
хочу понять что я делаю не так?

а что-то у меня сомнения в this.

var activeRow = this.get("ActiveRow");
var item = this.get("GridData").get(activeRow);
var account = item.get("Account"); // например

но только вы имейте в виду, что item = this.get("GridData").get(activeRow); вам даст только то, что изображено в гриде. Если хотите что-то еще, то придется esq применять. Как - примеров полно.

selectRegnumOtherAccount: function(callback, regnum, config) {
var viewModel = this;
var recordId = this.get("Id");
var select = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Account"
});
select.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "Id");
select.addColumn("Name");
select.addColumn("UsrRegNumber");
var filters = Ext.create("Terrasoft.FilterGroup");
filters.addItem(select.createColumnFilterWithParameter(Terrasoft.ComparisonType.NOT_EQUAL, "Id",
recordId));
filters.addItem(select.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrRegNumber",
regnum));
select.filters = filters;
select.execute(function(response) {
if (response.success) {
if (response.collection.getCount() > 0) {
var selectAccount = response.collection.getByIndex(0);
viewModel.set("myOtherAccountId", selectAccount.get("Id"));
viewModel.set("myExistsOtherAccount", true);
callback.call(this, response);
} else {
viewModel.set("myExistsOtherAccount", false);
callback.call(this, response);
}
}
}, viewModel);
},

вот что получается

а если number строковое поле то снова пустое окно

после того как добавил колонку в грид
number стал отображаться в окне

"Евдокимов Евгений" написал:после того как добавил колонку в грид
number стал отображаться в окне

Евгений так это естественно. Все колонки в запрос не попадают. Попадают только те которые есть в профили Раздела и те которые мы ручками добавляем в метод Раздела "getGridDataColumns". Вот его пример:

getGridDataColumns: function() {
     var gridDataColumns = this.callParent(arguments);
     if (!gridDataColumns.Document) {
          gridDataColumns.Document = {
               path: "Document"
          };
     }
     return gridDataColumns;
}

с полем account разобрался добавил value и в окне появился id записи

var test = item.get("account").value;

спасибо за примеры!

сложно начинающим разобраться !

Михаил, getGridDataColumns - прикольнее, чем у меня было :) Хотя у меня было универсальнее :)

"Дмитрий Степанов" написал:Хотя у меня было универсальнее :)

А универсальнее это как Дмитрий. Поделитесь опытом. Я иду по стандартным канонам, что заложены в Базовую модель, в Базовые страницы. И вот если что-то стандартного не хватает, вот тогда расширяю, написав при этом новые классы, новые инструменты и т.д.

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

Добрый день!

Каким образом можно разместить в bpmonline ссылки на файлы с корпоративного сервера?

Нравится

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

Здравствуйте, Евгений!

Базовые средства добавляют к ссылкам приставку http://, поэтому реализовать ссылку на корпоративный сервер, используя стандартный функционал детали "Файлы и ссылки" не получится.

Вы можете хранить некликабельные ссылки в поле "Примечания", либо создать дополнительную логику, которая для ссылок вида \\yourservername не будет добавлять в начало http://

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

подскажите пожалуйста а где в системе размещен функционал который подставляет приставку "http://" Что-то сходу не нашел где это в системе. Спасибо!!!

"Власов Михаил Викторович" написал:

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

подскажите пожалуйста а где в системе размещен функционал который подставляет приставку "http://" Что-то сходу не нашел где это в системе. Спасибо!!!


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

Схема BaseCommunicationViewModel, метод getLinkUrl.

"Демьяник Алексей" написал:Базовые средства добавляют к ссылкам приставку http://, поэтому реализовать ссылку на корпоративный сервер, используя стандартный функционал детали "Файлы и ссылки" не получится.

Алексей подскажите пожалуйста, а если хранить URL ссылку с следующем формате:

   file:///C:/Users/Mihail.Vlasov/Downloads/Return%20Book-32.png

разве по данной ссылки мы не сможем скачать файл?

Михаил, увы, даже при таком формате ссылки передаваться не будут. Браузер автоматически добавит http:// и свалится с ошибкой о недоступности сервера. Локальные ссылки в bpm'online не поддерживаются.

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

Доброго дня
Скажіть як можна приховати поле сторінки в режимі перегляду
В режимі редагування я зміг приховати поле таким чином:
structure.userCode = function() {
var dear = this.find('Dear');
dear.visible = false;
}
В режимі перегляду карточки цей код не приховує поле

Нравится

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

Сергей, воспользуйтесь следующим примером кода:

structure.userCode = function() {
this.schema.leftPanel[1].customConfig = { visible: false };
};

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

this.schema.leftPanel[1].items[0].customConfig = { visible: false }

Дякую
Там є також властивість "viewVisible" для відображення поля в режимі перегляду карточки
Як можна прописувати свої стилі для полей карточки? Тобто не використовуючи готові назви класів CSS а напряму писати для прикладу "margin-top" : "10px" ?

У базовых контролов такой возможности нет. Разве что Вы в рантайме после загрузки карточки будете использовать jQuery и дописывать стили. Такой вариант возможен, но не приветствуется.

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

Была создана схема карточки для собственной детали. В нее добавлен следующий код:

define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
"ConfigurationGridUtilities"], function() {
        return {
                entitySchemaName: "UsrProjectParticipant",
                attributes: {
                        "IsEditable": {
                                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                                value: true
                        }
                },
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[{
                        "operation": "merge",
                        "name": "DataGrid",
                        "values": {
                                "className": "Terrasoft.ConfigurationGrid",
                                "generator": "ConfigurationGridGenerator.generatePartial",
                                "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
                                "changeRow": {"bindTo": "changeRow"},
                                "unSelectRow": {"bindTo": "unSelectRow"},
                                "onGridClick": {"bindTo": "onGridClick"},
                                "activeRowActions": [
                                        {
                                                "className": "Terrasoft.Button",
                                                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                                                "tag": "save",
                                                "markerValue": "save",
                                                "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                                        },
                                        {
                                                "className": "Terrasoft.Button",
                                                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                                                "tag": "cancel",
                                                "markerValue": "cancel",
                                                "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                                        },
                                        {
                                                "className": "Terrasoft.Button",
                                                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                                                "tag": "remove",
                                                "markerValue": "remove",
                                                "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                                        }
                                ],
                                "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
                                "activeRowAction": {"bindTo": "onActiveRowAction"},
                                "multiSelect": false
                        }
                }]/**SCHEMA_DIFF*/,
                mixins: {
                        ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
                },
                methods: {}
        };
});

Данный код отрабатывает некорректно, хотя был сделан на основе руководства, по которому можно добавить грид на свою деталь. Его некорректная работа отражается в том, что при попытке добавить запись или редактировать имеющуюся - не отрисовывается строка. Пример на скриншоте.
Как показал отладчик - не работает строка
"generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},

А сама функция выпадает в ошибку undefined на последней строчке
                generateActiveRowControlsConfig: function(id, columnsConfig, rowConfig) {
                        this.columnsConfig = columnsConfig;
                        var gridLayoutItems = [];
                        var currentColumnIndex = 0;
                        this.Terrasoft.each(columnsConfig, function(columnConfig) {
                                var columnName = columnConfig.key[0].name.bindTo;
файла ConfigurationGridUtilities.js
Не подскажите как решить данный вопрос с гридом?

Нравится

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

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

после создания детали, нужно в профили Детали добавить колонки. Так как жестко при инициализации детали у вас не указаны колонки. к примеру в 7.8 есть детали от календаря "WorkingWeekDetail" в данной детали колонки задаются жестко при инициализации детали. В вашем случае их нужно задать в профили детали, вызвав Действие --> Настройка колонок.

"Власов Михаил Викторович" написал:

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

после создания детали, нужно в профили Детали добавить колонки. Так как жестко при инициализации детали у вас не указаны колонки. к примеру в 7.8 есть детали от календаря "WorkingWeekDetail" в данной детали колонки задаются жестко при инициализации детали. В вашем случае их нужно задать в профили детали, вызвав Действие --> Настройка колонок.


Колонка контакт ведь добавлена в деталь на скриншоте. Или нужно добавить какие то другие колонки?

Тогда Александр в дебагере найдите точно где вылетает Ошибка "undefined" и я вам подскажу из-за чего она вылетела

"Власов Михаил Викторович" написал:

Тогда Александр в дебагере найдите точно где вылетает Ошибка "undefined" и я вам подскажу из-за чего она вылетела

var columnName = columnConfig.key[0].name.bindTo;

Вот эта строчка файла ConfigurationGridUtilities. Функция generateActiveRowControlsConfig. Почему то в 7.7 эта функция возвращает один объект, а в 7.8 массив.

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

показываю эксперимент чтобы вы понимали. Но сначало поясню еще раз метод "generateActiveRowControlsConfig" класса "Terrasoft.ConfigurationGridUtilities" генерирует конфигурацию элементов редактирования активной строки реестра Детали. в методе отрабатывается цикл

this.Terrasoft.each(columnsConfig, function(columnConfig) {
   ....
}, this);

в данном цикле во входящих значениях "columnsConfig" - это массив колонок Профиля детали. Показываю пример на скриншотах.

вот страница редактирования "Сервисов"

На данной странице редактирования есть деталь "Сервисные инженеры". По умолчанию деталь имеет колонки:

При добавление на детали Сервисные инженеры, строка реестра имеет следующий вид:

Если удалить колонку, через "Действия" --> "Настройка колонок". К примеру удаляем "Уровень поддержки", то строка реестра редактирования будет иметь следующий вид:

И в результате как я говорил выше Система массив колонок берет из Профиля детали, если колонки не заданы жестко программно. Поэтому и вопрос вы в профили детали Добавили колонки?

Колонки в профиле детали есть. Смотрите.

Вот стек вызовов где не работает, и стек вызовов где работает.

Почему то в первом случае мы сразу получаем объект, поэтому выпадает в undefined

Еще раз Александр повторюсь, где конкретно вылетает ошибка? у строки

var columnName = columnConfig.key[0].name.bindTo;

метода "generateActiveRowControlsConfig" идет получение массива "columnConfig", далее через точку "key[0]" и так далее где конкретно через точку вылетает ошибка.

Здесь Александр это где? это после key[0], после name, или после bindTo? это первое а второе вы сами ради сравнения разверните стек, что у вас на скриншотах, в 7.7 и в 7.8 и сравните что есть и чего нехватает. вот вам и будет ответ на каком месте выходит ошибка.

После columnConfig. Попытался вызвать команду в консоли columnConfig - все хорошо, попытался вызвать команду columnConfig.key[0] выпадает в ошибку.

Но как избавиться от нее - я не знаю

Провел одинаковые операции на 7.7 и 7.8. Создал объект, в качестве родительского указал - Базовый справочник. Добавил колонку. Добавил деталь. Добавил деталь в раздел. Произвел настройку колонок. Изменил код схемы полученной детали. В результате на версии 7.7 все работает, а на версии 7.8 нет.

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

Данный вопрос будет решен в рамках технической поддержки

"Демьяник Алексей" написал:Здравствуйте, Александр!

Данный вопрос будет решен в рамках технической поддержки

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

так это ошибка 7.8? просто у меня на 7.8 все работает. Уже и с нуля писал данный код, и мой старый код пробовал, все работает.

"Власов Михаил Викторович" написал:День добрый Алексей!!!

так это ошибка 7.8? просто у меня на 7.8 все работает. Уже и с нуля писал данный код, и мой старый код пробовал, все работает.

Не покажите пример простого грида, который у Вас на 7.8 работает?

"Бахматов Александр Валерьевич" написал:
Власов Михаил Викторович пишет:

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

так это ошибка 7.8? просто у меня на 7.8 все работает. Уже и с нуля писал данный код, и мой старый код пробовал, все работает.

Не покажите пример простого грида, который у Вас на 7.8 работает?

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

Это не ошибка 7.8.0. В версии 7.8.0 можно найта редактируемый реестр, например, в детали OrderProductDetailV2 - он корректно работает.

"Демьяник Алексей" написал:Здравствуйте!

Это не ошибка 7.8.0. В версии 7.8.0 можно найта редактируемый реестр, например, в детали OrderProductDetailV2 - он корректно работает.

Может быть попробовать тогда использовать тот код карточки, что в детали OrderProductDetailV2? Или этого недостаточно?

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

"Бахматов Александр Валерьевич" написал:
Демьяник Алексей пишет:

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

Это не ошибка 7.8.0. В версии 7.8.0 можно найта редактируемый реестр, например, в детали OrderProductDetailV2 - он корректно работает.

Может быть попробовать тогда использовать тот код карточки, что в детали OrderProductDetailV2? Или этого недостаточно?

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

"Демьяник Алексей" написал:Я не пробовал создавать редактируемые реестры, но по опыту общения с системой понял, что нужно экспериментировать. Скажите, пожалуйста, Ваша деталь наследуется от BaseGridDetailV2?

Да, наследуется, пакет NUI

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

Добрый день!

Реализую возможность добавить информацию о звонке в BPM через OData.

Что я делаю: POST запрос с Content-Type: application/json;odata=verbose;type=entry на https://phonetcomua.bpmonline.com/0/ServiceModel/EntityDataService.svc/CallCollection

JSON имеет такой вид:

{
    "CalledId": "+380990056970",
    "CallerId": "+380990056960",
    "Duration": 400,
    "TalkTime": 299,
    "Direction": {
          "__metadata":{"uri":"??????"}
    },
    "Contact": {
        "__metadata":{"uri":"ContactCollection(guid'97d39836-b242-462a-b375-9daa32e553e4')"}
    }
   
}

Непонятно как указать URI с guid для Direction и Result свойств.

Я знаю возможные значения guid для enum-a CallDirection, но я не знаю как правильно ссылаться на этот объект при добавлении звонка.

Нравится

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

Вопрос снят. Почему то не догадался попробовать CallDirectionCollection.

Почему добавленные через OData звонки не отображаются в разделе Звонки.
Во вкладке История у конктакта краткая информация о звонке отображается.
Если перейти по https://phonetcomua.bpmonline.com/0/Nui/ViewModule.aspx#CardModuleV2/Ca… информация о звонке доступна

"Developer2" написал:Если перейти по https://phonetcomua.bpmonline.com/0/Nui/ViewModule.aspx#CardModuleV2/Cal... информация о звонке доступна

мы как участники сообщества Доступ в базы данных чужих пользователей не имеем. (на доступ мы и ненапрашиваемся :smile: ) Данный доступ есть у вас и я думаю у технической поддержки компании Террасофт. Если у вас есть проблемы, то лучше описывать их более подробно и прикладывать скриншоты.

"Developer2" написал:Почему добавленные через OData звонки не отображаются в разделе Звонки.
Во вкладке История у конктакта краткая информация о звонке отображается.

Сравните записи в базе напрямую, полученную через одата и обычную, разницу и увидите... может типа какого не хватает заполненного
Если ондеманд, поищите тут был sql executer для выполнения запросов

"Александр Кудряшов" написал:Если ондеманд, поищите тут был sql executer для выполнения запросов

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

"Власов Михаил Викторович" написал:

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


"sqlexecuterpage" вот тут

"Александр Кудряшов" написал:
Developer2 пишет:

Почему добавленные через OData звонки не отображаются в разделе Звонки.

Во вкладке История у конктакта краткая информация о звонке отображается.

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

Если ондеманд, поищите тут был sql executer для выполнения запросов

Спасибо за ответ!

Разобрался. Все прикреплялось. Я просто на странице не ту вкладку смотрел. Нужно было на Список переключить.

У меня еще один вопрос. На странице https://academy.terrasoft.ua/documents/customer-center/7-8-0/zapis-i-pr… сказано, что можно прослушивать звонки.
Так вот, я пока через интерфейс пробовал добавить ссылку с записью на разговор, она добавляется, но кнопка прослушать не появляется. Возможно какая-то настройка отключена, поскольку в примечании говорится

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

Можете подсказать будет ли работать через ссылку на аудиозапись или это фича только для Oktell и Webitell?

"Developer2" написал:Можете подсказать будет ли работать через ссылку на аудиозапись или это фича только для Oktell и Webitell

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

"Александр Кудряшов" написал:
Developer2 пишет:

Можете подсказать будет ли работать через ссылку на аудиозапись или это фича только для Oktell и Webitell

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

В принципе при наличии ссылки все что нужно это заставить браузер по клику проиграть запись...

При интеграции с Мегапланом именно так и делали. Вставляли ссылку и затем через chrome extension изменяли страницу.

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

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

Настроен ящик тех.поддержки, при поступлении на него письма, автоматически создается обращение.
Подскажите пожалуйста, столкнулась с такой проблемой: хочется, чтобы некоторые поля в созданном по входящему письму обращении, заполнялись так же автоматически (такие как Категория, Сервис, Группа ответственных и др).
Я так понимаю, данный функционал реализован в IncidentRegistrationFromEmailHelper.
Какие изменения внести, чтоб автозаполнялись нужные поля? Как реализовать данный функционал, может кто-нибудь уже сталкивался с данной задачей?

Нравится

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

Добрый день Елена!!!

функционал по регистрации Инцидента по Входящему письму реализован в классе Terrasoft.Configuration.IncidentRegistrationFromEmailHelper пакета "Case" вызывается метод "RegisterCase" в бизнес-процессе "IncidentRegistrationFromEmailProcess" пакет "SLM". Для решения вашей задачи вам требуется перегрузить метод "CreateNewCaseByEmail" класса Terrasoft.Configuration.IncidentRegistrationFromEmailHelper. Если не знаете как это сделать, то прошу в ответ конкретно описать какие Поля "Обращения" вы желаете заполнить автоматически при получение Входящего письма, я вам помогу перегрузить Класс и Метод класса

"Власов Михаил Викторович" написал:перегрузить метод "CreateNewCaseByEmail"

Разве можно перегрузить данный метод? Он же приватный и не виртуальный

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

"Власов Михаил Викторович" написал:Можно пойти по пути отлавливать событие когда уже обращение Создано

Как выполнить данное действие?

"Власов Михаил Викторович" написал:Апдейтить данное обращение добавляя недостающую информацию

командой SetColumnValue(Название_поля_в_обращении, Значение)???

"Гольфельд Елена Андреевна" написал:Как выполнить данное действие?

Данной действие нужно выполнить с помощью Бизнес-процесса. Где начало бизнес-процесса это "Начальные события" --> "Сигнал". Ниже пример инициализации "Сигнала":

"Гольфельд Елена Андреевна" написал:командой SetColumnValue(Название_поля_в_обращении, Значение)???

да все верно получаете Сущность Обращение и выполняете обновление полей, после сохраняетесь, делаете это все в скрипте бизнес-процесса

Спасибо за помощь, сделала через БП заполнение нужных мне полей.

Пожалуйста Елена. Всегда рады вам и всем пользователям сообщества помочь. Хорошего дня!

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