При добавлении зависимости следующим образом:

"RoundPropertyPriceWithDiscount": {
    dependencies: [
        {
             columns: ["PropertyPriceWithDiscount"],
             methodName: "roundPropertyPriceWithDiscount"
        }
    ]
}

и обработки методом:

roundPropertyPriceWithDiscount: function() {
	this.roundDoubleValue("PropertyPriceWithDiscount");
},
roundDoubleValue: function(propertyName) {
	var value = this.get(propertyName);
	var rounded = Math.round(value);
 
	if (rounded != value) {
		this.set(propertyName, rounded);
	}
},

происходит зацикливание. Кейс:

вводим в поле 5,56 - запускается метод, записывающий в поле 6,00, далее запускается еще раз (очевидно), проверяет что значение в поле равно его округленному значению (6,00 == 6,00) и значение в поле НЕ ПЕРЕЗАПИСЫВАЕТ. И вот далее идет ТРЕТИЙ запуск, в котором this.get() возвращает старое значение поля - 5,56. Ну и, естественно, это бесконечный цикл. Каким образом работает сей механизм? Если мне не изменяет память - в прошлых версиях такого не было.

7.13.1.769_SalesEnterprise_Softkey_MSSQL_ENU

 

UPD: Подписка на изменение поля вручную решает вопрос

this.on("change:PropertyPriceWithDiscount", this.roundPropertyPriceWithDiscount, this);

 

Нравится

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

Добрый день!

Если я правильно понял Ваш бизнес-кейс, то вы его неправильно реализовали. Если при изменении одного поля нужно взять значение этого поля, округлить его и записать в другое поле, то вам нужно делать this.set("RoundPropertyPriceWithDiscount", value);

Тёскин Дмитрий Валерьевич,

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

RoundPropertyPriceWithDiscount это просто название атрибута

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

Добрый день.

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

И новом процессе начать создание массового инцидента.

Вопрос можно ли из процесса закрыть процесс запущенный ранее.

Как это реализовать?

Нравится

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

Можно в скриптаске

Тема неоднократно обсуждалось, посмотрите например этот пост

Можно в скриптаске

Тема неоднократно обсуждалось, посмотрите например этот пост

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

Как убрать поиск у справочного поля в лукапе. Поле на странице раздела.

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

 

Нравится

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

По аналогии с LookupPageViewGenerator реализуйте свое кастомное окно и вызывайте его в методе openLookup там, где Вам нужно.

Более подробно посмотрите обсуждение в этой теме.

По аналогии с LookupPageViewGenerator реализуйте свое кастомное окно и вызывайте его в методе openLookup там, где Вам нужно.

Более подробно посмотрите обсуждение в этой теме.

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

Добрый день. Подскажите, может у кого есть идеи как скрыть контакты сотрудников из раздела "Контакты" не используя группы?

Нравится

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

Александр Тыра,

Пример фильтрации в разделе

getFilters: function () {
    var sectionFilters = this.callParent(arguments);
    this.setCommunicationFilter(sectionFilters);
    return sectionFilters;
},
setCommunicationFilter: function (filterCollection) {
    var testAttr = this.get("TestAttr");
    var isActive = this.get("IsActiveTestAttr");
    if (!isActive) {
         filterCollection.removeByKey("FilterContactCommunication");
    } else {
    filterCollection.add("FilterContactCommunication", 
         this.Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.CONTAIN, "[ContactCommunication:Contact:Id].Number", testAttr));
         }
},

 

Доброе утро.

По классике это можно сделать разделением прав доступа.

Алла Савельева,

 подскажите пожалуйста как через права, пример не большой

Александр Тыра,

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

Если есть потребность корректируете права доступа на записи с помощью настройки специального бизнес-процесса. Например, если Вам нужно скрывать только телефоны сотрудников, а e-mail показывать.

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

Алла Савельева,

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

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

В раздела Контакты можно отфильтровать все записи по нужному вам типу сотрудников или убрать доступ у пользователей к Контактам в зависимости от того что вам нужно

Григорий Чех, 

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

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

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

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

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

Александр Тыра,

Пример фильтрации в разделе

