бизнес-процесс
ошибка
Справочное поле
настройка объекта
7.15
Service_Creatio

Добрый день. Есть необходимость создать объект, где есть справочное поле ссылающееся на "Библиотека процессов (Представление)". Когда добавляем это поле и нажимаем публикацию падает такая ошибка. Не подскажете как решить эту проблему?

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

Нравится

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

Дмитрий, поскольку Ваша колонка ссылается не на физическую таблицу в БД, а на представление, то при установленных галочках «индексируемая» и при контроле целостности, система пыталась добавить внешний ключ в представление после чего и последовала  ошибка. Если перед публикацией снять галочку индексации и установить галочку «Не контролировать целостность», как показано на скриншоте ниже, публикация такого объекта пройдет без проблем. Для отображения всех свойств колонки, необходимо выбрать «все» в следующем меню. Наглядные скриншоты прикрепил.

Добрый день.

 

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

 

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

 

 

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

Добрый день.

Вам нужно в свойствах данного объекта установить признак 'Представление в базе данных', как на скриншоте ниже:

Нет. Это совет, как создать представление, на не в объекте ссылку на представление. 

Эта ошибка происходит из-за того, что система пытается создать внешний ключ (foreign key) на представление, а СУБД такой возможности не дает.



Нужно в свойствах справочной колонки, которая ссылается на представление указать признак "Не контролировать целосность". Это не будет создавать внешний ключ в БД.

 

Дмитрий, поскольку Ваша колонка ссылается не на физическую таблицу в БД, а на представление, то при установленных галочках «индексируемая» и при контроле целостности, система пыталась добавить внешний ключ в представление после чего и последовала  ошибка. Если перед публикацией снять галочку индексации и установить галочку «Не контролировать целостность», как показано на скриншоте ниже, публикация такого объекта пройдет без проблем. Для отображения всех свойств колонки, необходимо выбрать «все» в следующем меню. Наглядные скриншоты прикрепил.

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

Это то что нужно, спасибо!

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

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

 

В системе существует возможность задавать быстрые фильтры с помощью функции initFixedFiltersConfig: https://academy.terrasoft.ru/documents/technic-sdk/7-16/dobavlenie-v-ra…

 

При этом для фильтрации в конфиге фильтра указывается колонка (свойство columnName)

 

Можно ли в таком же фильтре задать поиск по данным детали (т.е. по Exists, наподобие такого примера: https://community.terrasoft.ua/articles/kak-sdelat-filtraciu-pola-po-ex… ) на странице раздела?

 

Нравится

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

Денис, в примере по Вашей ссылке создаётся OwnerFilter. Логика его формирования реализована в схеме BaseFiltersGenerateModule:

  function employeesFilter() {
   const sysAdminUnitRef = "[SysAdminUnit:Contact]";
   const employeesFilter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
     sysAdminUnitRef + ".ConnectionType",
     ConfigurationConstants.SysAdminUnit.ConnectionType.AllEmployees);
   const filters = getIsNotNullFilterGroup(sysAdminUnitRef);
   filters.addItem(employeesFilter);
   return filters;
  }
...
  return {
   OwnerFilter: employeesFilter,
   SelfFilter: selfFilter,
   AllUsersFilter: allUsersFilter
  };

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

То есть можно переопределить BaseFiltersGenerateModule (в схеме под другим названием, как это делается для модулей), там реализовать нужную логику фильтрации, а затем в схеме раздела его применять.

 

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

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

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

Нравится

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

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

 

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

Может, после обновления на версию, где почта работает через Exchange Listener, не настроили всё необходимое.

Может, на почтовом сервисе места мало.

Может, если почта на GMail, не внесли изменения в настройки с обеих сторон по этой инструкции.

Может, наконец, всё реально синхронизируется, но смотрите не на той вкладке, а в «Обраьотанных».

 

Также см. похожую тему прошлого года.

 

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

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

 

Какие манипуляции необходимо выполнить для этого?

Нравится

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

Владимир, см. статью.

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

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

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

Где в документации можно найти, запросы (выгрузку контакты, и т.д.) через API.

К примеру, для лидов собрал https://012521-sales-team.terrasoft.ru/0/ServiceModel/EntityDataService…;

Нравится

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

Слава, информация об интеграции по OData есть тут для OData 3, которую Вы применили, и тут для Odata 4.

Если кратко, вместо лидов в адресе подставляете название нужного объекта и аналогично получаете ответ. Например, контакты:

http://сайт/0/ServiceModel/EntityDataService.svc/ContactCollection

Больше примеров  по обоим API есть на стороннем ресурсе.

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

Добрый день. Версия 7.15.3.

 

При обновлении пакета из хранилища возникла следующая ошибка: "Невозможно обновить пакет, так как он установлен из архива". При открытии данных пакета тоже всплывает сообщение о невозможности сохранения изменений.

 

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

 

При этом пакет явно привязан к хранилищу, которое существует (перед этим на другом стенде был отправлен коммит в это хранилище).

 

В списке "Установка и удаление приложений" этого пакета тоже нет.

 

