Добрый день, коллеги! Подскажите пожалуйста что не так?

Я по туториалу(https://academy.terrasoft.ru/documents/technic-sdk/7-16/dobavlenie-detali-fayly-i-ssylki) все сделал. В схеме родительский объект вроде прописал верно - FileDetailV2. Но у меня деталь добавилась, но добавилась будто бы просто деталь, без возможности добавления файлов.

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

Нужно сделать что-то еще дополнительно?

Нравится

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

У вас версия ниже 7.12?

Владимир Соколов,

Нет, 7.15. А для 7.15 какой то другой алгоритм?

Описанный алгоритм для 7.12 и ниже



7.15 под рукой нет, но, кажется, как и 7.16 деталь с файлами создаётся автоматически при создании раздела

Добрый день.

Если говорить об базовой логике, то при создании нового раздела через мастер, деталь [Файлы и ссылки] будет присутствовать на странице редактирования за умолчанием. Добавление нового раздела описано в статье

Если добавлять деталь в существующий раздел, тогда детали с полями редактирования или нестандартными данными, например, [Файлы и ссылки], а также детали, данные которых не имеют прямой связи с текущей записью, создаются только средствами разработки. Подробнее читайте в документации по разработке, статья Деталь. Пример добавления детали Файлы и ссылки.

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

Товарищи, подскажите пожалуйста.



Как правильно реагировать на комментарии от портальных пользователей в обращении, созданные через интерфейс в карточке портального обращения.



Может есть какой то другой способ отличный от создания новой версии процесса Отправка Email сообщения контакту обращения при публикации сообщения в канале Портал - Мультиязычный?

Нравится

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

Михаил, не совсем понял вопрос.

Чем неправильно в разделе обращений нажать на кнопку с глобусом в верхней панели, написать текст ответа и так опубликовать на портале? Зачем при этом создавать новую версию процесса?

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

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

Как из действий CTI панели при запуске бизнес процесса открывать мини карточку?

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

 

Прикрепленные файлы

Нравится

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

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

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

Автогенерируемая страница не подойдет, нужна именно миникарточка.

Если использовать "преднастроенную страницу" и туда указывать мини карточку, то из CTI панели мини карточка не открывается. Просто по нажатию проставляется url типа CallMiniPage/add/GUID и ничего больше не происходит.

А какие-то ошибки при этом пишутся в консоли?

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

Добрый день!

На карточке Контрагента есть 2 справочных поля "Код отрасли" и "Отрасль", когда указываешь Код отрасли, выходят записи Отрасли в соответствии с кодом.

Настроила бизнес правило "Добавлять фильтр значений в поле" по справочнику "Отрасль".

По бизнес правилу в поле "Отрасли" не отображаются записи более 3х значении, и по полю "Код отрасли" так же. 

Подскажите пожалуйста, может быть такое, что где-то кодом зашит лимит по отображению записей?! Если да, тогда прошу направить, где и как смотреть

 

Каждая запись по коду, к примеру, 01, имеет свой "Стат гов ID", которая будет использоваться при интеграции  

 

Прикрепленные файлы

Нравится

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

Айгерим, не совсем понял, как между собой связаны эти 2 справочника и как именно правило настроили. Если в справочнике «Код отрасли» первичное поле для отображения «Название», то почему у Вас несколько со значением 98?

 

Вообще, ограничений в 3 записи быть не должно. Посмотрите, какой запрос идёт из браузера при открытии отфильтрованного окна выбора, какой там именно фильтр в первом и втором случае, есть ли разница.

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

Добрый день!

Делаю иерархическую деталь. Не работает отображение записей в детали. 

*Запрос отправляется.

*Ответ приходит.

*В объекте, по которому делается деталь, "Родитель иерархии" указан.

 

Код детали: 

define("NorbitContactProductDetail", ["ConfigurationGrid", "ConfigurationGridGenerator",
	 "ConfigurationGridUtilities"], function() {
	return {
		entitySchemaName: "NorbitContactProduct",
		messages: {},
		mixins: {},
		attributes: {},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			/**
			 * Скрыть кнопку "Добавить".
			 */
			/*{
				"operation": "remove",
				"name": "AddRecordButton"
			},*/
 
			/**
			 * Подключение иерархии детали.
			 */
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"visible": true,
					"type": "listed",
					"hierarchical": true,
					"hierarchicalColumnName": "NorbitParentContactProduct",
					"useLevelRendering": true
				}
			},
		]/**SCHEMA_DIFF*/,
		methods: {
 
			addGridDataColumns: function (esq) {
			   this.callParent(arguments);
				if (!esq.columns.contains("Name")) {
					esq.addColumn("Name");
				}
				if (!esq.columns.contains("NorbitCount")) {
					esq.addColumn("NorbitCount");
				}
				if (!esq.columns.contains("NorbitParentContactProduct")) {
					esq.addColumn("NorbitParentContactProduct");
				}
			},
 
 
			/**
			 * Скрыть пункт меню "Копировать".
			 */
			getCopyRecordMenuItem: Terrasoft.emptyFn,
 
			/**
			 * Скрыть пункт меню "Изменить".
			 */
			getEditRecordMenuItem: Terrasoft.emptyFn,
 
			/**
			 * Скрыть пункт меню "Удалить".
			 */
			getDeleteRecordMenuItem: Terrasoft.emptyFn,
		}
	};
});

 

