Добрый день!
Подскажите пожалуйста, есть ли возможность реализовать для версии 5.4, ввод телефона по фиксированной маске, например: +7 (___) _______ ?

Нравится

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

Да, такая возможность есть (см. в конце статьи).

Спасибо, ценный материал!

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

Добрый день. Необходимо в bpmonline 7.5 добавить скрипт для командной строки, чтобы при вводе телефона, находились контакты. Настройка профиля командной строки не подходит. Подскажите пожалуйста, как это можно реализовать? Или где возможно найти модули отвечающие за командную строку?

Нравится

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

Такой же функционал вы можете существует в комуникационной панели.

Владимир, а что вы имели в виду под "Такой же функционал вы можете существует в комуникационной панели"?

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

http://academy.terrasoft.ua/documents/docs/product/bpm'online%20ITIL%20…

Нашел вам стать, в которой описан функционал CTI панели

Хотел ещё у вас уточнить какой Вы используете продукт?

Владимир, bpmonline 7.5 commerce. А каким образом связана коммуникационная панель и командная строка, ведь в коммуникационной панели есть только: лента, уведомления ленты и виза?

Уточните, пожалуйста, для какого продукта и версии вы хотите сделать данный функционал?

Владимир, BPMOnlineCommerce Версия 7.5.0.627.

Из коммандной строчки есть возможность запускать процессы (Run Process)

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

Иван, возможно вы меня немного не так поняли, или я плохо объяснил. Мне необходимо, просто поменять фильтр поиска, по умолчанию если ввести любое значение на главной странице, то будет поиск по ФИО контакта, а необходимо сделать по телефону контакта.

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

Иван, есть возможность поменять на другую колонку. Необходимо поменять primaryDisplayColumn у объекта Contact, это либо можно сделать в настройках объекта в расширенных свойствах, поменяв колонку "отображаемое значение" во вкладке "системные колонки". Либо как сделал я, заменил значение в модуле ContactSectionV2.js, в функции init()

                        this.entitySchema.primaryDisplayColumn.name="Имя колонки(как в базе данных)";
                        this.primaryDisplayColumnName="Имя колонки(как в базе данных)";
                        this.entitySchema.primaryDisplayColumn.caption="Просто имя колонки, это будет отображаться на странице";
                        this.entitySchema.primaryColumn.uId="Уникальный id колонки, можно посмотреть в метаданных объекта";
                        this.entitySchema.primaryDisplayColumn.uId="Уникальный id колонки, можно посмотреть в метаданных объекта";

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

"Киричатый Иван Владимирович" написал:

Из коммандной строчки есть возможность запускать процессы (Run Process)

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


а можно подробней, как это реализовать? или пример?

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

Предварительно, Вам необходимо настроить бизнес процесс.
Бизнес процесс приблизительно следующий:
Автогенерируемая страница с полем с типом строка. Назовем это поле "Номер".
Чтение данных (считаем количество записей) по объекту "Средства связи контакта" с фильтром Номер = Автогенерируемая страница.Номер
Условные потоки:
если количество == 0, тогда конец процесса или вывести автогенерируемую страничку с предупреждением, что информации о таком номере нет.
если количество != 0, тогда идем дальше:
Чтение данных (читаем первую запись) по объекту "Средства связи контакта" с фильтром Номер = Автогенерируемая страница.Номер
Чтение данных по объекту "Контакты" с фильтром Id = Средства связи контакта.Id
Открыть страницу редактирования Контакта, режим редактирования существующей записи, где id = Чтение данных контакта.Первый элемент результирующей коллекции.Id

Процесс с командной строки будет вызываться командой "Запустить процесс + [Название Вашего процесса]".

спасибо, все получилось

а есть ли возможность выводить список контактов/контрагентов которые содержат этот номер?

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

Без использования программирования такой возможности нет.
Для того, чтобы вывести всех контактов и контрагентов:
1) создайте новую преднастроенную страницу с фильтрацией из объектов "Средства связи контакта" и "Средства связи контрагента"
2) используйте элемент "Преднастроенная страница" в бизнес процессе.
Укажите страницей созданную Вами. В параметр фильтрации Вам нужно передавать средство связи.

В результате, Вам отобразятся все записи контактов и контрагентов.

Если у Вас небольшая база, то можно обойтись без программирования.
Создайте автогенерируемую страницу из 4 полей:
1) 2 поля для контактов
2) 2 поля для контрагентов.

Заполнить эти поля Вы сможете из параметров элемента "Чтение данных" контактом или контрагентом.

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