Как такое может быть, и что с этим делать?

Нравится

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

Денис, такое может быть связано с неправильным значением логического поля InstallType у этого пакета.  Попробуйте сменить. Подробнее об этом и других свойствах пакетов см. в темах: 1, 2, 3, 4, 5.

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

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

Нравится

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

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

Добрый день, Денис!

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

 

Светлана Змиёва, создание фильтра в разделе из кода клиентской части

Денис, Вы хотите, чтобы слева в разделе визуально сформировался и применился фильтр или чтобы просто данные реестра отфильтровались, как происходит при изменении быстрого фильтра?

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

 

Например, см. раздел «Маркетинговые планы», фильтр по выбору года в выпадающем списке.

 

В схеме CampaignPlannerSection логика отправки сообщения в «песочницу» на событии изменения года:

/**
 * @override Terrasoft.BaseMarketingCalendarSection#calendarYearChanged
 */
calendarYearChanged: function (newValue) {
    this.sandbox.publish("CalendarYearChanged", newValue, ["MarketingCalendarCampaignsModuleId"]);
}

И базовая реализация  этого поля  и его обработчика с пустой функцией в BaseMarketingCalendarSection:

 

{
    "operation": "insert",
    "parentName": "LeftGridUtilsContainer",
    "propertyName": "items",
    "name": "CalendarYear",
    "values": {
        "dataValueType": Terrasoft.DataValueType.ENUM,
        "caption": {bindTo: "Resources.Strings.YearControlLabel"},
        "wrapClass": ["select-year-container"],
        "controlConfig": {
            "className": "Terrasoft.ComboBoxEdit",
            "list": {
                "bindTo": "CalendarYearList"
            },
            "prepareList": {
                "bindTo": "loadCalendarYearList"
            },
            "value": {
                "bindTo": "CalendarYear"
            },
            "change": {
                "bindTo": "calendarYearChanged"
            }
        }
    }
}
 
...
/**
 * Fires when year in calendar changed.
 */
"CalendarYearChanged": {
    mode: Terrasoft.MessageMode.PTP,
    direction: Terrasoft.MessageDirectionType.PUBLISH
}
            },
.....
/**
 * Handles change of selected year in calendar.
 * @protected
 * @param {Object} newValue Selected year value.
 */
calendarYearChanged: Terrasoft.emptyFn,

А в схеме BaseMarketingCalendarPage приём этого сообщения и наложение фильтров по году:

/**
 * @inheritDoc Terrasoft.BaseSectionV2#subscribeSandboxEvents
 * @overridden
 */
subscribeSandboxEvents: function() {
    var resolvedClickSubscriberId = this.sandbox.id;
    this.sandbox.subscribe("OpenCalendarGridSettings", function() {
        this.openGridSettings();
    }, this, [resolvedClickSubscriberId]);
    this.sandbox.subscribe("SetCalendarScale", function(config) {
        this.setScale(config.tag);
    }, this, [resolvedClickSubscriberId]);
    this.sandbox.subscribe("ToggleCalendar", function(value) {
        this.set("IsRightGridContainerVisible", value);
    }, this, [resolvedClickSubscriberId]);
    this.sandbox.subscribe("SortGrid", function(tag) {
        this.sortGrid(tag);
    }, this, [resolvedClickSubscriberId]);
    this.sandbox.subscribe("CalendarYearChanged", function(value) {
        this.$CalendarYear = value;
        this.reloadGridData();
    }, this, [resolvedClickSubscriberId]);
},
 
 
...
 
 
/**
 * @inheritdoc Terrasoft.GridUtilities#getFilters
 * @returns {Terrasoft.FilterGroup}
 */
getFilters: function() {
    var sectionFilters = this.get("SectionFilters");
    if (Ext.isEmpty(sectionFilters)) {
        return this.mixins.GridUtilities.getFilters.call(this);
    }
    var selectedYear = new Date().getFullYear();
    if (!Terrasoft.isEmpty(this.$CalendarYear) && !Terrasoft.isEmpty(this.$CalendarYear.value)) {
        selectedYear = this.$CalendarYear.value;
    }
    var serializationInfo = sectionFilters.getDefSerializationInfo();
    serializationInfo.serializeFilterManagerInfo = true;
    var deserializedFilters = Terrasoft.deserialize(sectionFilters.serialize(serializationInfo));
    deserializedFilters.addItem(Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.GREATER_OR_EQUAL,
        "StartDate", new Date(Date.UTC(selectedYear, 0)),
        Terrasoft.DataValueType.DATE));
    deserializedFilters.addItem(Terrasoft.createColumnFilterWithParameter(
        Terrasoft.ComparisonType.LESS,
        "StartDate", new Date(Date.UTC(selectedYear + 1, 0)),
        Terrasoft.DataValueType.DATE));
...

 

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

Показать все комментарии
Компиляция
приложения
7.15
Service_Creatio

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

 

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

Нравится

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

Денис, время компиляции  увеличилось из-за длительной генерации статического контента. Это происходит с версии 7.11.



