Доброго времени суток. Возникла проблема с синхронизацией почты на 7.16.1

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

Может кто-то сталкивался с подобной проблемой?

Заранее благодарен.

Нравится

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

Кирилл, в 7.16 архитектуру интеграции с почтой меняли.

Создали отдельный от основной системы Exchange Listener, который устанавливается на своём сервере. А затем на сайте 7.Х в системной настройке ExchangeListenerServiceUri прописывается его адрес, а в другой настройке — адрес анонимного сервиса в системе, к которому он извне обращается.

 

Точно по этой инструкции со всеми её подстраницами настраивали?

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

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

https://academy.terrasoft.ru/documents/technic-bpms/7-16/element-proces…



к примеру, есть     

dataModels: /**SCHEMA_DATA_MODELS*/{

            "Lead1": {

                "entitySchemaName": "Lead",

                "primaryColumnValue": {

                    "bindTo": "RefLead"

                }

            }

        }/**SCHEMA_DATA_MODELS*/,

 

Если вынести какое-то поле на страницу или создать бизнесс правило, то идет бинд на Lead1.Account

 

Но в коде не получается считать или записать значение в Lead1.Account, т.к. в объекте this его просто нет. Как из кода можно обратиться в этот параметр?

Нравится

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

Добрый день, коллеги!

 

Недавно вышло обновление к Creatio, где расширили функционал oData, а точнее добавили действие upsert, я хотел бы узнать, как правильно генерировать данный запрос?

Я работаю через postman.

 

Заранее спасибо!

Нравится

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

Михаил, для того, чтобы сделать upsert, нужно выполнить patch-запрос с указанием id в списке полей. Раньше если записи не было, возвращало ошибку, сейчас производится вставка. А если есть, то и раньше, и сейчас — изменение. Готовых именно таких примеров нет, о patch есть в справочнике по API.

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

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

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

