Добрый день.

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

В BaseSectionV2 используются атрибуты: "sortColumn", "SortColumnIndex", "GridSortDirection".

Так же в свойствах объекта есть свойство "Сортировка в списках".

Но установка значений этих атрибутов и свойства не решила задачу.

Прошу подсказать как решить данный кейс

Нравится

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

Добрый день

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

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

Есть обьект "Контакты". По которым приходят уведомления в панель CTI.

Скажем если в обьекте "Контакты" есть поле X в котором можно выбирать значения от 1 - 5.

Вопрос: Можно ли отображать иконку с номером в зависимости от того какое значение выбрано в поле X?

Изображение удалено.

 

Нравится

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

Добрый день, 

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

Для начала необходимо создать замещающий объект контакта, в который добавить поле Х.

После создать замещающий клиентский модуль, где в качестве родительского необходимо указать CtiPanelCommunicationHistoryUtilities (Модуль истории звонков CTI панели). И необходимо переопределить следующие методы: 

addCommunicationHistoryQueryColumns - необходимо добавить поле Х контакта, для того чтобы иметь возможность вычитывать значения этого поля.

getHistoryPanelConfig - тут необходимо реализовать собственную логику отображения иконки. В базовой версии: Photo: historySubscriber.get("ContactPhoto").value устанавливается фото контакта. 

 

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

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

Появилась необходимость реализовать отдельную сортировку по умолчанию в Grid'е детали.

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

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

После этого происходит стандартное добавление выбранных записей в деталь.

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

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

Так же что-то удалось найти в diff на BaseGridDetail который соответствует сортировке, но как-то это тоже ни к чему не привело.

Есть мысль что при загрузке коллекции в методе onGridDataLoaded получать коллекцию и при помощи underscore.js сортировать её как угодно, но вроде как это накладно и производительней было бы получить уже отсортированную коллекцию.

У кого какие предложения/идеи будут по данному посту?

Нравится

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

Добрый день. Не очень понял, а почему "я уперся в GridUtilites и решил дальше не лезть"? Можно же функцию из миксина переопределить в схеме самой детали, сославшись на родительскую, если нужно, через this.mixins.GridUtilitiesV2.... . На вскидку, вроде надо "допилить" initQuerySorting ???

типа такого:

 

initQuerySorting: function(esq) {

    this.mixins.GridUtilitiesV2.initQuerySorting(esq);

    /* далее какие-то ваши действия с esq */

}

 

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

Иванов Александр А.,

Да, спасибо. Мы уже разрешили проблему. Если интересно могу поделиться кодом.

Да, было бы неплохо. Посмотреть, к тому же, насколько отличается от моей мысли. ))

initQuerySorting: function(esq) {
	var createdOnColumn = esq.addColumn("KmName", "Name");
	createdOnColumn.orderDirection = this.Terrasoft.OrderDirection.ASC;
}

Всё свелось к тому что такой путь посоветовала Тех. поддержка. А у меня там уже простынка такая строчек на 100 была как коллекцию грида сортироватьlaugh

Кисловский Михаил Андреевич,

Ну да, только тут остальная сортировка "идёт лесом". Поддержка, как всегда, короче... smiley

Иванов Александр А.,

Ну с остальной сортировкой да. Но в целом можно выкрутиться думаю если захотеть) 

Я, наверное, тогда промолчу про 

getGridDataColumns: function() {
	return {
		"Id": {path: "Id"},
		"TmName": {path: "TmName"},
		"TmStartDate": {path: "TmStartDate", orderPosition: 0, orderDirection: Terrasoft.OrderDirection.DESC},
		"TmStudios": {path: "TmStudios", orderPosition: 1, orderDirection: Terrasoft.OrderDirection.DESC}
	};
},

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

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

спасибо, что не промолчал ;)

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

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

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

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

Нравится

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

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

На текущий момент мы не рекомендуем использовать более одного сервера приложений для работы с одной БД. В теории можно на втором сервере приложения в web.config лоадера отключить использование Schrduler, однако это не обезопасит от остальных проблем, которые могут возникнуть.

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

Добрый день, при попытке удаление какой либо записи с правами Supervisor'а в консоли браузера появляется строка "Метод handler устарел. Вместо него используйте click event" а в случае подтверждения удаления "Метод onDeleteAccept устарел. Вместо него используйте onMultiDeleteAccept". Удаление не происходит, появляется диалоговое окно "Удаление произошло с ошибкой, обратитесь к системному администратору". Кто-то сталкивался с подобной проблемой?

