Коллеги, https://academy.terrasoft.ru/api/SDKNETAPI/7.10.0/NetCoreAPI_Help.html#G... только у меня еле живой?

Нравится

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

Здравствуйте
Эта проблема уже обсуждалась http://www.community.terrasoft.ru/forum/topic/25657
Возникла после обновления chrome
Если использовать FireFox или Edge (и даже Internet Explorer :exclaim:), то документация еще шевелится.

если б было все так просто, я бы не писал. В FF не знаю, но Edge ощутимого результата не дает.

Здравствуйте Дмитрий
К сожалению точную причину пока не обнаружили
Скорее всего долго отрабатывает javascript, необходимый для индексации поиска
Задача по устранению проблемы будет взята в работу в ближайшее время
Извините за неудобства

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

Суть:
Есть некая карточка (н/п MyCustomPageV2) которая содержит справочное поле (н/п Owner).
В бизнес-логике карточки, необходимо значение поля (н/п Status) сущности экземпляр которой выбран в справочном поле Owner
используем для этого штатный механизм конфигурирования поля как атрибута, lookupListConfig и его свойства columns

attributes: {
...
"Owner": {
        lookupListConfig: {
                columns: ["Status"],
        }
}

...
}

Что позволяет организовать как-бы "просмотр внутрь" справочного поля и предоставление значения колонки Status выбранного значения.
Проблема:
Юзер открывает карточку MyCustomPageV2, в модели для поля Owner было загружено так же поле Status (к примеру оно содержит значение "X").
Теперь пользователь через гиперссылку справочного поля перешел на карточку сущности Owner изменил там значение Status (к примеру на значение "Y"), нажал "Сохранить", и тем самым вернулся в MyCustomPageV2 (из Chain). Теперь если мы обратимся к полю Owner и его колонке Status
this.get("Owner").Status

то оно по прежнему содержит значение "X"
Вопросы:
  1. Это баг ? или так и должно быть ?
  2. Если так и должно быть, то вероятно есть способ акутализировать данные колонок полей указанных в lookupListConfig -> columns? Как это сделать ?
  3. Как вообще можно отреагировать на "возвращение в карточку" при переходе из Chain (по "Закрыть" или "Сохранть" и т.д. открытых "поверх" карточек других сущностей) ? В таком случае, в виде "костыля" можно было бы хоть сделать ESQ запрос и актуализировать данные вручную

вот...

Нравится

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

Добрый день!
Это не баг. У вас в первой карточке своя модель, которая загрузила значение Х. Изменения этого значения в БД не приведет к изменению значения в модели (Именно это вы и делаете из другой карточки - сохраняете в БД).
Задача в 2 этапа:
1. Нотификация изменений
2. Загрузка актуальных значений

Варианты решений:
1. Можно сделать обмен сообщениями между модулями
2. Загрузка актуальных...у всех наследников BasePage есть метод reloadEntity - он актуализирует данные

Хорошо, про reloadEntity мне известно,
но как мне инициировать его в момент когда пользователь "вернулся" в карточку,
есть ли какая-то событийная модель на этот случай, какой-то прием который позволит этот самый reloadEntity запустить тогда когда он нужен ?

Сейчас веду маленькое исследование на этот счет, отвечу в вашем дубле здесь:
http://www.community.terrasoft.ru/forum/topic/25727

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

Добрый день!

Не так давно в последних релизах bpm появилась возможность добавления подписи. При настройке подписи используется ограниченный набор шрифтов, среди которых нет calibri (согласно политике нашей компании именно этот шрифт должен использоваться). Как добавить данный шрифт в bpm (не только с целью правильно настроить подпись, но и использовать свой шрифт при отправке email)?

Заранее благодарю!

Нравится

1 комментарий
Лучший ответ

Здравствуйте, Илья!

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

Добрый день!

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