Однако в Хронологии такой возможности нет :(

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

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

Нравится

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

Владимир, в обычных деталях, таких как «История», используют логику из BaseGridDetailV2, связанную с состоянием нажатия кнопки RelationshipButton. Если она нажата, через OR добавляется дополнительное условие фильтрации, то есть выбираются записи с детали, связанные не с текущей, а с дочерними.

/**
 * Returns filters collection.
 * @override
 * @return {Terrasoft.FilterGroup} Detail filter group.
 */
getFilters: function() {
	const detailFilters = this.get("DetailFilters");
	const masterColumnFilters = this.get("Filter");
	const serializationMasterColumnInfo = masterColumnFilters.getDefSerializationInfo();
	serializationMasterColumnInfo.serializeFilterManagerInfo = true;
	const serializationDetailInfo = detailFilters.getDefSerializationInfo();
	serializationDetailInfo.serializeFilterManagerInfo = true;
	const deserializedMasterColumnFilters = Terrasoft.deserialize(masterColumnFilters
		.serialize(serializationMasterColumnInfo));
	const deserializedDetailFilters = Terrasoft.deserialize(detailFilters.serialize(serializationDetailInfo));
	if (this.get("IsRelationshipButtonPressed")) {
		const mainFilterGroup = this.getRelationshipFilters();
		mainFilterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
		mainFilterGroup.add("masterRecordFilter", deserializedMasterColumnFilters);
		deserializedDetailFilters.add("mainFilterGroup", mainFilterGroup);
	} else {
		deserializedDetailFilters.add("masterRecordFilter", deserializedMasterColumnFilters);
	}
	return deserializedDetailFilters;
},

Сам фильтр такой:

/**
 * Returns the relationship filter.
 * @protected
 * @return {Terrasoft.FilterGroup} Relationship filter.
 */
getRelationshipFilters: function() {
	const mainFilterGroup = this.Ext.create("Terrasoft.FilterGroup");
	const relationshipFilterGroup = this.Ext.create("Terrasoft.FilterGroup");
	const masterRecordId = this.get("MasterRecordId");
	const detailColumnName = this.get("DetailColumnName");
	const relationTypePath = this.get("RelationTypePath");
	const relationshipPath = this.get("RelationshipPath");
	const relationType = this.get("RelationType");
	if (relationTypePath && relationshipPath && relationType) {
		relationshipFilterGroup.add("relationshipFilter", Terrasoft.createColumnFilterWithParameter(
			Terrasoft.ComparisonType.EQUAL,
			relationTypePath,
			relationType,
			Terrasoft.DataValueType.GUID));
		relationshipFilterGroup.add("relationshipTypeFilter", Terrasoft.createColumnFilterWithParameter(
			Terrasoft.ComparisonType.EQUAL,
			relationshipPath,
			masterRecordId,
			Terrasoft.DataValueType.GUID));
	} else {
		relationshipFilterGroup.add("relationshipFilter", Terrasoft.createColumnFilterWithParameter(
			Terrasoft.ComparisonType.EQUAL,
			this.getDefaultRelationshipPath(),
			masterRecordId,
			Terrasoft.DataValueType.GUID));
	}
	mainFilterGroup.add("subRelationshipFilterGroup", Terrasoft.createExistsFilter(
		detailColumnName,
		relationshipFilterGroup));
	return mainFilterGroup;
},

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

 

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

Зверев Александр пишет:

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

Думаю, это очень логично, учитывая, что такую логику уже реализовали в деталях. 

Ещё вдруг не реализовали эту идею?

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

Суть проблемы: при создании продажи запускается БП. Первый элемент - создание и открытие активности(пытался также сделать через создать-открыть), но карточка активности не открывается. Кто сталкивался с подобным? прошу совета!

Нравится

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

Здравствуйте!  проверьте установлен ли данный признак - https://prnt.sc/trld5r

А процесс точно не в фоновом режиме?

Здравствуйте!  проверьте установлен ли данный признак - https://prnt.sc/trld5r

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

Добрый день!



Учитывая, что в SendGrid, например, есть аналитика рассылок по устройствам (https://sendgrid.com/docs/ui/analytics-and-reporting/device/), планируется ли её отображать и в Creatio?

И можно ли уже сейчас получать её каким-то другим способом?

 

Спасибо

Нравится

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

Здравствуйте! Скорей всего нужно писать интеграцию.

 

Здравствуйте, Владимир!

 

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

 

Аналитику по устройствам пока можно доставать из личного кабинета пользователя в SendGrid, но у клиентов нет к нему доступа. Выгрузку сможет делать служба поддержки по запросу от клиента. Если запросов таких будет очень много – будет рассмотрена возможность автоматизировать это в Creatio.

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

Добрый день!

 

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

 

Спасибо!

 

Нравится

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

Здравствуйте! В нужном Вам разделе перейдите в мастер разделов(https://prnt.sc/tr326c), затем уберите галочки(https://prnt.sc/tr32qw) - это что касается первой части вопроса.

Касательно второго, прочтите данное обсуждение

Я бы наоборот. Галочки оставил, но в разделе что-то поменял бы. Так как раздел - это как раз исключение из правила (в остальных многочисленных местах мини-карточка должна работать).

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

 

Пока нашёл схему ConfigurationSectionHelper, которая генерирует  Terrasoft.configuration.ModuleStructure с информацией о всех разделах, доступной из JS. Возможно, поможет правка в этой схеме в функции GetModuleStructure, где читают свойства каждого зарегистрированного раздела, в том числе и MiniPageModes, и другой функции GetQuickAddConfig в этой же схеме. Вот она:

  /// <summary>
  /// Gets quick add menu items configuration.
  /// </summary>
  /// <param name="userConnection">User connection.</param>
  /// <returns>Quick add menu items configuration.</returns>
  public virtual string GetQuickAddConfig(UserConnection userConnection) {
   Dictionary<Guid, string> quickItems = new Dictionary<Guid, string> ();
   string tpl = @"{{QuickAddMenu: [{0}]}}";
   string itemTpl = @"{{itemId:'{0}',SysEditId:'{1}',name:{2},EditPageName:'{3}',TypeColumnValue:'{4}',TypeColumnName:{5},ModuleName:'{6}',EntitySchemaName:'{7}',miniPageSchema:'{8}',hasAddMiniPage:{9}}}";
   bool useMultilanguageData = !userConnection.GetIsFeatureEnabled("DoNotUseMultilanguageData");
   Select quickAddMenuItemsSelect = GetQuickAddMenuItemsSelect(userConnection);
   using (DBExecutor dbExecutor = userConnection.EnsureDBConnection()) {
    using (IDataReader dataReader = quickAddMenuItemsSelect.ExecuteReader(dbExecutor)) {
     while (dataReader.Read()) {
      Guid itemId = dataReader.GetColumnValue<Guid>("Id");
      Guid sysModuleEditId = dataReader.GetColumnValue<Guid>("SysModuleEditId");
      Guid typeColumnValue = dataReader.GetColumnValue<Guid>("TypeColumnValue");
      string editPageName = dataReader.GetColumnValue<string>("EditPageName");
      string name = dataReader.GetColumnValue<string>("Name");
      string caption = useMultilanguageData ? dataReader.GetColumnValue<string>("Caption") : string.Empty;
      name = Json.Serialize(caption.IsNullOrEmpty() ? name : caption);
      string typeColumnName = Json.Serialize(String.Empty);
      Guid sysEntitySchemaUId = dataReader.GetColumnValue<Guid>("SysEntitySchemaUId");
      string entitySchemaName = dataReader.GetColumnValue<string>("EntityName");
      string moduleName = dataReader.GetColumnValue<string>("ModuleName");
      // TODO CRM-53025
      bool rightLevel = string.IsNullOrEmpty(entitySchemaName) ? true :
       userConnection.DBSecurityEngine.GetIsEntitySchemaAppendingAllowed(entitySchemaName);
      Guid columnUId = dataReader.GetColumnValue<Guid>("TypeColumnUId");
      Guid miniPageSchemaUId = dataReader.GetColumnValue<Guid>("MiniPageSchemaUId");
      string miniPageModes = dataReader.GetColumnValue<string>("MiniPageModes");
      bool hasAddMiniPage = HasSchemaEditAddMiniPage(userConnection, entitySchemaName, miniPageModes);
      if (columnUId != null && columnUId != Guid.Empty) {
       typeColumnName = Json.Serialize(userConnection.EntitySchemaManager.GetInstanceByUId(sysEntitySchemaUId).Columns.GetByUId((Guid)columnUId).Name);
      }
      if (!quickItems.ContainsKey(itemId) && rightLevel) {
       quickItems.Add(itemId, string.Format(itemTpl, itemId, sysModuleEditId, name, editPageName, typeColumnValue, typeColumnName, moduleName, entitySchemaName, miniPageSchemaUId, hasAddMiniPage.ToString().ToLower()));
      }
     }
    }
   }
   var items = string.Join(",", quickItems.Select(x => x.Value));
   return string.Format(tpl, items);
  }

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

 

Главное, не забыть потом.

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

Всем доброго времени суток!

Столкнулся с такой проблемой.

Устанавливаю пакет через CLIO - выдает ошибки - https://prnt.sc/tqkuyw

В чем может быть проблема?

Версия системы 7.16.2.1600 

 

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

Нравится

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

так же при выполнении команды clio install-gate -e dev выдает ошибки - https://prnt.sc/tqnh3s

Алексей, по первому скриншоту, похоже, дело в файловой системе Вашего ПК, не может получить доступ к определённой папке.

 

По второму, у Вас как-то получилось вместо названия объекта «7.16.2», что делать нельзя, названия должны быть с латинскими буквами и без точек. Возможно, при оформлении перепутали с версией.

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

Странно как то получается создаю новый пакет Test и сразу  пушу его в систему и выдает такое - 

https://prnt.sc/tr3etj. Тут ну никак и нигде не задается имя 7.16.

Помимо всего даже когда устанавливаю пакет через интерфейс Creatio такая же ошибка. Из-за чего так получается есть предположение?

Если и через интерфейс такое же, то тем более, дело в самом пакете. Сравните с теми, которые ставятся нормально, может, что-то перепутано в полях? Вы создали пакет командой к clio?

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

"Вы создали пакет командой к clio?" - пакет Test да. 

 

Просто создали так?

Creating new package

To create new package project, use the next command:

 clio new-pkg <PACKAGE_NAME>

you can set reference on local core assembly with using Creatio file design mode with command in Pkg directory

 clio new-pkg <PACKAGE_NAME> -r bin

Может, что-то делали с версией?

Set package version

Set a specified package version into descriptor.json by specified package path.

clio set-pkg-version <PACKAGE PATH> -v <PACKAGE VERSION>

 

Вообще, не видя создавшегося пакета, сложно  сказать, что в нём не так.

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

просто clio new-pkg <PACKAGE_NAME>

Значит, смотреть внутрь пакета, где там упоминается «7.16.2». А падает только при установке на конкретный Ваш сайт? А если ставить на демку, то то же самое?

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

Устанавливал созданный пакет через clio на облачный дев, через интерфейс системы, стал без ошибок.

 

Значит, всё же дело не в пакете, а в сайте, куда его ставили? Может, версии отличаются?

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

версия сайта 7.16.2.1600, при создании пакета через clio задушить не получается, а вот при выгрузке из системы и конвертации, а потом пишите, то получилось...ещё те танцы с бубном))), но перед этим пришлось переустановить сайт.

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