Добрый день!
Были изменены поля с телефонами контактов, добавлены 2 поля [Телефон] и [Мобтел], который содержат ID телефонов контрагента. Датасет ds_ContactCommunication не используется вовсе, поля в таблице Контактов - Communication1,2,3,4 и Communication1,2,3,4Type спрятаны и не используются.

Подскажите пожалуйста в каких скриптах необходимо изменить, чтобы он всегда обращался к этим полям и соответственно звонил только по ним.
Или можно хитрым способом: переделать ds_ContactCommunication на поля AccountCommunication, a поля [Телефон] и [Мобтел] переименовать в Communication1 и Communication2?

Нравится

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

Добрый день!
По постановке задчи можно предположить, что в таблице tbl_Account имеются 2 поля: PhoneID и MobileID типа UID, которые связанны по вторичному ключу с талицей tbl_AccountCommunication, полем ID. Очевидно, что для того, чтобы отобразить те же записи в выборке sq_Contact необходимо обратиться полям PhoneID и MobileID таблицы tbl_Account которая уже связанна с sq_Contact по вторичному ключу AccountID - это иллюстрирует прилагаемый скриншот.
AccountID.png

И если задача заключается в том, чтобы отобразить в карточке Контакта записи из таблицы tbl_AccountCommunication, связанные с tbl_Account по полям PhoneID и MobileID, в таком случае, в сервисе sq_Contact обратитесь непосредственно необходимым записям из талицы tbl_AccountCommunication в Subselect.

  1. Создаем Subselect в сервисе sq_Contact, называем его Phone
    Subselect Pnone
  2. В блоке FROM указываем таблицу tbl_AccountCommunication
  3. В блок WHERE добавляем фильтр сравнения:
    CompareFilter
  4. В блок Select поле Number из таблицы tbl_AccountCommunication, алиас ему можно задать, например, Phone

    AccCommunicationPhone.png

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

Задача заключается не в отображении данных, а в обращении к ним при звонке.
У контрагента может быть скока угодно телефонов, а у контакта лишь городской или мобильный, которые выбираются из телефонов контрагента. С отображением и взаимодействием проблем нет.
Таблица tbl_Account не была затронута на изменение телефонов, т.е. там все как было. В таблице tbl_Contact добавлены 2 поля: PhoneID и MobileID типа UID, которые связанны по вторичному ключу с талицей tbl_AccountCommunication, полем ID.
И когда выбираешь действие позвонить контакту он пишет пустые поля, так как обращается к communication1,2,3,4 а они соответственно пусты. Вот тут надо изменить, чтобы он звонил по телефону и по мобильному контакта.

Здравствуйте, Константин.

Для контакта также можно задать сколько угодно средств связи различных типов, помимо 4-ех основных, которые отображаются в карточке редактирования. Именно поэтому, к примеру, при создании нового контакта, эти 4-ре средства связи копируются также на деталь "Средства связи контакта", которые в дальнейшем используются в т.ч. при звонках.
В связи с этим, предлагаю Вам :

1) В sq_ContactCommunication переделать выборку Communication1(2) на связанные поля в карточке контрагента. (если связь отсутствует - добавить).
2) В датасете ds_ContactCommunication переименовать заголовок полей Communication1, Communication2 на "Мобильный телефон", "Городской телефон". При необходимости изменить тип поля.
3) В коде при нажатии кнопки "Ок" карточки редактирования "захардкодить" CommunicationType1(2) на ID типа "телефон".

Далее для теста создайте новый контакт и заполните ему данные поля. Проверьте, если выбранные номера телефонов были скопированы на деталь "средства связи" - значит все ок. Можно звонить.

Решил сделать проще, так как уже поля PhoneID и MobileID созданы и работают корректно, просто по нажатию на кнопку ok копируются значения в поля communication1,2 и соответственно присваиваются их communicationtype1,2.
Но возникла другая проблема, выкидывает на ошибке throw ErrorMgs

function CheckAssigned(Object, ObjectName) {
	if (!Assigned(Object)) {
		var ErrorMgs = FormatStr(ObjectNotAssignedError, ObjectName);
		throw ErrorMgs;
	}
}

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

После долгих копаний в дебагере выянилось, что ошибка вылетает при выполнении функции SelfOnDatasetAfterPost(Dataset) в scr_Contact внутри которой есть функция ActualizeCommunicationEx(Dataset, Contact.ModifiedCommunicatonPositionArray, 'ContactID'):