При реализации Дизайнера контента используется CKEditor. По ссылке ниже Вы найдете информацию о том, каким образом реализовать добавление новых шрифтов в этот редактор:
http://ckeditor.com/forums/CKEditor/Add-a-new-font

Вы можете, как пример для добавления нового шрифта можно использовать следующее решение:
Внести изменения в файл "Resources\ui\CKEditor\ckeditor.js" приложения.
(Добавить в строку CKEDITOR.config.font_names текст "Segoe UI;":
...CKEDITOR.config.font_names="Segoe UI;Arial/Arial, Helvetica, sans-serif;...)

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

Хорошего Вам дня!

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

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

this.on("change:UsrProduct", function() {this.ProductChanged(); }, this);

Если пользователь меняет поле, у меня вызывается обработчик и он пересчитывает значение в другом поле, которое также сохраняется в БД.
Проблема в том, что если пользователь поменял поле, а затем нажал Отмена, система возвращает все поля в исходное состояние, в том числе UsrProduct, а дальше снова вызывается мой обработчик и пересчитывает другое поле. И вот этого последнего пересчета хотелось бы избежать.

Вопрос - как понять, что вызов происходит после нажатия Отмены???

Нравится

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

попробуйте использовать предоставляемый платформой механизм "зависимости".

attributes:{
...
"UsrProduct": {
	dependencies: [
		{
			columns: ["UsrProduct"],
			methodName: "ProductChanged"
		}
	]
}
...
},

Его реализация предусматривает Ваш и еще несколько кейсов, которые дополнительно придется отрабатывать при прямой подписке на Backbone model property.

Так будет еще хуже. Метод будет вызываться еще и при инициализации страницы.
Нужен какой-то onCancel, есть такой?

Есть onDiscardChangesClick. Который и вызывается при нажатии на Отмена. Можете дополнительно создать атрибут с булевым флагом который будет заполняться в момент вызова onDiscardChangesClick.

"Мотков Илья" написал:

Есть onDiscardChangesClick. Который и вызывается при нажатии на Отмена. Можете дополнительно создать атрибут с булевым флагом который будет заполняться в момент вызова onDiscardChangesClick.


Да, так работает!
Спасибо!

"Алексей Карягин" написал:Метод будет вызываться еще и при инициализации страницы.

по какой причине он будет вызываться при ИНИЦИАЛИЗАЦИИ страницы ?
не должен и не вызывается :)
"Алексей Карягин" написал:Нужен какой-то onCancel, есть такой?

есть у BasePageV2 метод onCardAction

...
				onCardAction: function() {
					var action = arguments[0] || arguments[3];
					this[action]();
				},
...

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

this.save()

он завязан в механике обработки тегов по нажатию на кнопках "Закрыть", "Отмена", "Сохранить".
Я думаю это то что Вам нужно.

PS:
через него кстати и вызов вышеупомянутого onDiscardChangesClick происходит

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

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

Заранее благодарю!

Нравится

5 комментариев
Лучший ответ

Александр, я не вижу другого варианта, кроме того, что каждый пользователь должен создавать задачи с продолжительностью, который он потратил на задачу и привязать (деталь "Связи") с соответствующим разделом. Затем строить необходимую аналитику.

Александр, я не вижу другого варианта, кроме того, что каждый пользователь должен создавать задачи с продолжительностью, который он потратил на задачу и привязать (деталь "Связи") с соответствующим разделом. Затем строить необходимую аналитику.

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

В качестве супербредовой идеи:
1) Унаследоваться от базового объекта, сделать базовый объект с логом(там будет событие записи в базу кто и когда делал изменение в каком поле какого объекта). изменить родителя у основных объектов системы с базового объекта на новый.
2) В basesection на событие загрузки грида тоже прилепить логирование.(либо gridUtils, чтобы ещё и детали отслеживались).
3) скорее всего где-то в системе валяется таблица времени логина пользователя, её тоже можно откопать, вытащить данные.(деталь сеансы)

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

