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

необходимо создать след функционал - при изменении Sender counterparty должно устанавливаться значение в колонках Sender City & Sender door. при это при изменении поля Sender City надо фильтровать список Sender door по городу. Я сделал правила для:

- установки значения города

- установки значения двери

- фильтрации Sender door лукапа в зависимости от поля Sender City.

но сейчас получается так, что значение в Sender door пустое при изменении Sender counterparty. я подозреваю что влияет правило фильтрации по городу. при отключении его значение ставится, но это не устраивает, нужна фильтрация.

как решить такую проблему?Изображение удалено.

Нравится

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

Добрый день!

 

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

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

Возможно, данный функционал будет представлен в будущих релизах.

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

спасибо за ответ!

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

Добрый день!

Есть задача: привязать условие определения родительского инцидента/обращения не к цепочке в хэдере, а к значению в теме письма. Не могу разобраться в том, в какой момент срабатывает логика, заполняющая CaseId у активности типа email (или соответственно ConversationId в EmailMessageData, т.к. насколько я вижу это связанные факторы и в дальнейшем именно на ConversationId построено разграничение связанных и не связанных email).

Где она запускается и можно ли как-то написать класс-расширение который переопределил бы эти методы?

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

Нравится

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

Добрый день,

 

Логика проверки активности на привязку к существующему обращению или создания нового обращения находится в бизнес процессе "IncidentRegistrationFromEmailProcess" (который запускается после каждой завершенной сессии синхронизации писем в системе). В элементе скрипт-таск процесса вызывается метод RegisterIncidentFromEmail, который в конце выполнения делает вызов:

 

result = helper.GetRegisterIncidentId(activityId);

 

helper - это класс IncidentRegistrationFromEmaillHelper.

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

 

Поэтому, если нужно изменить логику, нужно смотреть в сторону замещения метода GetRegisterIncidentId внутри IncidentRegistrationFromEmaillHelper и прописывать свою кастомную логику там.

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

Добрый день.

Есть необходимость скрывать кнопку "+" (кнопка добавления записи) на детали, в зависимости от того, на какой странице она находится.

1.На странице контакта, кнопки "+" никогда не должно быть.

2. На странице заявки, кнопки "+" никогда не должно быть.

3. На преднастроенной странице БП, кнопка должна отображаться, в зависимости от наличия записи в этой детали, по определенным типам и т.д.

Реализовали следующую логику:

На схеме детали создано сообщение, которое срабатывает на Init. Передаем сообщение с параметрами. В ответ получаем:

1. Если открываем страницу контакта, то там срабатывает подписка и всегда передаем false

2. Если открываем страницу заявки, то там срабатывает подписка и всегда передаем false

3. Если открываем преднастроенную страницу, срабатывает подписка, дальше срабатывает функция которая делает проверку наличия записей в таблице детали, с определенными параметрами, и если запись есть передаем false если записей нету передаем true

 

Вроде все работает. Но заметили, что если сначала открыть страницу Контакта или Заявки, а потом открыть преднастроенную страницу, то подписка на преднастроенной странице не отрабатывает, а отрабатывает именно Контакт (либо заявка), и соответсвеноо получаем false. 

Т.е. при ините странице контакта, срабатывает подписка, которая "висит" и отвечает постоянно отвечает всем подряд.

 

Можно ли как-то отменять подписку, после "ухода" со страницы? Именно ухода, не по нажатию кнопки закрыть (я так понимаю тут можно пойти через destroy) ? 

 

Или есть какие-то еще варианты?

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

Нравится

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

А мы просто делаем 2 разные схемы детали на одном объекте. Одна с "+", другая без него (а ещё без Copy, Import и т.п.)



И используем на странице ту, которая нужна

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

Да, тоже пришли в итоге к этом варианту. Но думали немного "покопать" в сторону универсального решения)

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

Добрый день,

 

для локальной разработки я использую докер версию креатио 7.18.5. Хочу обновить до 8.0, но такого образа нету в Вашем докер хабе - https://hub.docker.com/r/creatio/creatio/tags .

Вы планируете добавлять докер образы для 8 версии продукта? Если нет, тогда для разработки использовать только полностью локальную среду или клауд?

 

Спасибо!

Нравится

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

Добрый день,

 

Новые версии не будут добавлены в публичный Docker Hub. 

 

 

Команда сейчас работает над  внутренним Docker Hub и вскоре добавит возможность предоставлять образы версий продукта.

 

 

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

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

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

Добрый день,

 

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

System.IO.FileLoadException: Could not load file or assembly 'Google.Apis, Version=1.57.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Google.Apis, Version=1.57.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab' ---> System.IO.FileLoadException: The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Весь свой код я собираю в библиотеку, которую потом добавляю как внешнюю сборку в пакет. В итоге в моей пакете моя либа + либы гугла. К этой либе подключена гугл библиотека с версией указанной в ошибке - 1.57.0 . Если я работаю локально, то проблем нету и все загружается, несмотря на то, что у меня локальная версия креатио 7.18.5, в ней лежит библиотека Google.Apis 1.37.0.0.

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

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

 