P.s. система стоит на Win Server 2008R2 который не поддерживает web-сокеты, но я не думаю что с обновлением bpm отказался от поддержки sw-сокетов совсем.

Нравится

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

Вопрос решился настройкой Web.config оказывается после обновления его надо заново настраивать

Сафронов Иван Александрович пишет:

Вопрос решился настройкой Web.config оказывается после обновления его надо заново настраивать

А вы просто подменяли конфиг от предыдущей версии что-ль? Так не будет работать, поскольку в конфигах есть ссылки на асембли новых версий.  

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

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

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

Нравится

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

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

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

Необходимо в схеме детали в секции diff написать:

diff

diff: /**SCHEMA_DIFF*/[
{
   "operation": "merge",
   "name": "Detail",
   "values": {
      "caption": {"bindTo": "getDetailCaption"}
   }
}
]/**SCHEMA_DIFF*/

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

methods

getDetailCaption: function() {
   var cardPageName = this.get("CardPageName");
   if (cardPageName === "ActivityPageV2") {
      return "Name 1";
   }
   return "Name 2";
}

Можно также использовать локализируемые строки.

В типовых конфигурациях, аналогичный пример есть в схеме «OpportunityContactDetailV2»

OpportunityContactDetailV2

/**
 * Устанавливает заголовок детали в зависимости от открытой страницы.
 * @protected
 * @return {String}
 */
getDetailCaption: function() {
   var cardPageName = this.get("CardPageName");
   if (cardPageName === "OpportunityPageV2") {
      return this.get("Resources.Strings.InOpportunityCaption");
   }
   return this.get("Resources.Strings.InContactCaption");
},

Юлия, спасибо.

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

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

 

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

В целом, проблем с этим нет, но есть одна единственная проблема. У меня объявлена деталь на странице редактирования. В этом описании указан еще и subscriber, чтобы отрабатывать различные функции в случае возникновения событий об изменениях детали. Так вот визарды зачищают этот участок кода схемы страницы, что ломает бизнес логику страницы. Вопрос в том, каким еще способом можно определить подписку на стандартные события изменения детали, чтобы перенести код в секцию methods?

 

Нравится

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

О, да! И мне постоянно на это отвечала поддержка, что этого не может быть :)

Владимир Соколов,

а поддержка случайно не предлагала какие-то воркэраунды?

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

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

subscriber: {
   "methodName": "sendSaveCardModuleResponse"
}

где sendSaveCardModuleResponse имя метода.

Терещук Сергей,

оО! Спасибо! Помогло.

Терещук Сергей,

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

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

Интересует возможность разнесения базы на файловые группы для разнесения групп на разные жёсткие диски (разный объем и скорость).

Есть ли в ВРМ встроенная возможность создавать определенные таблицы, например xxxFile на определенной файловой группе? И вообще, есть ли возможность управлять созданием таблиц на файловых группах?

Есть ли у кого-то положительный опыт разнесения базы на ФГ?

Нравится

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

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

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

Коллеги, доброго времени суток!

 

Столкнулся с такой проблемой.

Дано:

1. Имеется Project

2. Имеется собственное поле в объекте Opportunity (пусть будет UsrProject), которое ссылается на проект (тип ессно Lookup по объекту Project)

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

 

Задача: при отображении связанной сущности Project генерировать правильную ссылку на редактирование Project.

 

Проблема:

Изначально в системе есть две страницы редактирования для сущности Project: ProjectPageV2 и WorkPageV2. Система как-то сама должна определять типа записи и генерировать ссылку либо на ProjectPageV2, либо на WorkPageV2. Я точно помню, что как только я добавил поле UsrProject в Opportunity, то ссылка на связанный проект проставлялась как WorkPageV2, вместо положенной ProjectPageV2. Спустя какое-то время, проблема ушла сама собой (что произошло - загадка). Т.е. сейчас на странице редактирования Opportunity все корректно.

Проблема проявилась в другом месте. Я создал раздел по собственным объектам (см. Дано п.3), где я могу фильтровать эти объекты по нужным мне параметрам. Для нормального вывода настроен Tile View, где выводится информация о связанной Opportunity, через Opportunity выводиться информация об Account и Project. Так вот в этом списке упорно проставляется ссылка на проект через WorkPageV2, вместо положенной проверки на тип записи проекта.

 

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