При «компилировать всё» на БД MS SQL, на коробке, продукт бандл, процедура должна занимать в среднем 5 минут, что считается приемлемым.



При «компилировать всё» на БД Oracle, на коробке, продукт бандл, процедура  иногда может занимать ~ 30 минут, что планируется решить.

 

 

На продолжительность процесса компиляции может влиять очень много факторов.

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

 

Процесс компиляции приблизительно выглядит так (значимая часть): 

  1. Происходит поиск всех измененных схем (по сути поиск происходит только в пакетах, которые установлены из SVN, то есть являются «разлоченными»)
  2. Проходит анализ на построение цепочки компиляции. Анализируется каждая схема:
    1. Если схема является новой (не замещённой) - компилируется только пакет, в котором эта схема находится
    2. Если схема является замещённой - компилируется вся цепочка наследования. 

В последнем пункте обычно и кроется проблема. 

 

Ещё вопросы о причинах (ресурсы сервера, размер БД) и способе минимизации времени (компилировать только нужное) обсуждаются в этой теме.

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

Спасибо, получается чем больше наследований, тем дольше компиляция?

И чем больше пакетов с изменениями.

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

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

Добрый день!

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

 

Видел вариант с переход по вкладкам

this.setActiveTab("имя_вкладки");

Нравится

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

Вешаете на кнопку обработчик. А в него что-то вроде этого: 

var tag = "SectionModuleV2/ActivitySectionV2/";
this.sandbox.publish("PushHistoryState", {hash: tag});

ActivitySectionV2 - реестр раздела Активности

Вешаете на кнопку обработчик. А в него что-то вроде этого: 

var tag = "SectionModuleV2/ActivitySectionV2/";
this.sandbox.publish("PushHistoryState", {hash: tag});

ActivitySectionV2 - реестр раздела Активности

Дмитрий А.,

Спасибо, попробую

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

Добрый день!

При выборе шаблона email сообщения, в Обращении, заполняется тема из указанного шаблона, но при отправке подставляется  номер и тема из Обращения 

После выбора шаблона тема: "SR00540466 Проверка технической возможности, Київська обл,Київ,вул"

При отправке тема: "Re: SR00540466 Новое включение Включение"



Просьба подсказать как исправить

Нравится

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

Юрий, это не ошибка, это так специально. Ещё с 7.10:

Уведомления по обращению содержат тему из исходного письма, по которому зарегистрировано обращение. Это позволит заявителю отследить историю писем по обращению. Если обращение регистрируется по другим каналам (например, по звонку), то в поле [Тема] уведомлений указывается тема из шаблона письма.

Чтобы поменять, смотрите логику в схеме EmailWithMacrosManager, там в SendEmail и её аналогах вызывают функции, заполняющие заголовок:

/// <summary>
/// Builds an e-mail activity then sends it.
/// The sender and recipients will be obtained automatically.
/// Use this method to reply to all the participants of the parent (root) e-mail activity.
/// </summary>
/// <param name="caseId">Case record identifier.</param>
/// <param name="tplId">Template record identifier.</param>
public virtual void SendEmail(Guid caseId, Guid tplId) {
	Activity activity = CreateActivity();
	PreProcess(activity, caseId, tplId);
	CaseData data = GetCaseData(caseId);
	activity.Sender = GetSender(data);
	FillActivityWithCaseData(activity, data);
	FillTitle(activity, caseId, tplId);
	activity.Save();
	SendActivity(activity.Id);
}
...
/// <summary>
/// Fills an <paramref name="activity"/> with given <paramref name="data"/>.
/// </summary>
/// <param name="activity">Activity entity.</param>
/// <param name="data">Case data.</param>
protected virtual void FillActivityWithCaseData(Activity activity, CaseData data) {
	activity.Title = data.Title;
	activity.Recepient = data.Recipient;
	activity.CopyRecepient = data.CC;
	activity.BlindCopyRecepient = data.BCC;
	if (data.ParentActivityInReplyTo.IsNotNullOrEmpty()) {
		activity.HeaderProperties = AddInReplyToHeaderProperty(data.ParentActivityInReplyTo, activity.HeaderProperties);
	}
}
...
/// <summary>
/// Sets activity title as a subject from e-mail template if it is not specified yet.
/// Otherwise, adds a replying prefix (<see cref="ReplyingPrefix" />)
/// to an <paramref name="activity"/>'s title.
/// </summary>
/// <param name="activity">Activity entity.</param>
/// <param name="caseId">Case record identifier.</param>
/// <param name="tplId">Template record identifier.</param>
protected void FillTitle(Activity activity, Guid caseId, Guid tplId) {
	var title = activity.Title;
	activity.Title = title.IsNullOrEmpty()
		? GetTemplateSubject(SchemaName, caseId, tplId)
		: ApplyPrefix(title);
}

Видимо, Вам нужно переделать, чтобы всегда брался только GetTemplateSubject, а не тема из обращения с добавлением в начале префикса «Re:».

Александр, спасибо, пошли править, отпишусь

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