Нравится

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

Добрый день!

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

И тут два варианта:

1) Обращаться в поддержку дабы по возможности обновить уже имеющуюся библиотеку

2) В вашей сборке использовать туже версию библиотеки, что уже присутствует в приложении.

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

Добрый день!

Подскажите пожалуйста, где можно изменить настройки локального поиска дублей (при сохранении записи).

Конкретно интересует кейс: при сохранении контакта, не проверять дубли по Email

Нравится

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

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

 

Всю нужную информацию про настройку сервиса Поиска ДУблей можно найти на Академии в этой статье. Конкретно часть про настройку правил поиска дублей можно найти здесь.

 

С уважением,

Мирослава

Mira Dmitruk,

 

Где там информация по "где можно изменить настройки локального поиска дублей (при сохранении записи)" ?

Mira Dmitruk,

?

Oleksandr,

???

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

Добрый день.

Подскажите, пожалуйста, в какой момент, на карточке контакта, заполняется поле ФИО, если ФИО вводить отдельно в поля "Фамилия", "Имя", "Отчество".

Суть вопроса в том, что если заводить ФИО именно так (по частям),  и при этом в системе есть контакт без ФИО, то в момент сохранения, система "говорит" о дублях. Т.е. она считает свое поле ФИО пустым, видит что есть еще записи с пустым ФОИ, и говорит о дублях. Но по факту Фамилия Имя Отчество на карточке заполнено

Нравится

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

Александр, 

 

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

1. Перейдите в раздел конфигурации и добавьте новую схему Source Code. Определите во вновь добавленной схеме класс, реализующий интерфейс IContactFieldConverter. "ContactGmsFieldConverter" и "ContactSgmFieldConverter" являются примерами таких классов. Вы можете найти их в конфигурации.

Метод GetContactSgm реализует разделение имени на GivenName, Surname и MiddleName. Метод GetContactName реализует генерацию полного имени.

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

2. После этого перейдите в раздел «Справочники» и откройте справочник «Порядок ФИО». В случае, если вы не найдете этот справочник, просто добавьте его, используя объект «Порядок ФИО». Добавьте новую запись, которая регистрирует имя только что добавленного справочника.

3. Зайдите в настройки системы и откройте «Порядок ФИО». Установите в поле «Справочник» значение «Порядок ФИО», в поле «Значение по умолчанию» установите значение, добавленное в п.2..

После выполнения всех действий «Имя», «Фамилия», «Отчество» и «Имя» будут созданы по-новому.

Надеюсь, информация была для вас полезной.

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

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

Создал новую деталь по инструкции.

https://academy.creatio.com/documents/technic-sdk/7-15/adding-attachments-detail#

 

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

Схемы:

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

Деталь:

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

Файл загружается в таблицу. После перезагрузки страницы содержимое на детали не показывает. Ошибка: 

Uncaught 1.       i {message: 'Значение аргумента "columnPath" не может быть пустым'}

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

Не пойму, что ещё нужно настроить?

Нравится

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

Добрый день,

 

скорее всего, были заданы неверные привязки детали.

Пожалуйста, сравните деталь в Мастере с базовой деталью:

 

 

Также хочу обратить внимание, что при добавлении детали в конкретный раздел, должна быть привязка по этому разделу. Например, для раздела Контакты, деталь будет называться Contact's attachment.

 

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

 

С уважением,

Глеб.

Gleb Tkach, Постараюсь поэтапно приложить.

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

"Файлы и ссылки33" - работает,

"Файлы и ссылки22" - не работает.

Деталь "Файлы и ссылки33" была создана ранее  не мной. Сравниваю с ней.

Схема страницы:

define("CasePage", [], function() {
               return {
                              entitySchemaName: "Case",
                              attributes: {},
                              modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
                              details: /**SCHEMA_DETAILS*/{
                                            "FileForCaseDetail6803fbd2": {
                                                           "schemaName": "FileForCaseDetail",
                                                           "entitySchemaName": "FileForCase",
                                                           "filter": {
                                                                          "detailColumn": "Case",
                                                                          "masterColumn": "Id"
                                                           }
                                            },
                                            "Schema44Detail284e7799": {
                                                           "schemaName": "Schema44Detail",
                                                           "entitySchemaName": "PrintServiceFile",
                                                           "filter": {
                                                                          "detailColumn": "Case",
                                                                          "masterColumn": "Id"
                                                           }
                                            }
                              }/**SCHEMA_DETAILS*/,
                              businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
                              methods: {},
                              dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
                              diff: /**SCHEMA_DIFF*/[
                                            {
                                                           "operation": "insert",
                                                           "name": "FileForCaseDetail6803fbd2",
                                                           "values": {
                                                                          "itemType": 2,
                                                                          "markerValue": "added-detail"
                                                           },
                                                           "parentName": "Tab548d2867TabLabel",
                                                           "propertyName": "items",
                                                           "index": 24
                                            },
                                            {
                                                           "operation": "insert",
                                                           "name": "Schema44Detail284e7799",
                                                           "values": {
                                                                          "itemType": 2,
                                                                          "markerValue": "added-detail"
                                                           },
                                                           "parentName": "Tab548d2867TabLabel",
                                                           "propertyName": "items",
                                                           "index": 25
                                            }
                              ]/**SCHEMA_DIFF*/
               };
});