getFilters: function () {
    var sectionFilters = this.callParent(arguments);
    this.setCommunicationFilter(sectionFilters);
    return sectionFilters;
},
setCommunicationFilter: function (filterCollection) {
    var testAttr = this.get("TestAttr");
    var isActive = this.get("IsActiveTestAttr");
    if (!isActive) {
         filterCollection.removeByKey("FilterContactCommunication");
    } else {
    filterCollection.add("FilterContactCommunication", 
         this.Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.CONTAIN, "[ContactCommunication:Contact:Id].Number", testAttr));
         }
},

 

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

Есть два справочника: "Запрос" и "Расчет к запросам".

В "Запрос" крепится деталь, где указывается поле из второго справочника (см.Рис 1.2.).

 

Как можно через кнопку(JS на клиенте/сама кнопка уже есть) в справочнике "Запрос" узнать Id прикрепленной детали?

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

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

 

 

 

 

 

 

 

 

 

Нравится

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

Так в том и дело, что нет разницы сколько на данный момент записей в детали одна или несколько. Все они хранятся в коллекции GridData детали.

Вы уверенны, что эта логика должна отрабатывать на клиентской части?

Т.к. в итоге вам нужно будет делать esq-запрос к всё той же детали  для получения значения поля "Статус(usrStatus)" (т.к. не факт, что в реестре детали выведено поле "Статус(usrStatus)" )

Если всё же на клиентской части, то 

в BasePageV2 есть коллекция this.entitySchemaInfo.details,

И есть метод var detailId = this.getDetailId(detailName);

Вы можете на странице Запроса (где кнопка) создать адресное сообщение (publish)

И при клике на кнопку его отправлять. Адресатом будет detailId.

А в схеме детали с реестом (Расчет) добавить это же сообщение, но уже как подписчика (subscribe).И при получении этого сообщения возвращать this.get("GridData")

 

Вам нужно получить ID детали или Id определённой записи из детали?

Получить Id прикрепленной детали, у неё найти поле "Статус(usrStatus)" и сверить что поле = "Согласован"



Это первый опыт работы с деталями

Т.е. всё же Id записи  "Расчет к запросам" связанный с текущим Запросом?

А кнопка у вас где располагается?

 

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

В справочнике "Запрос"

Дело в том, что деталь может содержать несколько записей. И вам необходимо понимать Id какой именно запись вы хотите получить.

 

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

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

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

Так в том и дело, что нет разницы сколько на данный момент записей в детали одна или несколько. Все они хранятся в коллекции GridData детали.

Вы уверенны, что эта логика должна отрабатывать на клиентской части?

Т.к. в итоге вам нужно будет делать esq-запрос к всё той же детали  для получения значения поля "Статус(usrStatus)" (т.к. не факт, что в реестре детали выведено поле "Статус(usrStatus)" )

Если всё же на клиентской части, то 

в BasePageV2 есть коллекция this.entitySchemaInfo.details,

И есть метод var detailId = this.getDetailId(detailName);

Вы можете на странице Запроса (где кнопка) создать адресное сообщение (publish)

И при клике на кнопку его отправлять. Адресатом будет detailId.

А в схеме детали с реестом (Расчет) добавить это же сообщение, но уже как подписчика (subscribe).И при получении этого сообщения возвращать this.get("GridData")

 

Как вариант можно использовать сообщения например такой сценарий

1)по нажатии вашей кнопки на карточке публикуется сообщение

2) в дели по подписке на сообщение перебираются все строки данных и формируется в массив список id записей у которых статус = согласован. Сформированый массив передается в карточку.

 

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

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

Нравится

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

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

Зверев Александр, поле Тип заполнено

Значит, не тот тип, к которому относится карточка.

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

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

Всё сделал, в профилях прописали, авторизация проходит, даже тестовое сообщение создалось. В настройках папки показывает.

Но синхронизация не идёт!

В чём может быть причина?

Нравится

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

К сожалению, по Вашему описанию проблемы, сложно сказать что-то конкретное. Какие настройки были выполнены? Какой почтовый сервер используется?

Рекомендую ознакомиться со статьей по вопросам, возникающим при работе с почтой и статьей по настройке учетной записи почты.