Что-то подобное мы реализовывали тригерами в БД, но в очень узком масштабе - 2 раздела, несколько объектов и некоторые поля в нем.
Ну и я так понимаю Вам необходим хронологический порядок, нас же интересовали удельные итоговые данные по временным интервалам.
Но "на вскидку" хронологию так-же можно "прикрутить".
Можете по-подробнее рассказать как вы видите методику учета "работы" менеджера, aka "Необходимо учитывать время с момента открытия карточки, до ее закрытия" или "необходимо учитывать как скоро после изменения одних данных произошло изменение других этим же пользователем" и т.д.

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

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

Добрый день!

В нашей компании реализована интеграция bpm'online sales c телефонией Манго Телеком (создан коннектор). Сервер Манго синхронизируется с bpm по защищенному протоколу HTTPS, все совершенные звонки автоматически загружаются в bpm. Менеджеры подключаются к bpm по rdp (удаленному рабочему столу). В компании для каждого менеджера развернута отдельная трубка с базой (радиотелефоны).Как настроить подключение гарнитуры (будь это проводные наушники или блютуз-гарнитура) к телефонии и bpm без использования стороннего ПО?

Заранее благодарю!

Нравится

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

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

В профиле пользователя есть настройки Call Centre, где можно указать использовать "Веб телефон" или использовать "Гарнитуру"
Подробнее можно прочитать на академии тут -https://academy.terrasoft.ru/documents/sales-enterprise/7-10/kakie-nast…
Вы используете Webitel Any Voip Connector поэтому настройки должны быть похожи с Webitel.

Илья, добрый день!

Спасибо за ответ, прочитал статью академии возник вопрос - по гарнитуре можно совершать только внутренние звонки? Насколько я знаю подключение гарнитуры и совершение звонков клиентам подключается к Webitel за дополнительную плату.

Указав параметр в профиле "Использовать Web телефон" как подключить гарнитуру (через ноутбук 3.5 разъем или другой способ)?

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

У детали есть кнопки Вверх, Вниз, которые управляют позицией детали.
За это отвечает вот этот кусок кода.

setPosition: function(recordId, position, callback, scope) {
                                var data = {
                                        tableName: UsrWorkDR",
                                        primaryColumnValue: recordId,
                                        position: position,
                                        grouppingColumnNames: "
UsrWorkDId"
                                };
                                ServiceHelper.callService("
RightsService", "SetCustomRecordPosition", callback, data, scope);

использую его на своей страничке у детали.
Но выходит сообщение

em>message: Uncaught TypeError: ServiceHelper.callService is not a function em>

Что не так?

Нравится

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

Конкретно эта ошибка говорит о том что вы скорее всего не добавили переменную ServiceHelper или добавили её в неправильной последовательности в схеме:

Смешно...но ServiceHelper был последним, сделал первым и заработало...подсказку тут нашел тут

Максим спасибо.

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

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

создала деталь с редактируемым реестром по объекту Договор, зарегистрировала в деталь в БД в таблице sysdetail.

Хочу добавить деталь в продажи. через мастер разделов добавила деталь - все корректно. сохранение прошло без ошибок. Открываю страницу продажи,а там моя деталь работает некорректно. в консоли ошибок нет.
очистка кэша, перезапуск иис, очистка редиса и даже перекомпиляция проводилась. результата нет.
Даже пробовала новую деталь создать по объекту договор. проблема та же. До этого делали аналогичные действия с другими объектами, все работало корректно.
в чем может быть дело?

Версия 7.10.0.1742

Нравится

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

Здравствуйте, удалите все что связано с этой деталью кроме объекта детали.
Создайте деталь мастером разделов, обычную, на основании этого объекта, вывидите на страницу, настройте колонки, обязательно в списочном (не плиточном!) представлении, после чего, в схеме детали кодом сделайте её редатируемой.

Для того, чтобы сделать реестр детали редактируемым, в соответствующей схеме необходимо:
- Добавить зависимости от модулей ConfigurationGrid (Конфигурационный реестр), ConfigurationGridGenerator, ConfigurationGridUtilities;
- Подключить "миксин" ConfigurationGridUtilites;
- Установить атрибут IsEditable в значение true;
- Базовому реестру указать свойства:
className: "Terrasoft.ConfigurationGrid",
generator: "ConfigurationGridGenerator.generatePartial",
generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
changeRow: {bindTo: "changeRow"},
unSelectRow: {bindTo: "unSelectRow"},
onGridClick: {bindTo: "onGridClick"},
initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
для добавления действий активной записи добавить:
activeRowActions: [...],
activeRowAction: {bindTo: "onActiveRowAction"}
Зависимости нужно указать не только параметром requirejs но и в настройках схемы, в конфигураторе.
Итоговый код простейшей редактируемой детали будет выглядеть следующим образом:

define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
   "ConfigurationGridUtilities"], function() {
   return {
      entitySchemaName: "Contact",
      attributes: {
         "IsEditable": {
            dataValueType: Terrasoft.DataValueType.BOOLEAN,
            type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            value: true
         }
      },
      details: {},
      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
            }
         }
      ],
      mixins: {
         ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
      },
      methods: {}
   };
});
Показать все комментарии