Прикладываю файлы в деталь:

Обновляю страницу:

 

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

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

 

столкнулся со следующей проблемой:

при возврате из веб сервиса своего обьекта nginx выдает ошибку 502 Bad Gateway.

примерный код который не работает

 

[ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UsrCustomConfigurationService : BaseService
    {
        [OperationContract]
        [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
            ResponseFormat = WebMessageFormat.Json)]
        public object checkglobal(string phone)
{
    // получаю данные...
    var res = new GlobalRequest
    {
        UsrFileStreet = UsrFileStreet,
        UsrFileDepartment = UsrFileDepartment,
        UsrFileFlat = UsrFileFlat,
        UsrFileNumberHouse = UsrFileNumberHouse,
        UsrFileSubtypeWorks = UsrFileSubtypeWorks,
        UsrPlanDate = UsrPlanDate.ToString(),
        UsrPlanTime = UsrPlanDate.ToString(),
    };
    return res;
}
 
[DataContract]
public class GlobalRequest
{
    [DataMember]
    public string Method { get; } = "GlobalRequest";
    [DataMember]
    public string UsrFileStreet { get; set; }
    [DataMember]
    public string UsrFileNumberHouse { get; set; }
    [DataMember]
    public string UsrFileFlat { get; set; }
    [DataMember]
    public string UsrFileSubtypeWorks { get; set; }
    [DataMember]
    public string UsrPlanDate { get; set; }
    [DataMember]
    public string UsrPlanTime { get; set; }
    [DataMember]
    public string UsrFileDepartment { get; set; }
}

подскажите что я пропустил?

 

спасибо!

Нравится

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

Необходимо было добавить ServiceKnownType аттрибут к методу чтоб указать новый тип данных который я хочу вернуть

 

[ServiceKnownType(typeof(GlobalRequest))]
public object checkglobal(string phone)
{

Можете добавить эту информацию в документацию? Что необходимо использовать еще один аттрибут если надо вернуть объект? Я нашел вот эту статью но в ней ничего про это нету, добавьте пожалуйста -  https://academy.creatio.com/docs/7-18/developer/back_end_development/we…

Необходимо было добавить ServiceKnownType аттрибут к методу чтоб указать новый тип данных который я хочу вернуть

 

[ServiceKnownType(typeof(GlobalRequest))]
public object checkglobal(string phone)
{

Можете добавить эту информацию в документацию? Что необходимо использовать еще один аттрибут если надо вернуть объект? Я нашел вот эту статью но в ней ничего про это нету, добавьте пожалуйста -  https://academy.creatio.com/docs/7-18/developer/back_end_development/we…

Добрый день.



Спасибо за информацию.

Мы передадим ответственной команде пожелание дополнить документацию.

VH,

А почему возвращаете object, а не конкретный тип GlobalRequest?

Попробуйте заменить object на GlobalRequest и проверить.

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

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

Добрый день.

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

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

Я смогу сделать дропдаун для выбора объекта с помощью представления VwEntityObjects.

Но я не могу понять где хранится список колонок для этого объекта, чтоб я мог отфильтровать их в дропдаун менюшке.

Нравится

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

Добрый день,

 

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

 

Для начала этот запрос предоставляет нам все столбцы в БД вместе с именами таблиц, в которых они расположены:

SELECT *

FROM INFORMATION_SCHEMA.COLUMNS;

 

Таким образом, мы можем создать view на основе этого select запроса:

CREATE VIEW column_names_view

AS   

SELECT *

FROM INFORMATION_SCHEMA.COLUMNS; 

GO  

Затем мы можем перейти в раздел конфигурации в Creatio и создать объект, например UsrTableColumns, где мы будем хранить всю эту информацию. Основные поля, которые нам нужно будет создать в этом объекте, это «UsrColumnName» и «UsrTableName». Затем нам нужно сохранить объект и опубликовать его, после чего таблица будет автоматически создана в базе данных.

 

После этого мы можем вставить информацию, предоставленную нашим view, в нашу только что созданную таблицу:

INSERT INTO UsrTableColumns (UsrTableColumn, UsrTableName)

SELECT  "COLUMN_NAME", "TABLE_NAME"

FROM column_names_view;

 

Затем мы можем создать справочник в системе на основе этой таблицы UsrTableColumns и добавить его на страницу, где мы хотим его использовать. Затем, используя бизнес-правило, мы можем отфильтровать результаты этого поля в зависимости от того, что мы выбрали в VwEntityObjects. Нам нужно будет проверить, равно ли имя объекта VwEntityObjects имени UsrTableColumns.UsrTableName.

 

С уважением,

Дарий

this.getEntitySchemaByName("schema_name", function(entitySchema) {
	var columns = entitySchema.columns;
}, this);

 

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