function ActualizeCommunicationEx(Dataset, PositionArray, FilterFieldName) {
	var CommunicationDatasetUSI = Dataset.Attributes('CommunicationDataset');
	if (IsEmptyStr(CommunicationDatasetUSI)) {
		return;
	}
	var CommunicationDataset = GetSingleItemByCode(CommunicationDatasetUSI, 
		'CommunicationUtils');
	ApplyDatasetFilter(CommunicationDataset, 
		FilterFieldName, Dataset.Values('ID'), true);	
	CommunicationDataset.DisableEvents();
	try {
		CommunicationDataset.Open();
		for (i = 0; i < PositionArray.length; i++) {
			FieldName = 'Communication' + PositionArray[i];
			if (!CommunicationDataset.Locate('Position', PositionArray[i])) {
				if (!IsEmptyValue(Dataset.Values(FieldName))) {
					CommunicationDataset.Append();
					CommunicationDataset.Values(FilterFieldName) = 
						Dataset.Values('ID');
					CommunicationDataset.Values('Position')	= PositionArray[i];
					CommunicationDataset.Values('Number') = 
						Dataset.Values(FieldName);
					CommunicationDataset.Values('Digits') = 
						DigitsFromString(Dataset.Values(FieldName));						
					CommunicationDataset.Values('CommunicationTypeID') = 
						Dataset.Values(FieldName + 'TypeID');
					CommunicationDataset.Post();
				}
			} else
			if (IsEmptyValue(Dataset.Values(FieldName))){
				CommunicationDataset.Delete();
			} else {
				CommunicationDataset.Edit();
				CommunicationDataset.Values('Number') = 
					Dataset.Values(FieldName);
				CommunicationDataset.Values('Digits') = 
					DigitsFromString(Dataset.Values(FieldName));						
				CommunicationDataset.Values('CommunicationTypeID') = 
					Dataset.Values(FieldName + 'TypeID');
				CommunicationDataset.Post();
			}
		}
	} finally {
		CommunicationDataset.Close();	
		CommunicationDataset.EnableEvents();
	}
}

А конкретно у него CommunicationDatasetUSI определяется как ds_AccountComunication, вместо ds_ContactCommunication, что и вызывает дальнейшую ошибку по несуществующему фильтру.
Dataset является Контакт.

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

А какое значение параметра FilterFieldName в функции?
Есть ли фильтр с таким именем в sq_AccountCommunication и sq_ContactCommunication?

Здравствуйте.
FilterFieldName=ContactID и он есть в sq_ContactCommunication

Константин, нужно либо отладчиком пройтись по функции которая идет перед вызовом ActualizeCommunicationEx(Dataset, PositionArray, FilterFieldName), и проверить почему передается не верное значение атрибута CommunicationDataset.

Либо второй вариант:

try
{
var CommunicationDataset = GetSingleItemByCode(CommunicationDatasetUSI,
                'CommunicationUtils');
ApplyDatasetFilter(CommunicationDataset, 
                FilterFieldName, Dataset.Values('ID'), true);
}
catch(e)
{
var CommunicationDataset = Services.GetNewItemByUSI('ds_ContactCommunication');
ApplyDatasetFilter(CommunicationDataset, 
                FilterFieldName, Dataset.Values('ID'), true);
}

try catch не помогает, все равно выкидывает на том же месте и не идет на catch.
Показывает ошибка "OLE error 80020101"
Через отладчик нигде не видно AccountCommunication :exclaim:

Доброе утро, Константин.

Ок, тогда предлагаю в функции OnDatasetAfterPost перед вызовом ActualizeCommunicationEx, явно задать атрибут для Dataset'a:

Dataset.Attributes('CommunicationDataset') ='ds_ContactCommunication' ;

Все получилось. И в правду доброе утро!:biggrin:
Спасибо Большое!!
По этому же вопросу, у контакта появились пункты позвонить по "Городскому телефону" и по "Мобильному телефону", но пишет всегда что они пусты.
Меню - позвонить контакту, все нормально, дает выбрать все телефоны контакта.

Здравствуйте, Константин.

Скорее всего пункты позвонить по "Городскому телефону" и по "Мобильному телефону" обращаются к полям Communication1(2) карточке редактирования контакта (именно контакта, а не средств связи) .
Поэтому, необходимо настроить копирование также и в эти поля.

Все хорошо копируется, вот таблицы:
contact.txt
contactcommunication.txt

Доброе утро, Константин.

В таком случае сложно ответить однозначно в чем проблема.
Необходимо установить отладчик на пункт "Позвонить по городскому телефону" и пошагово отладиться.
Если у Вас возникнут какие либо сложности - обращайтесь.