Здравствуйте, Алексей!

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

Мотков Илья,

Добрый день. Я бы добавил, что есть способы достучаться из схем в функциональность Files. Через тот же ClassFactory

Здравствуйте, Алексей!

 

Ещё дополню, что все классы схем располагаются в неймспейсе Terrasoft.Configuration, если другое не задано.

 

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

 

Если речь о классах во внешних библиотеках – то обращаться так же как и из пакета в котором эта библиотека привязана.

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

Коллеги, разобрался в чем проблема... при создании нового пакета в этих папках - https://prnt.sc/u638lk генерируется текстовый файл placeholder, вот из-за него и вываливается ошибка при деплое пакета в среду, после удаления деплой прошел корректно и ошибка -

"Terrasoft.Common.InvalidNameException: Название объекта "7.16.2" некорректно" не выскакивала

Алексей, разработчики сообщили, что мы поищут способ решения этой проблемы, на текущий момент данную проблему можно обойти, указав в ConnectionStrings.config в секции tempDirectoryPath простой пусть С:\Temp

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

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

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

 

Настраиваю учетную запись по этой ссылке. Получаю такой результатИзображение удалено.

Нравится

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

Нам для такой ситуации саппорт высылал следующую инструкцию:

1) Создать копию почтового провайдера GMail