Если данная статья не поможет решить описанную проблему, обратитесь в службу поддержки Террасофт для консультации по этому вопросу.

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

К сожалению, по Вашему описанию проблемы, сложно сказать что-то конкретное. Какие настройки были выполнены? Какой почтовый сервер используется?

Рекомендую ознакомиться со статьей по вопросам, возникающим при работе с почтой и статьей по настройке учетной записи почты.

Если данная статья не поможет решить описанную проблему, обратитесь в службу поддержки Террасофт для консультации по этому вопросу.

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

При замещении метода getDeduplicationSettings из утилитного модуля DuplicatesSearchUtilitiesV2 в схеме LocalDuplicateSearchPageV2 и добавлении пользовательской логики, не отрабатывает с первого раза. При повторном и последующем использовании все выполняется. 

Нравится

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

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

Григорий Чех,

Базовая логика как раз таки отрабатывает отлично, а вот пользовательский код как раз таки фаталит

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

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

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

Нравится

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

Для начала нужно в браузере пунктом меню «Inspect» открыть исходники нужного места в системе и выяснить, как называется схема страницы, которую Вы хотите доработать. Затем вносить изменения в её коде. Поскольку это не обычная карточка раздела, заполнение должно будет делаться программно.

Более точно можно сказать, если будет ясно, что именно куда именно добавить: в вышеупомянутый Вами LocalDuplicateSearchPageV2, в DuplicatesPageV2 или же ещё куда-то.

Также обратите внимание на дополнение Automatic duplicates merge в маркете, которое модифицирует логику слияния дублей. Возможно, в ней есть подобные решения.

Добрый день!

На данный момент в базовой версии bpm'online  выполнять настройку колонок можно только для массового поиска дублей



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

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

Добрый день, коммьюнити,

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

Пробовал присваивать переменным значения CurrentContact и Owner - значения снова пустые. Пробовал прописывать this.get("CurrentContact") вместо "CurrentContact" - все равно пусто. Методы не из миксина работают.

Благодарен заранее за любую помощь!

 

onEntityInitialized: function() {
 
//присваиваем значение CurrentContact. Owner, который используется ниже, присваивается еще раньше
	this.set("CurrentContact", {
		value: this.get("Id"),
		displayValue: this.get("Name")
 
	});
 
//запускаем метод из миксина, он запускается и отрабатывает, но CurrentContact там пустой
	this.mixins.CustomCallMixin.initCallExtendedMenuButtonCollections(["CurrentContact", "Owner"], this.close);
 
//остальные методы отрабатывают нормально
	this.setJobTitle();
	this.fillEmailExtendedMenuButtonCollections(["CurrentContact", "Owner"]);
	this.fillCallExtendedMenuButtonCollections(["CurrentContact", "Owner"]);
	this.fillLinkedEntitiesMenuButtonCollections(["CurrentContact"]);
	this.callParent(arguments);
 
}

 

Нравится

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

Добрый день! не корректный вызов миксина. Для начала кастомный миксин нужно добавить в зависимости модуля:

define("AbCarInsurance1Section", ["AbEwaModelsHandlerMixin"], 
function() {
	return {
		entitySchemaName: "AbCarInsurance",
		mixins: {
			AbEwaModelsHandlerMixin: "Terrasoft.AbEwaModelsHandlerMixin",
		},
		attributes: {},
		messages: {},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			onEntityInitialized: function () {
 
				this.onSetContractInCard(contract);
			}			
 
		}
	};
});

где this.onSetContractInCard(contract) - мтод миксина

Добрый день! не корректный вызов миксина. Для начала кастомный миксин нужно добавить в зависимости модуля:

define("AbCarInsurance1Section", ["AbEwaModelsHandlerMixin"], 
function() {
	return {
		entitySchemaName: "AbCarInsurance",
		mixins: {
			AbEwaModelsHandlerMixin: "Terrasoft.AbEwaModelsHandlerMixin",
		},
		attributes: {},
		messages: {},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			onEntityInitialized: function () {
 
				this.onSetContractInCard(contract);
			}			
 
		}
	};
});

где this.onSetContractInCard(contract) - мтод миксина

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

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

я в зависимости добавлял, просто не указывал этот кусок кода

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