Подскажите как сделать валидацию номера для "Средства связи"? Читал статью 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).

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

Нравится

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

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

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

Доброго времени суток! Подскажите, пожалуйста, как добавить 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 без общего буфера обмена и расшаренных папок.

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

Доброго времени суток.

Версия 7.8 sales.

Задача такая: на детали Средства связи на странице Контакта есть поля "Мобильный телефон" и "Основной телефон". Также у контакта есть своё поле "Мобильный телефон".

При создании контакта значение из поля контакта "Мобильный телефон" автоматически добавляется в соответствующее поле детали Средства связи.

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

Спасибо.

Нравится

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

При сохранении контакта:
1й запрос на проверку, есть ли в contactcommunication этого контакта "Основной телефон"
2й запрос update если есть, insert если нет.

Просто так добавить, думаю, будет сложновато, ибо синхронизация вшита в БП, БП запускается при сохранении, он запускает функцию синхронизации, функция запускает хелпер, и уже в C# хелпере происходит синхронизация. Что-то неохота все это расковыривать ради доп. поля

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

Как и поля детали "Адреса"

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

Добрый день.

Создали в "Средствах связи" в карточке контакта новый тип средства связи - "Доп.email".
В профиле карточки контакта создали поле "Доп. email" куда хотим выводить доп.email из средств связи.
Но, как видно из прикрепленного скриншота, в профиль контакта в поле "Доп. email" ничего не выводится, хотя в средствах связи указан "Доп.email" контакта.
Как подтягивать в профиль контакта "Доп.email" из средств связи, аналогично другим средствам связи?

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

Нравится

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

Здравствуйте,
Дело в том, что деталь, это отдельный объект в системе. В вашем случае объект детали "средства связи контакта": «ContactCommunication». А сама карточка контакта, другой объект (таблица в бд): "Contact", в которой самые основные средства связи продублированы, к примеру, как вы продублировали, создав поле "Доп. email". Но что бы оно заполнялось, необходимо написать соответствующую логику. К примеру, вы можете создать бизнес-процесс для этой цели, по событию создания экземпляра ContactCommunication, и в связанный контакт при этом, элементом «изменение данных», записывать сохраняемый дополнительный E-mail из детали в контакт. Подробнее про БП читайте в цикле статей на академии:
https://academy.terrasoft.ua/documents/technic-bpms/7-8/obzor-vozmozhno…

Максим Шевченко пишет:
Но что бы оно заполнялось, необходимо написать соответствующую логику

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

Как расширить базовую логику, чтобы синхронизировались доп. поля? 

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

Здравствуйте!
В продукте sales enterprice 7.8 в справочнике "Типы с средств связи" добавляю новое средство связи "Ссылка на VK" и выбираю тип коммуникации "Соц. сеть", но после добавления на странице контакта и контрагента запись в поле "Ссылка на VK"отображается в виде текста, даже если вводить через http.
Нужно реализовать обработку поля "Ссылка на VK" как ссылку без изменения типа коммуникации на "Web" и без реализации синхронизации с аккаунтом Вконтакте.
При этом стандартные средства связи Facebook и Twiter оставить рабочими (с реализацией синхронизации).

Нравится

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

В базовой версии приложения функционал средств связей, например, с типом «E-mail» и «Web» реализован только для базовых значений (реализовано на уровне конкретных ID). Реализацию данного функционала можете посмотреть в схеме «BaseCommunicationViewModel».

Если Вы хотите, чтобы пользовательские поля с типом «Web» имел такую же логику как и базовая, то есть работал как ссылка, то попробуйте пожалуйста, следующее:

- заместить полностью «CommunicationUtils»;
- переопределить метод isWebType, возвращая там true для не только базовых записей по Id, но и для Вашей.

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

Илья, спасибо! Разобрались:smile:

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