2) Отключить системную настройку с кодом UseGoogleSharedApplication

3) Создать на стороне GMail пароль для сторонних приложений как описано тут https://support.google.com/accounts/answer/185833?hl=en

4) Использовать пароль по п.3 при добавлении почтового ящика с использованием копии почтового провайдера по п.1

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

Нам для такой ситуации саппорт высылал следующую инструкцию:

1) Создать копию почтового провайдера GMail

2) Отключить системную настройку с кодом UseGoogleSharedApplication

3) Создать на стороне GMail пароль для сторонних приложений как описано тут https://support.google.com/accounts/answer/185833?hl=en

4) Использовать пароль по п.3 при добавлении почтового ящика с использованием копии почтового провайдера по п.1

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

Если версия ниже 7.16.2, то понадобятся ещё правки в конфигурации.

Сидоров Александр Валерьевич,

Спасибо

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

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

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

 

Вижу два решения задачи:

1) Вариант 1:

 - Создаем три таблицы: базовый справочник "Продукты", базовый объект "Деталь 1" с колонкой привязки к "Продукты", базовый объект "Деталь 2" с колонкой привязки к "Деталь 1".

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 2".

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")!

2) Вариант 2:

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

- Создаем справочник на основе объекта "Продукты", деталь с добавлением из справочника на основе объекта "Деталь 1", деталь с добавлением из справочника на основе объекта "Деталь 1" (тут нам и пригодилась колонка "Зарезервировано" так как по ней и будет фильтр и мы просто проставляем значение в эту колонку, а точнее по колонке "Заявка" и "Зарезервировано").

- Сталкиваемся с проблемой не рабочей делали "Деталь 2" так как для открытия окна добавления данных из "Деталь 1" необходимо с базовой колонкой текстового типа ("Отображаемое значение")! Была идея сделать Вью для отображения не достающего текстового поля, которое заполнять из колонки "Продукты.Название".

Нравится

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

Александр, что-то мне не вполне понятно по структуре того, что хотите отобразить. Вы хотите две детали в разделе продуктов или в каком-то другом разделе, которые связывают его с продуктами (вроде раздела «Договоры» и детали развязки «Продукты в договоре»)? Как между собой связаны раздел и первая деталь, раздел и вторая, первая со второй?

 

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

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

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

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

Тут вопрос не столько в настройке привязки деталей к разделу, сколько в логике выбора записей. Это можно сделать модификацией лукапа второй детали, чтобы там фильтр оставлял только пригодные для выбора записи. Либо вместо лукапа сделать в первой детали, где весь доступный выбор, кнопку или действие, при запуске которого выбранная на первой детали запись обрабатывается, по ней создаётся запись на второй.

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