Добрый день!



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



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

Нравится

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

При вызове метода updateDetail передавать параметром не reloadAll, а primaryColumnValue.

Например:

 

this.updateDetail({primaryColumnValue: "SomeRecordId"});

 

Владимир, а как Вы обновляли деталь? Смотрю, есть параметр reloadAll, который обычно указывают true:

this.updateDetail({reloadAll: true});

Может, если передать false, получится поменять только нужное? Хотя, Вам же нужно обновлять разные записи.

this.updateDetail({"detail": "UsrSchemaDetailNameHere"});



И да, я посылаю message из бизнес-процесса, в котором указываю Id записи, которую хотел бы обновить

При вызове метода updateDetail передавать параметром не reloadAll, а primaryColumnValue.

Например:

 

this.updateDetail({primaryColumnValue: "SomeRecordId"});

 

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

Код приводит к ошибке.

// Обновление всех деталей.
// all-combined.js:41 Detail not found: undefined
this.updateDetail({ realoadAll:true });

 

У меня вот такое обновление детали без ошибок.

this.reloadEntity();

 

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

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

Добрый день!

Используется Excel reports builder for Creatio.

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

Отчет не отображается во всплывающем меню "Excel Отчеты" раздела "Контакты".

 

Вопрос: Где кроме как на самой карточке существует возможность сгенерировать отчет?

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

Нравится

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

Андрей, добрый день!

 

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

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

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

 

Подскажите, как настраивается размещение блока шаблона.

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

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

 

Как можно "прижать" его к левому краю?

Нравится

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

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

 

А на вкладке «Предпросмотр» можно проверить, как будет на разных размерах экранов выглядеть. Стандартные блоки автоматически адаптируются под ширину, меняя расположение элементов:

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

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

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

Нравится

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.

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

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