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

При обеих случаях заходит в метод указанный в prepareList, так же правильно берет данные, но если запись только добавлена в деталь(пока нету в БД) при set'е поля которое указанно в list, ничего не происходит.

 

Код генерации конфига ComboBoxEdit'а:

 

var result =
{
	className: "Terrasoft.ComboBoxEdit",
	value: {bindTo: "CountryOfNumber"},
	list: {bindTo: "CountryOfNumberList"},
	prepareList: {bindTo: "isSkypeAddress"}
};
return result;

Код метода подготовки листа(prepareList):

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
	rootSchemaName: "Country"
});
 
var test = this;
 
esq.addColumn("Id");
esq.addColumn("Id");
var nameColumn = esq.addColumn("Name");
 
nameColumn.orderDirection = Terrasoft.OrderDirection.ASC;
 
esq.getEntityCollection(function(result) {
	var collection = Ext.create("Terrasoft.Collection");
	if (result.success) {
		var selectedTags = result.collection;
		selectedTags.each(function(item) {
			var countryId = item.get("Id");
			var countryName = item.get("Name");
			var menuItemConfig = {
				value: countryId,
				displayValue: countryName
			};
			collection.add(countryId, menuItemConfig);
		}, this);
	}
	this.set("CountryOfNumberList", collection);
	var test = this.get("CountryOfNumberList");
}, this);
var collection = Ext.create("Terrasoft.Collection");
return collection;