Добрый день.
Вопрос как раз в том как найти этот пункт. Никак не могу понять как он формирует этот список.

Здравствуйте, Константин.
Предлагаю запланировать удаленное подключение к Вашему рабочему месту. Попробуем отладиться с Вами вместе, и исправить данную ситуацию. Сообщите удобную для Вас дату и время.

Давайте в пятницу, с 10.30- 17.00 по Москве, попробую подстроиться.

Константин, здравствуйте.

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

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

Дмитрий, здравствуйте.
Вот что получилось:

		if (DataField.Name == 'MobileID')               //если мобильный
			{
			 	var AccountDataset = Services.GetNewItemByUSI('ds_Contact');
			 	var IDDataset = Dataset.DataFields('ID');
			 	var IDS=IDDataset.Value;
			 	ApplyDatasetFilter(AccountDataset, 'MobileID', DataFieldValue, true);
			 	ApplyDatasetFilter(AccountDataset, 'ID', IDS, true);
			 	AccountDataset.Open();
			 	DataFieldValue = AccountDataset('ID');
			 	AccountDataset.Close();
			 	LookupDatasetUSI='ds_ContactCommunication';     // привязываем ContactCommunication
			}

Ну и перед вызовом фильтруем по CommunicationTypeID чтобы показывал только Мобильный, аналогична привязка и для Городского.
Еще раз Большое спасибо за разъяснения.

Здравствуйте, Константин.

Рад, что у Вас все получилось!
Если возникнут дополнительные вопросы - обращайтесь.

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

Добрый день!
Внес изменения в структуру контактов, касаемую телефонов. Добавлено 2 поля телефон и мобильный, имеющие ссылки на телефоны контрагентов (в виде справочника из AccountCommunication).
Создал справочник средств связи:

  • на основе данных (ds_AccountCommunication)
  • имеющие форму для окна реестра (wnd_CommunicationsGridArea)
  • окна редактирования (wnd_CommunicationEdit).

При добавлении нового телефона (кнопка добавить) вылетает ошибка. не передает id контрагента, не инициализирует датасет.

Нравится

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

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

В данном случае необходимо произвести отладку программного кода на Ваших добавленных сервисах.

Пожалуйста, предоставьте доработанные скрипты конфигурации и скриншот отладчика, где видно, на какой строке происходит сбой.

Инструкция по выгрузке сервисов: http://www.community.terrasoft.ua/blogs/6281

Инструкция по установке отладчика: http://www.community.terrasoft.ua/blogs/7804

Справочник создавался на основе данных ds_communication, а там AccountId как строка идет, может быть в нем дело?

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

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

Доброе утро. Высылаю сервисы.

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

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

В таблицу (запрос и датасет) Contact добавлены 2 поля Телефон и Мобильный, имеющие ссылки на AccountCommunication.
фото 0
При выборе телефона у контакта через поле телефон применяется лишь фильтр (показывает все телефоны контрагента)

function FilterLookupDataControlLookupDatasetByTel(LookupDataControl, 
		AccountIDValue) {
	var Dataset = LookupDataControl.DataField.LookupDataset;
		var tel='DBCB6A43-D99F-45AE-9B41-037DE595242E'   // тип средства связи - телефон
		ApplyDatasetFilter(Dataset, 'AccountID', AccountIDValue, true);
		ApplyDatasetFilter(Dataset, 'CommunicationTypeID', tel, true);
}

Открывается корректно. Выбирается тоже корректно.
Через Средства связи в модуле контрагентов, добавляется корректно.
Нормальный вид wnd_CommunicationsGridArea (добавлено для отображения поле AccountID)
фото 1
А вот при выборе у контакта телефона и добавлении нового, не идентифицирует AccountID и wnd_CommunicationsGridArea выглядит следующим образом (открывается другая форма)
фото 2

Создан справочник средств связи через клиентское приложение:
на основе данных (ds_AccountCommunication)
имеющие форму для окна реестра (wnd_CommunicationsGridArea)
окна редактирования (wnd_CommunicationEdit).
Они стандартные, лишь добавлено поле AccountID для отладки

Контсантин, если поля добавлены только в запрос, то редактировать их не получится, т.к. запрос Post не выполняется для таблицы AccountCommunication. Таким образом можно только добавить поля для показа.

В Вашем случае оптимальный вариант реализации будет следующим:

1. Добавить эти поля в датасет как вычисляемые.
2. В случае изменения значения в карточке менять содержимое tbl_AccountCommunication отдельным запросом.

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