Нравится

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

Максим, привет.

Тоже разбираюсь с этим вопросом и не совсем понимаю где тебе нужна ссылка на Project. Для детали посмотри метод AddColumLink, он как раз и формирует ссылку на соответствующую карточку. Он просто смотрит по какому полю отличаются карточки данного объекта и соответственно подставляет нужную карточку. 

Дмитрий, спасибо за отклик.

Смотри, есть объект, назовем его "платежи в оппортьюнити". Для управления наполнением этого объекта существует соответствующая деталь на странице редактирования оппортьюнити.

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

В настройках Tile view для секции добавляются поля из связанных сущностей:

Таким образом я могу видеть проект в секции, но ссылка ведет всегда на WorkPageV2 без разбора типа записи:

Этот проект точно имеет типа записи Project, а не Project task, но ссылка сгенерирована так, будто это таска в проекте.

 

Максим, привет.

У меня на проекте тоже используются Проекты и Работы, попробовал у себя сделать так же как ты показал - у меня всё отрабатывает как надо. Попробуй поотлаживать addColumnLink - возможно у тебя что-то не так в БД.

Добрый день, соглашусь с Максимом, все ссылки в гриде генерируется в методе addColumnLink из GridUtilitiesV2. Бывают случаи, что некорректно отрабатывает клик на ссылку, хотя ссылка сформирована верно. Но в вашем случае (если верить скриншоту) ошибка в самой ссылке. Без отладки сложно сказать что могло пойти не так.

Разобрался с данной проблемой. Как правильно замечено выше, обработкой занимается addColumnLink, которая в свою очередь вызывает createLink (либо собственный из GridUtilities, либо из LinkColumnHelper). Вся проблематика сводится к тому, что item грида (т.е. по факту строчка грида) ничего не знает про ProjectEntryType, поскольку это значение не подтягивается в item при простом добавлении колонки Project.

Код вычитывает из item значение примерно так:

var type = this.get(columnPath + "." + attribute) || this.get(attribute);
var typeId = type ? type.value : type;

Тут есть несколько вариантов решения проблемы:

1. Добавить на грид вывод соответствующего ProjectEntryType, тогда штатный код все прекрасно найдет и прочитает

2. В коде схемы страницы секции (ну, или детали, если грид рисуется в детали) сделать явное проставление атрибута, чтобы форсировать тип проекта. Минус в данном случае - нет определения типа записи проекта и форсируется конкретная страница редактирования. Для однородных данных этого в принципе достаточно.

Код примерно такой получился:

addColumnLink: function(item, column) {
	var referenceSchemaName = column.referenceSchemaName;
	if (referenceSchemaName === "Project") {
		item.set("ProjectEntryType", {value: "6b4928d7-456a-4acd-a863-3361d46b7649"});
	}
	this.callParent([item, column]);
},

3. В коде схемы (как в варианте выше) делать вычитывание типа проекта из базы и проставлять соответствующий атрибут для item

 

В моем случае быстрее было сделать вариант 2, поскольку не хотелось отображать тип записи проекта в секции. Непонятно, почему штатыные средства получения лукапных полей прописывают в объект только displayValue и Id записи. Правильнее было бы для пногостраничных объектов также включать значение поля, по которому делается определение страница редактирования а генерировать ссылку на базе этого значения.

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

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

Возник вопрос, записывается ли в систему факт прохождения/нарушения верификации чек-ина?

Вот есть системная настройка "Радиус верификации чек-ина", в которой указываем, например значение "100" (метров).

На визите выполняем действие "Чек-ин", находясь к 500 метрах от контрагента. Система выдает сообщение о том, что "Верификация не пройдена. Сохранить результаты?".

Если выбрать вариант "Да", то где фиксируется так скажем "нарушение", факт того, что при выполнении действия верификация была нарушена?



Есть необходимость построить дашборд, который бы отображал количество визитов, которые не прошли верификацию (чек-ин был выполнен от контрагента дальше, чем это задано в системной настройке)

Нравится

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

Владимир, здравствуйте!

Есть справочная колонка "Статус верификации чекина" - аналитику можно построить по ней. 

Пример описан в Академии - https://academy.terrasoft.ru/documents/sales-enterprise/7-11/kak-kontrolirovat-vypolnenie-chek-ina

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