Добрый день!
Подскажите в чем может быть проблема.
Не получается обратиться к нашему созданному сервису.
Выдает 403 ошибку - нету прав на чтение при попытке выполнить POST метод.
Может ли это быть как-то связано с https, так как на стенде разработке обыкновенный http и таких проблем не испытывали? Настройка прав один в один.

Нравится

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

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

403-я ошибка – означает отсутствие хедера с CSRF-токеном. Чтобы с помощью ARC сделать запрос нужно добавить header с валидным для текущей сессии csrf-токеном. Получить его можно, например, взяв любой post-запрос из вкладки network chrome-а. Лучше, также, положить хедер с Cookies.
Подробнее по CSRF в статье: https://academy.terrasoft.ru/documents/technic-sdk/7-9/zashchita-ot-csr…

"Сергей Кy6риш" написал:Подробнее по CSRF в статье: https://academy.terrasoft.ru/documents/technic-sdk/7-9/zashchita-ot-csrf...

С уважением,
Группа компаний Terrasoft


В примере который вы прикрепили https://academy.terrasoft.ru/documents/technic-sdk/7-10/zashchita-ot-cs… нет описания того что представляет из себя SendingRequestEventArgs.
Собственно дальше не получается продвинуться.

Пример из статьи взят из другой статьи: https://academy.terrasoft.ru/documents/technic-sdk/7-10/rabota-s-obekta…, там можно посмотреть более детально. На этом примере показали, что в целом важно просто получить значение куки “BPMCSRF”, и положить в headers request-а, который собираемся отправить.

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

Всем доброго времени суток.
Версия 7.10.

Сделал обработчик для нажатия клавиши Enter вот таким образом:

onEntityInitialized: function() {
                                this.callParent(arguments);
                       
                                var keyMap = new Ext.util.KeyMap({
                                        target: Ext.select("тут id элемента"),
                                        key: Ext.EventObject.ENTER,
                                        fn: this.onSearchPressEnter,
                                        scope: this,
                                        binding: keyMap
                                });
                        },
                       
                        onSearchPressEnter: function() {
                                console.log("Test");
                        },

Инструкцию взял отсюда: https://community.terrasoft.ru/forum/topic/15140#comment-58515

Проблема в том Test выводится в консоль аж 5 раз. Возможно ли сделать этот вывод только один раз, и чтобы при этом сохранялась возможность сделать вызов onSearchPressEnter повторно?

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

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

UPD. Разобрался, элемент по id неправильно находился, из-за чего в target оказывалось сразу несколько элементов.

Нравится

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