PS. (https://community.terrasoft.ru/questions/lookup-pole-v-detali-sredstva-…)Данную статью видел, ничего полезного там нету 

Нравится

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

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

Проверьте точно ли одинаковые записи приходят из запроса. Лучше сравнить все поля и значения.

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

Добрый день! Интересует процесс добавления детали Средства связи в любой выбранный раздел  - необходим именно процесс добавления в раздел с помощью кода (не используя мастер разделов и тд). 

Нравится

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

Посмотрите как реализованы средства связи в контактах и контрагентах.

 

Есть объект BaseCommunication, от которого наследуются AccountCommunication и ContactCommunication, добавляющие соответствующие колонки связи. Для схем деталей аналогично: BaseCommunicationDetail с базовой логикой формирования данных и отрисовки, от которого наследуются AccountCommunicationDetail и ContactCommunicationDetail. Ну и потом эти детали размещаются на своих страницах редактирования.

 

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

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

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

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

Нравится

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

Добрый день! что касается добавления кнопки к полю, то подобное описано в данной статье. Что касается осуществление звонка, то Вам нужно подключить миксин CommunicationOptionsMixin в своем модуле откуда будете осуществлять звонок и привязать на кнопку метод обработчик, в результате выполнения которого будет вызываться один из методов миксина: callContact(number, contactId) или же callAccount: function(number, accountId)

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

 Проблема в том что вызов нужно сделать из раздела "Обращения", в записи которого нет контакта (анонимное обращение, где телефонный номер человек отправляет из формы для связи). По этой причине поле номера телефона было созданно кастомное, но связки с контактом или контрагентом нет, а в миксине нужна привязка эта. Если контакт привязан, то при наведении на его миникарточку можно нажать на иконку звонка, и при таком звонке к нему будет привязано обращение из которого звонили, но если контакта нет то звонок из поля должен быть

Александр, эта функция в CommunicationOptionsMixin в конечном счёте посылает сообщение через «песочницу»:

this.sandbox.publish("CallCustomer", {
	number: number,
	customerId: customerId,
	entitySchemaName: entitySchemaName,
	callRelationFields: relationFields
});

А обработчик — в CtiPanelModelUtilities:

/**
 * Handler of call to the subscriber event.
 * @param {Object} numberInfo Call parameters information.
 * @param {String} numberInfo.number Subscribers phone number.
 */
onCallCustomer: function(numberInfo) {
	if (!this.get("IsConnected")) {
		this.sandbox.publish("SelectCommunicationPanelItem", {selectedItem: "CtiPanel"});
		this.logInfo(this.getResourceString("NotConnectedMessage"));
		return;
	}
	var phoneNumber = numberInfo.number;
	if (numberInfo.customerId) {
		this.set("AdvisedIdentifiedSubscriberInfo", numberInfo);
	}
	this.callByNumber(phoneNumber);
},

То есть параметр «customerId» не является обязательным и можно попробовать вызвать с одним лишь номером. А о добавлении связей, нужно смотреть, в каком формате при нормальном звонке передаётся callRelationFields и заполнить аналогичным.

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

CustomerId не обязательный, так как cti все равно определяет по номеру контакт , но если надо привязать ещё ссылку на запись раздела (в деталь связи) то обязательно как оказалось. Другими словами - что бы к звону привязать запись какого-то раздела, нужно что бы в системе обязательно существовал контакт которому звоните, так как если контакт не существует то и привязать к звонку нельзя не запись контакта не запись раздела из которого звоните. Ограничение зачем такое сделано не знаю, так как у меня рассмотрение анонимных обращений, и контакта нет, но звонки делают и привязать обращение к звонку надо, а нельзя

Если штатными API звонков не получится, можно вычислить Id нового звонка и создать записи или заполнить поля связей как обычные данные, заполнив поля по аналогии. Более подробно увидеть, что создаётся, можно, отловив уходящие к серверам HTTP или SQL-запросы.

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

Подскажите как сделать валидацию номера для "Средства связи"? Читал статью https://community.terrasoft.ru/questions/validacia-zapolnenia-telefona-v-detali-sredstva-svazi но this.addColumnValidator("Number", newItem.validateField, newItem); что бы в детали сделать замену валидации нужно полностью переписать то что в "BaseCommunicationViewModel" но это модуль и его нельзя замещать.

Нравится

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

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

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

 

Вот потому то и спрашиваю так как эти способы не работают, как можно сделать валидацию другим способом, пока в голову не пришло идеи не какой, может подскажите?

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

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

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

Там не переписывание всего текста модулей, а дополнение своим при помощи override. Но потом и замена всех упоминаний стандартного модуля на свой аналог.

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

Спасибо, получилось как описано в статье.

Сделал замещение BaseCommunicationDetail

 

define("BaseCommunicationDetail", ["KtValidBaseCommunicationViewModel"],
	function() {
		return {
			attributes: {},
			messages: {},
			methods: {},
			diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	});

и BaseCommunicationViewModel

define("KtValidBaseCommunicationViewModel", ["terrasoft", "BaseCommunicationViewModel"],
	function(Terrasoft) {
		Ext.define("Terrasoft.KtValidBaseCommunicationViewModelOverrided", {
			override: "Terrasoft.BaseCommunicationViewModel",
			/**
			 * @override
			 * ######### ######### ###### ########.
			 * @param {String} value ########### ########.
			 * @return {Boolean} true #### ###### ######## ##### ########.
			 */
 
			isPhoneNumber: function(value) {
				//Terrasoft.SysSettings.querySysSettingsItem("CommunicationPhoneRegExpValid", function(phoneRegExp) {
				//	var phonePattern = new RegExp(this.get("PhoneRegExp"));
				//	return phonePattern.test(value);
				//}, this);
				var phonePattern = /^\98(\(\d{3}\)\d{3}\-\d{2}\-\d{2})$/;
				return phonePattern.test(value);
			},
		});
	}
);

Все отлично работает если вшить регулярное выражение.

А как можно получить из системной настройки его? Получение значение в ней асинхронное и нужно сделать через callback, но не как не выходит. Помогите в реализации такого callback, пожалуйста.

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

Доброго всем дня.

 

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

Функционал отрабатывает следующим образом, на примере:

1. У контакта есть 2 телефона: 1 и 2. В профиле, в качестве основного, стоит номер 1. В средствах связи два номера телефона: 1 и 2.

2. При попытке сделать основным телефоном номер 2 при помощи его перезаписи поверх на номер 1 в профиле записи, в детали "Средства связи" номер 1 перезапишется номером 2, на что система ругнётся по факту дубля (номер 1 заменяется на 2, и в детали номера: 2 и 2).

Есть ли возможность корректно без "левых движений" определять номер телефона из детали "Средства связи" как основной, если этот номер таковым не является?

Нравится

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

Если стандартного способа не предусмотрено, можно сделать БП, запускающийся из меню кнопки «Запустить процесс»: сначала на преднастроенной странице выбирать запись из справочника средств связи, отфильтрованных по контакту, потом её писать в соответствующее её типу поле выбранной записи в таблице контактов.

Тоже столкнулись с такой необходимостью и сделали дополнение



https://marketplace.terrasoft.ru/template/upravlenie-osnovnymi-sredstva…

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

Доброго времени суток! Подскажите, пожалуйста, как добавить CheckBox в средства связи. Для средства связи добавил в объекте логическое значение, например с названием "UsrIsMain".

Нравится

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

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

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

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

В принципе мне понятно, как конфиг строится. Добавлял TextEdit поле, Lookup поле. А вот CheckBox не получается, выбрасывает ошибку следующую:

 

message: Cannot read property 'changeEvent' of undefined 

 date: Thu Jun 13 2019 11:01:45 GMT+0300 (Москва, стандартное время)

moduleId: CardModuleV2_########GUID###########_ContactPageV2_detail_ContactCommunication

moduleName: DetailModuleV2



Строил сам CheckBox вот так:

{

                        className: "Terrasoft.CheckBoxEdit",

                        id: "CheckBoxEditId",

                        classes: {

                            wrapClass: ["communication-detail-edit-user-class", "communication-additional-edit-label-wrap"]

                        },

                        value: {

                            bindTo: "UsrIsMain"

                        },

                        change: {

                            bindTo: "changeIsMainFlag"

                        }

  };



Сама функция changeIsMainFlag объявлена в ViewConfig'е.

 

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

Вообще видел уже два поста в коммьюнити, которые тоже не понимали, как CheckBox вставить в Средства связи. Ответа там так и не было.

В детали средств связи контакта в пакете MarketingCampaign есть такое поле «Не актуальный» (NonActual) у каждого средства связи. Посмотреть на реализацию можно в схеме ContactCommunicationDetail.

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

Добрый день!

 

Версия 7.12.3.

Столкнулся с проблемой, одному из пользователей (upd: на самом деле не одному, проблемы точно нет у cупервизора) система не позволяет менять/удалять инфу на детали Средства связи в Контакте (добавлять разрешает). Происходит это не у всех контактов, только на некоторых, системы еще не обнаружил (upd: обнаружил - сбой на контактах, заведенных после 16 августа сего года включительно).

BatchQuery возвращает сообщение об ошибке из темы, сама CRM показывает:

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

Права на объект вроде по умолчанию.

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

Что это за глюк?

Нравится

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

Попробуйте перераздать права на через решение Access rights setup wizard for bpm'online

А объект "Контакт" администрируется?

Судя по настройкам, нет.

Хотя на вкладке "Доступ к записям по умолчанию:" есть записи.

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

Не, сообщение приходит в ответ на 0/DataService/json/SyncReply/BatchQuery.

"Трасформируется" (неправильно) для вывода на экран в методе onSaved от BaseCommunicationDetail.

 

Борис Леонов,

Добрый день! В объекте детали ContactCommunication в свойстве "Доступ" у вас стоят где нибудь выбранные пункты?("По операциям, по колонкам и др."). Для полного доступа галочки напротив данных полей должны отсутствовать.

 

engineer7,

нет, галочки не установлены

Борис Леонов,

возможно данная статья сможет Вам помочь: https://academy.terrasoft.ru/documents/sales-enterprise/7-10/detal-dostup-k-obektu-razdela-dostup-k-obektam

engineer7,

на детали, указанной в статье, пусто, нет ни одной записи

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

А нет другой логики на сигналы с детали (в том числе на уровне объектных бп)?

Если есть доступ в базу, можно посмотреть скрытые в интерфейсе таблицы прав SysContactRight и SysContactCommunicationRight, если они есть. Отфильтровать по Id контактов и записей на детали средств связи, взяв примеры, созданные до и после 16. Может, права почему-то всё же выдались. Например, если тогда кто-то менял настройки прав для объекта и вернул как было.

Также можно попробовать включить по объектам Contact и/или ContactCommunication права по записям, а потом обратно выключить. Возможно, при прошлом выключении был сбой и не выключилось полностью. Лучше перед этим сделать бекап или проверять на копии базы.

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

 

 

Попробуйте перераздать права на через решение Access rights setup wizard for bpm'online

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

Добрый день!

При сохранении записи в детали средства связи возникают странные ошибки. Метод сохранения вызывает BatchQuery для Update сохраняемой записи. 

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

Однако при исполнении данного скрипта возникает следующая ошибка:

Конфликт инструкции DELETE с ограничением REFERENCE "FK4eIKa4vC33vluosjyKmFjgDPk3o". Конфликт произошел в базе данных "ArdshinBank7102-2", таблица "dbo.AppFormCommunication", column 'ContactCommunicationId'. ↵Выполнение данной инструкции было прервано."

Непонятно, каким образом возникло удаление, если выполнялся скрипт на модификацию записи.

 

Посмотрел событийные процессы объекта ContactCommunication, нигде нет удаления.

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

 

Нравится

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

вот вам скрипт поиска зависимостей по ключу

 

SELECT
    C.CONSTRAINT_NAME,
    PK.TABLE_NAME,
    CCU.COLUMN_NAME,
    FK.TABLE_NAME,
    CU.COLUMN_NAME,
    C.UPDATE_RULE,
    C.DELETE_RULE
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C INNER JOIN
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON PK.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME
WHERE
    FK.CONSTRAINT_TYPE = 'FOREIGN KEY' AND c.[CONSTRAINT_NAME] like '%KEY'
ORDER BY
    PK.TABLE_NAME, 
    FK.TABLE_NAME;

Вместо '%Key' -> '%FK4eIKa4vC33vluosjyKmFjgDPk3o' и смотрите какая колонка от какой зависит.

И насколько я понимаю update = delete->insert в sql

Так откуда зависимость, как раз понятно из сообщения: в другой таблице AppFormCommunication есть ссылка ContactCommunicationId. Но почему при изменении ContactCommunication связь сломалось — надо разбираться.

Update — это не Delete с Insert. Ведь при переименовании какого-нибудь контакта система не ругается на связи с ним.

Тут одно из двух: либо скрипт автора темы затирает первичный ключ Id в этих записях новыми значениями (что маловероятно), либо есть какая-то логика на изменении этой таблицы в виде отдельного БП, встроенного БП объекта или триггера в базе.

Понять можно либо изучением всех упоминаний объекта ContactCommunication во всех схемах, либо, если есть доступ к БД, запустить профайлер и смотреть, что за Delete.

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

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



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





1. В BaseCommunicationDetail существует биндинг поля enabled на метод getCommunicationEnabled, но метод getCommunicationEnabled не вызывается.

2. Сможем ли мы в теории посмотреть в таком методе на параметр новизны записи?

Нравится

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

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

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

Этот метод достаточно сложно переопределить, так как он находится в BaseComunicationViewModel.

Проще переопределить метод getCommunicationItemViewConfig в BaseCommunicationDetail в котором модифицировать поле enabled у редактируемого поля.

А чтобы определить новый это объект создается или нет, можно в этой же детали добавить атрибут или переменную булеовго типа и переопределить метод addItem, в котором переменную (например, isNewItem) менять на true, тогда в getCommunicationItemViewConfig смотря на эту переменную вы определите дальнейшее поведение.

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

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

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

Стоит задача: предотвратить возможность пользователей копировать значения из полей детали "Средства связи" на странице Контакта. Кто-то занимался когда-нибудь подобной задачей?

Нравится

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

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

Заблокировать копирование средствами bpm'online вряд ли получиться. но вы можете использовать стандартные средства JavaScript, например:

  • событие oncopy разрешает выделение текста, но полностью зарпещает копирование (сам пробовал, не нашел способа реально скопировать текст, как по мне - один из самых простых и достаточно надежных способов). Единственный недостаток - на некоторых  браузерах может работать не так, как ожидается (в Edge, Chrome, Mozilla, Opera работает точно хорошо).
  • отмена события ​onmousedown​ (для IE - onselectstart) - можно поставить return false для этих событий, что запртетит выделение. Проблема с этим событием в том, что если начать выделение за пределами контейнера, для которого отменены эти событие, текст все-таки выделится.
  • CSS свойство xxx-user-select, где xxx - префиксы браузеров (например, -webkit-, -moz-, -ms-) запрещает выделение, но оно так и не было внесено в стандарты, хотя и поддерживается большинством браузеров (кроме IE9-)

Можете попробовать один из способов или их комбинации.

Золотарев Артем Андреевич,

Артем, добрый день!

Подскажите, пожалуйста, по коду:

define("ContactCommunicationDetail", ["terrasoft"],
	function(Terrasoft) {
		return {
			entitySchemaName: "ContactCommunication",
			methods: {
				init: function() {
					this.callParent(arguments);
					document.body.oncopy = function() { return false; };
				}
			},
			diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	});

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

В любом случае пользователь сможет нажать в браузере F12 и скопировать всё нужное из HTML-кода страницы.

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

Разве что заставить пользователей работать с системой в браузере на изолированном компьютере по  RDP без общего буфера обмена и расшаренных папок.

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