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

Появилась необходимость реализовать отдельную сортировку по умолчанию в 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}
	};
},

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

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

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

Показать все комментарии
обрабатывающий сигнал
7.9
sales

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

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

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

Нравится

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

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

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

Показать все комментарии
удаление записей
веб-сокеты
вебсокеты
sales

Добрый день, при попытке удаление какой либо записи с правами 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 комментарий

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

Показать все комментарии
editPages
hyperlink
7.10
sales

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

 

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

Дано:

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 записи. Правильнее было бы для пногостраничных объектов также включать значение поля, по которому делается определение страница редактирования а генерировать ссылку на базе этого значения.

Показать все комментарии
mobile
Pharma
FieldSales
VisitActions
Visit
CheckIn
Verification
7.10
sales

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

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

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

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

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



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

Нравится

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

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

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

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

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

Готовлюсь к переносу пакета через SVN и смущает один момент.

У меня созданы новые детали. Пусть сами схемы он перенесет, а вот записи таблиц SysDetail (по 1 на деталь), SysSchema, возможно какие-то другие - что с ними будет?

Ведь без этих записей система нормально работать не будет?!

Нравится

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

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

 

Для переноса содержимого некоторых таблиц используется механизм привязки данных к пакету - https://academy.terrasoft.ru/documents/technic-sdkmp/7-11/privyazka-dan…

 

Для упрощения привязки можно воспользоваться бесплатным дополнением с Marketplace - https://marketplace.terrasoft.ru/app/data-binding-tool

Привет!

А детали создавались мастером? Если да, то почти все привязки автоматом создаются в пакете Custom. Все, что надо сделать - "повторить" эти привязки в своем пакете.

Например, может быть создана привязка следующего вида "SysDetail_DetailManager_d95ebba0c04a454fad3bbb45962eef2d" по объекту SysDetail.

В этом случае надо действовать примерно по следующему плану:

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

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

3. выбрать свой пакет и создать привязку по нужному объекту (в данном примере SysDetail, который в выпадашке объектов называется Details lookup)

4. обязательно выбрать тип установки как Installation

5. обязательно отфильтровать по Id. Этот идентификатор есть в названии привязки, но его надо привести к правильному виду GUID. Например, d95ebba0c04a454fad3bbb45962eef2d должен превратиться в d95ebba0-c04a-454f-ad3b-bb45962eef2d

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

7. сохранить и вкоммитить

 

P.S. Я не знаю, как работает утилита выше, которую посоветовал Павел, но подозреваю, что уже созданные привязки в других пакетах эта утилита не удаляет и их надо будет зачищать вручную.

 

Кстати, надо еще не забыть привязать настройку колонок детали... в описании утилиты сказано, что она позволяет привязывать к пакету настройку колонок по секциям, и ничего не сказано про детали. Если настройка колонок не задана в явном виде в секции diff cхемы детали и настройка колонок делалась через интерфейс, то надо будет привязывать еще и профиль отображения. Это объект SysProfileData (в выпадашке User profile) с фильтрацией по содержимому поля Key. Это поле должно содержать название детали или секции и, возможно еще содержать текст "GridSettings". Также, если не задан контакт у записи, то это отображение для всех - т.е. дефолтное отображение, если пользователь себе ничего не настраивал.

Максим Цынгаев,

не понял про SysProfileData. Как сделать эту привязку?

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

Давай на примере покажу.

Есть собственная секция OpportunityPaymentsSection. Я настроил отображение колонок и сохранил, причем сохранял как для Supervisor, так и для All. Чтобы привязать это отображение к пакету, я создал привязку на вкладке Data по объекту User profile (SysProfileData - это так называется объект в БД и есть соответствующая таблица) и отфильтровал по двум критериям:

1. Key содержит название схемы секции

2. Contact не заполнен (т.е. в базе NULL)

Вот так это выглядит в интерфейсе:

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

Добрый день.

Запускаю  БП из действия раздела:

var selectedRows = this.get("SelectedRows");
var accounts = selectedRows.join();
var processName = "UsrChangeAccountOwnerProcess";

var params = {
	AccountIds: accounts
};
ProcessModuleUtilities.runProcess(processName, params);



При запуске БП по выделенным записям (более 50 записей) возвращается ошибка:

https://yadi.sk/i/k7KXj5VE3PTDoj

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

Вопросы:

Как снять ограничение на длину параметра?

Можно ли запустить БП с использованием callService, передав параметры в виде jsonData, а не в url?

Нравится

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

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

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

А с чем связана описанная мной проблема?

Коновалов Игорь,

Я думаю, что это вызвано ограничениями, которые прописаны для WCF сервиса, который вызывается. В частности, 

maxReceivedMessageSize. Но я могу и ошибаться.

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