Нравится

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

Александр, смотрю в существующих схемах деталей, например, в ProjectStructureDetailV2:

"hierarchicalColumnName": "ParentId", 

Может, и у Вас надо было писать не NorbitParentContactProduct, а NorbitParentContactProductId?

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

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

столкнулся с проблемой в детали Похожие лиды,

какие бы правила не включал, или даже выключал все, все равно работает сравнение по полю - Контрагент.

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

Суппорт подсказал только что должна использоваться процедура - tsp_FindLeadSimilarRecords, я внес в нее правки в базу, логирование на вызов, но она не вызываеться :(

 

пробовал отключить все существующие правила, и создать свое по процедуре, используя статью: https://academy.terrasoft.ru/documents/technic-sdk/7-16/dobavlenie-pravila-massovogo-poiska-dubley

настроил вызов все той же - tsp_FindLeadSimilarRecords, но процедура все равно не вызываеться.

 

может у кого то есть идеи как решить проблему?

 

Нравится

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

Похожий случай недавно обсуждали тут, возможно, у Вас причина та же самая.

 

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

 

В статье по Вашей ссылке отмечено:

Описанный процесс добавления правила массового поиска дублей актуален для Creatio версий 7.13.2 и ниже. Для версий системы 7.13.4 и выше функциональность поиска дублей описана в статье “Поиск и объединение дублей”, а работа с правилами поиска дублей при сохранении записи — в статье "Добавление правила поиска дублей при сохранении записи".

Проверьте, может, для Вашей версии настраивается иначе, не правкой хранимки.

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

Добрый день!



Помогите разобраться.

Задача: изменить объект привязки в сквозной воронке (по умолчанию воронка строится по Лидам и Продажам). Необходимо изменить продажу на заказ.

Нашёл, что изначально объекты привязки объявляются в FullPipelineDesigner (пакет Platform):

 

_getDefaultEntities: function() {
                return [
                    {
                        "schemaName": "Lead",
                        "connectedWith": null,
                        "calculatedOperations": [{"operation": "Amount", "targetColumnName": "Budget"}],
                        "filters": null
                    },
                    {
                        "schemaName": "Opportunity",
                        "calculatedOperations": [{"operation": "Amount", "targetColumnName": "Budget"}],
                        "connectedWith": {
                            "type": 0,
                            "schemaName": "Lead",
                            "connectionSchemaName": "Lead",
                            "parentSchemaColumnName": "Opportunity",
                            "childSchemaColumnName": "Id"
                        },
                        "filters": null
                    }
                ];
            }



При попытке создать замещающий модуль c переопределенной _getDefaultEntities система говорит: "Замещение модулей запрещено".

Подскажите как решить такую задачу?

Нравится

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

Александр, вопрос невозможности замещения модулей обсуждался неоднократно, см. тут и тут.

 

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

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

Добрый день.

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

К примеру есть разделе HR. на странице раздела есть поля для заполнения, и справочниками, и также есть деталь Задачи. Нужно одним запросом получить все что есть на странице. Возможно вообще такое получить?

Прикрепленные файлы

Нравится

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

Если и можно, то не по OData. Там показывает Id для справочных полей, Name нужно тянуть из объекта справочника отдельно, то же самое и для объектов деталей.

 

Возможно, вместо OData больше подойдёт DataService, который используется в интерфейсе системы для отображения в разделах и карточках записей с сервера. Детали всё равно надо будет отдельно, но значения для отображения из справочников подтянутся. Наконец, несколько запросов к нему можно послать в одном пакетном. То есть можно предусмотреть выборку записи из раздела и связанных с ней записей деталей.

 

Пример одной записи того, что возвращает сервер при заходе в реестр раздела контактов:

      {
         "Id":"b9e98250-72c5-df11-b1ad-001d60e938c6",
         "Name":"\u0410\u0432\u0434\u043E\u0440\u043E\u0432 \u0421\u0435\u0440\u0433\u0435\u0439 \u0412\u0430\u043B\u0435\u043D\u0442\u0438\u043D\u043E\u0432\u0438\u0447",
         "Photo":{
            "value":"dc0d78a5-18ce-4cbb-9afa-2d7d0143f4a6",
            "displayValue":"1.jpg",
            "primaryImageValue":""
         },
         "Job":{
            "value":"34f48df9-56e6-df11-971b-001d60e938c6",
            "displayValue":"\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440",
            "primaryImageValue":""
         },
         "Phone":"+7 495 780 80 82",
         "Account":{
            "value":"4bcc8fce-9bde-44ec-a431-302befd28640",
            "displayValue":"\u0410\u043A\u0441\u0438\u043E\u043C\u0430",
            "primaryImageValue":"ac4aa0b0-c255-4c01-a544-741b74e2430e"
         },
         "Email":"s.avdorov@yahoo.com",
         "MobilePhone":"+7 905 726 46 29",
         "EntryPointsCount":0
      },

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

 

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

 

Если же Вы хотите автоматически получать не сами данные, а их структуру, какие поля есть в карточке и на деталях, то эта информация хранится в коде схем карточки и деталей, по ней генерируется веб-страница, видимая в браузере. Теоретически, их разбирать умеет мастер раздела, можно попробовать разобраться в схемах SectionWizard, SectionPageWizard, PageWizard, ApplicationStructureItemWizard и многих других схемах, его реализующих.

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

Cпасибо за подсказки.

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

Добрый день!

 

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

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

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

Подпроцесс в свою очередь по сигналу добавления новой стадии "запускает" отправку емейл уведомления менеджеру:

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

Но наткнулся на 2 проблемы:

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

2. Как избежать запуска "Подпроцесса" для других заявок у которых новая стадия добавляется не с родительского процесса, а другими механизмами? (во избежание загрузки системы лишними процессами)

Нравится

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

Александр, Вы смешиваете два механизма: безусловный запуск подпроцесса из основного процесса и запуск процесса по сигналу на каком-то событии объекта.

 

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

 

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

Добрый вечер.

 

Если рассматривать Вашу реализацию задачи, то, во-первых, подпроцесс из родительского процесса можно не вызывать, он вызовется автоматически при наступлении события, указанного в сигнале. Во-вторых, параметр "Менеджер" можно вычитывать из записи в таблице 'Стадии' (это будет тот, кто создал эту стадию) и потом ему отправлять уведомление. Избежать запуска подпроцесса при добавлении новой стадии другими способами можно, если добавить в таблицу стадий некоторое поле-признак, которое будет указывать на добавление стадии по процессу, и перед отправкой письма проверять установлено ли значение для данного параметра. А в родительском процессе устанавливать значение этого параметра при создании стадии.

 

Правильнее, конечно, добавить вызов подпроцесса (но не по сигналу) из родительского процесса и в него передать и Id созданной стадии, и менеджера, которому нужно отправить письмо, но вызывать подпроцесс только тогда, когда новая стадия уже создана.

 

А в данном примере можно и не использовать подпроцесс, а добавить отправку e-mail менеджеру прямо в родительском процессе, но опять таки только тогда, когда новая стадия уже создана, то есть у Вас должен быть переход на отправку письма по условию.

Алла Савельева пишет:

Правильнее, конечно, добавить вызов подпроцесса (но не по сигналу) из родительского процесса и в него передать и Id созданной стадии, и менеджера, которому нужно отправить письмо, но вызывать подпроцесс только тогда, когда новая стадия уже создана.

А какой элемент в таком случае подойдет для запуска? 

 

 

Алла Савельева пишет:

А в данном примере можно и не использовать подпроцесс, а добавить отправку e-mail менеджеру прямо в родительском процессе, но опять таки только тогда, когда новая стадия уже создана, то есть у Вас должен быть переход на отправку письма по условию.

Тут же опять вопрос: а как понять что новая (последующая, другая) стадия уже создалась, если текущий экземпляр процесса работает в рамках созданной им одной записи, а все последующие стадии создаются вне процесса и прямо в процессе не участвуют?

Алла Савельева пишет: Во-вторых, параметр "Менеджер" можно вычитывать из записи в таблице 'Стадии' (это будет тот, кто создал эту стадию) и потом ему отправлять уведомление.

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

 

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

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

 

Александр, Вы смешиваете два механизма: безусловный запуск подпроцесса из основного процесса и запуск процесса по сигналу на каком-то событии объекта.

 

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

 

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

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

Александр, спасибо за советы, сделал подобным образом, только на стадию добавил не пометку, а статус. И дальше уже в рамках одного процесса по элементу "Обработать сигнал" отслеживаю изменение статуса в ранее созданной по процессу стадии, а после этого отправляю email создателю стадии.

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

 

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

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

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

Коллеги, добрый день. Версия 7.15.4.

 

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

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

Или хотя бы при переоткрытии панели? Т.е. закрыл панель (переключил на другую), открыл заново - отобразились новые сообщения, поступившие за тот период, пока панель не обновлялась?

 

Понятно, что можно вызвать сортировку onSortClick в схеме SocialFeed, но хотелось бы хотя бы отловить момент загрузки структуры открытой боковой панели, по аналогии с onEntityInitialized на странице карточки. Есть ли такое событие в схеме?

Нравится

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

Денис, есть уже давно заведенная идея «Уведомление о появлении нового сообщения в Ленте, на которую подписан», но там пока не дошли до реализации. Видимо, есть технические трудности.

 

А по логике в SocialFeed, обратите внимание на кнопку ShowNewMessagesButton внутри ShowNewMessagesContainer. Там в обработчике нажатия происходит такое обновление:

/**
 * New messages button event handler.
 * @private
 */
onShowNewMessageClick: function() {
	this.set("sortColumnName", this.get("SocialMessageSortColumns")[0]);
	this.set("sortColumnLastValue", null);
	this.set("newSocialMessagesCount", 0);
	this.set("showNewSocialMessagesVisible", false);
	this.get("SocialMessages").clear();
	var newMessageContainer = this.Ext.get(this.get("ESNRightPanelSandboxId") + "_postList-container");
	if (newMessageContainer && this.getIsRightPanel()) {
		newMessageContainer.removeCls("showNewMessageContainerTop");
		newMessageContainer.removeCls("headerWithChannelListAndMessageTop");
	}
	var channelFilter = this.get("channelFilter");
	var initMessageCount = this.get("InitMessageCount");
	if (channelFilter) {
		this.loadPosts(initMessageCount, channelFilter);
	} else {
		this.loadPosts(initMessageCount);
	}
	this.Ext.getBody().dom.scrollTop = 0;
	this.Ext.getDoc().dom.documentElement.scrollTop = 0;
},

А логика отображения этой кнопки при добавлении нового сообщения реализована в showLoadNewMessageButton, которую вызывает onInsertSocialMessageReceived, а её  onSocialMessageReceived. А последняя подписывается на событие в init:

this.Terrasoft.ServerChannel.on(this.Terrasoft.EventName.ON_MESSAGE, this.onSocialMessageReceived, this);

 Возможно, если разобраться в логике этих функций, получится не показывать кнопку «Показать 1 новое сообщение/Показать {0} новых сообщений», а сразу обновлять при помощи loadSocialMessages, которая тоже там вызывается? Сейчас, насколько я понял, сразу, без кнопки, показывает только для сообщений от текущего пользователя, то есть самого себя:

/**
 * Insert social message handler.
 * @private
 * @param {Object} config Configuration object.
 * @param {Object} config.response Social message response.
 * @param {Object} [config.receivedMessage] Received message.
 */
onInsertSocialMessageReceived: function(config) {
	var receivedMessage = config.receivedMessage || this.Ext.decode(config.response.Body);
	var channelFilter = this.get("channelFilter");
	if (!channelFilter || receivedMessage.channelId === channelFilter.rightExpression.parameterValue) {
		if (this.Terrasoft.SysValue.CURRENT_USER.value === receivedMessage.sysAdminUnitId) {
			this.loadSocialMessages(config.loadSocialMessagesConfig, config.loadSocialMessagesCallback,
this);
		} else {
			this.showLoadNewMessageButton();
		}
	}
},

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

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