Вопрос

Добрый день, нашел создание и отправку email с помощью c# - https://academy.creatio.com/docs/developer/elements_and_components/emai…

Можно ли тоже самое сделать на JS? Есть ли пример запроса на insert email с типом (Type)?

Или какой альтернативный способ, чтобы вызвать создание из JS карточки объекта?

Спасибо.

Нравится

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

Добрый день.

 

Можно реализовать нужный БП и вызывать его с клиентской части.

Действительно, отправить email в таком случае лучше либо с помощью c# кода, как и описано в статье, либо создать БП и в нём добавить элемент отправки письма. Сам БП можно вызвать из JavaScript кода, более детально можно почитать в статье https://academy.terrasoft.ua/docs/developer/integrations_and_api/proces…

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

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

Нравится

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

Арсений, здравствуйте!



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

Если поле имеет свойство "Обязательно для заполнения" и тип поля - Число или Дробное число, то значение 0 или 0,00 -  это пустое значение, то есть поле не заполнено. Таким образом, когда  Вы пытаетесь сохранить карточку  с 0,00 в числовом поле со свойством обязательности заполнения, система выдает сообщение, что в поле необходимо указать значение.

Значения 0 или 0,00 является пустым значение, они отображаются в пустых полях для того, чтобы визуально пользователи понимали формат поля.

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



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

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

Добрый день!

 

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

Куда в код страницы добавить этот код, чтобы он отработал при получении сообщения?

function listener(event) { if (event.origin != 'http://javascript.ru') { // что-то прислали с неизвестного домена - проигнорируем.. return; } alert( "получено: " + event.data ); } if (window.addEventListener) { window.addEventListener("message", listener); } else { // IE8 window.attachEvent("onmessage", listener); }

Нравится

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

Добрый день!

Марат, все зависит от задачи. Вы можете разметить его как в BaseSection на init, так и в "ответе" ViewModule.aspx.

Ответ ViewModule.aspx частично формируется в конфигурации, в SectionHelper'е. Вам нужно сделать override класса ConfigurationSectionHelper. Там вы можете дописать свой JS, который отработает сразу после логона и входа в систему. Для примера обратите внимание на метод GetConfigurationScript

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

Можно ли отобрать записи в esq запросе на js с помощью фильтра по количеству записей на детали?

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

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

единственные идеи это городить вложенные запросы

Нравится

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

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

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

Пример фильтра в разделе:

 

Уходящий запрос:

{
  "rootSchemaName": "Account",
  "operationType": 0,
  "includeProcessExecutionData": true,
  "filters": {
    "items": {
      "8844d1b0-9ad8-410c-8c28-5a2f0a1c6ae3": {
        "items": {
          "CustomFilters": {
            "items": {
              "06f533f8-2b58-4ea3-8818-2a27d0c7e196": {
                "filterType": 1,
                "comparisonType": 7,
                "isEnabled": true,
                "trimDateTimeParameterToDate": false,
                "leftExpression": {
                  "expressionType": 3,
                  "functionType": 2,
                  "aggregationType": 1,
                  "columnPath": "[Contact:Account].Id",
                  "subFilters": {
                    "items": {},
                    "logicalOperation": 0,
                    "isEnabled": true,
                    "filterType": 6,
                    "rootSchemaName": "Contact"
                  }
                },
                "rightExpression": {
                  "expressionType": 2,
                  "parameter": {
                    "dataValueType": 4,
                    "value": 0
                  }
                },
                "subFilters": {
                  "items": {},
                  "logicalOperation": 0,
                  "isEnabled": true,
                  "filterType": 6,
                  "rootSchemaName": "Contact"
                }
              }
            },
            "logicalOperation": 0,
            "isEnabled": true,
            "filterType": 6,
            "rootSchemaName": "Account"
          }
        },
        "logicalOperation": 0,
        "isEnabled": true,
        "filterType": 6
      }
    },
    "logicalOperation": 0,
    "isEnabled": true,
    "filterType": 6
  },
  "columns": {
    "items": {
      "Id": {
        "caption": "",
        "orderDirection": 0,
        "orderPosition": -1,
        "isVisible": true,
        "expression": {
          "expressionType": 0,
          "columnPath": "Id"
        }
      },
      "Name": {
        "caption": "",
        "orderDirection": 0,
        "orderPosition": -1,
        "isVisible": true,
        "expression": {
          "expressionType": 0,
          "columnPath": "Name"
        }
      },
      "AccountLogo": {
        "caption": "",
        "orderDirection": 0,
        "orderPosition": -1,
        "isVisible": true,
        "expression": {
          "expressionType": 0,
          "columnPath": "AccountLogo"
        }
      },
      "PrimaryContact": {
        "caption": "",
        "orderDirection": 0,
        "orderPosition": -1,
        "isVisible": true,
        "expression": {
          "expressionType": 0,
          "columnPath": "PrimaryContact"
        }
      },
      "Phone": {
        "caption": "Основной телефон",
        "orderDirection": 0,
        "orderPosition": -1,
        "isVisible": true,
        "expression": {
          "expressionType": 0,
          "columnPath": "Phone"
        }
      },
      "Type": {
        "caption": "Тип",
        "orderDirection": 0,
        "orderPosition": -1,
        "isVisible": true,
        "expression": {
          "expressionType": 0,
          "columnPath": "Type"
        }
      },
      "AccountCategory": {
        "caption": "Категория",
        "orderDirection": 0,
        "orderPosition": -1,
        "isVisible": true,
        "expression": {
          "expressionType": 0,
          "columnPath": "AccountCategory"
        }
      },
      "EntryPointsCount": {
        "caption": "",
        "orderDirection": 0,
        "orderPosition": -1,
        "isVisible": true,
        "expression": {
          "expressionType": 3,
          "aggregationType": 1,
          "columnPath": "[EntryPoint:EntityId].Id",
          "subFilters": {
            "items": {
              "1afa5cfc-31e0-4a27-ad78-bac1de602da6": {
                "filterType": 1,
                "comparisonType": 3,
                "isEnabled": true,
                "trimDateTimeParameterToDate": false,
                "leftExpression": {
                  "expressionType": 0,
                  "columnPath": "IsActive"
                },
                "rightExpression": {
                  "expressionType": 2,
                  "parameter": {
                    "dataValueType": 1,
                    "value": true
                  }
                }
              }
            },
            "logicalOperation": 0,
            "isEnabled": true,
            "filterType": 6
          }
        }
      }
    }
  },
  "isDistinct": false,
  "rowCount": 30,
  "rowsOffset": 0,
  "isPageable": true,
  "allColumns": false,
  "useLocalization": true,
  "useRecordDeactivation": false,
  "serverESQCacheParameters": {
    "cacheLevel": 0,
    "cacheGroup": "",
    "cacheItemName": ""
  },
  "queryOptimize": false,
  "useMetrics": false,
  "adminUnitRoleSources": 0,
  "querySource": 0,
  "ignoreDisplayValues": false,
  "conditionalValues": null,
  "isHierarchical": false
}

 

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

Есть сервер Creatio  с локальным 192.168.10.11, портом 81 и именем SRV1. На нем же установлен TMS для интеграции с Asterisk, который работает на другом сервере.  Для доступа к Creatio извне выполнен проброс с внешнего адреса, напр., Х.Х.Х.Х, на 192.168.10.11 и порт 81. В системной настройке «сервер обмена сообщений» установлено ws://SRV1:2013

 

Чтобы подключаться к Creatio и телефонии из вне, а это основной режим работы с Creatio (а не в локальной сети), приходится на локальном ПК в файле hosts прописывать строку -

Х.Х.Х.Х SRV1 (т.е. внешний IP-адрес сервера с TMS). Тогда все работает и Creatio и телефония.

 

Вопрос – можно ли что-то сделать, чтобы телефония работала и без корректировки локального hosts-файла? Использование VPN не рассматривается. Если в поле «сервер обмена сообщений» указать ws://X.X.X.X:2013 и не корректировать hosts-файл, то к Creatio можно подключиться на адрес X.X.X.X:81 , а телефония при этом не работает.

Поможет ли присвоение публичного web-адреса для сайта Creatio, напр., creatio.example.com,  и указание значения ws://creatio.example.com:2013

 

Или можно по-другому решить этот вопрос

Нравится

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

Рустем, добрый день! 



Данный вопрос связан с сетевой маршрутизацией. Если Вы присвоите публичный адрес, но не настроите роутинг до сервера приложения, то результат будет аналогичным. Вам необходимо либо пробросить сам сервер приложения во внешний доступ, чтобы он слушал запросы на саму машину, либо использовать алиасы с помощью hosts, либо всё же воспользоваться RRAS в качестве VPN-сервера и NAT. Также можно попробовать реализовать доступ с помощью железного маршрутизатора, в том случае если Вы можете администрировать устройство для этой машины. 

Добрый день, Лев. В том то и дело, что и 81-й порт (для Creatio) и 2013-й порт  (для ТМС) проброшены с внешнего IP. Но в поле «сервер обмена сообщений» указано имя сервера TMS - ws://SRV1:2013 (в нашем случае ТМС установлен на том же сервере, что и Creatio). И конечно же это имя неизвестно для ПК внешнего пользователя. Поэтому и проходится править файл hosts на ПК пользователя. Что неудобно.

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

Добрый день, подскажите, возможна ли отправка писем\уведомлений на почту, без настройки сервиса синхронизации Exchange Listener?

 

При попытке подключится к провайдеру пишет "Не заполнена системная настройка ExchangeListenerServiceUrl".

Настраиваю на Service Enterprise 7.18.1

Нравится

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

Добрый день!



Начиная с версии 7.17.2 уже нет возможности использовать старый тип синхронизации. Для корректной работы почтовых сервисов IMAP/SMTP и Exchange необходимо развернуть сервис синхронизации Exchange Listener. Логика синхронизации писем была полностью вынесена на микросервис. Соответственно, для работы почты в приложении необходимо проводить настройку микросервиса Exchange Listener, альтернативных вариантов нет.



Детальнее на сайте в Академии: https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/ra…

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

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

Файл из локальной папки открывается, так же через Visual Studio открывается файл из локальной и из сетевой папок. Но если выполнять тот же код из Creatio, возвращается ошибка: The server encountered an error processing the request. The exception message is 'Could not find a part of the path '\\DESKTOP-PAVEL\ForFTP\new1.csv'.'. See server logs for more details. The exception stack trace is:.............

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

Нравится

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

Добрый день!

 

Для более детального анализа, прошу приложить логи приложения. Также уточните, пожалуйста, последовательность действий, которая приводит к данному поведению.

Роман Казекин,

Добрый день Роман!

Как описано выше в Creatio для заполнения раздела, данные вычитываются из файла.

Если файл находится в локальной папке - например на диске C, D, то всё работает нормально.

Но если файл находится на каком-либо сетевом ресурсе, общедоступном -  то файл не открывается через Creatio. 

При настройке IIS 

Получаем ошибку:

А если указать в поле Identity конкретного пользователя, то ошибка:

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

Спасибо.

Добрый день, Сергей.



Тут есть 2 варианта решения:

1) Использовать ApplicationPoolIdentity и дать разрешение на просмотр содержимого сетевой папки всему компьютеру на котором запущен пул. 

2) Запускать пул под Identity пользователя системы и дать разрешение на просмотр содержимого сетевой папки этому пользователю на котором запущен пул.



Более детально можно найти на отрытых ресурсах. Как пример:

https://stackoverflow.com/questions/18750341/iis7-give-applicationpooli…



https://docs.microsoft.com/en-us/iis/manage/configuring-security/applic…



https://serverfault.com/questions/292057/applicationpoolidentity-user-c…

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

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

Нравится

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

Владимир Соколов,добрый день.

Базовыми средствами Creatio реализовать возможность управления пользователем только частью справочников не получится.

Есть некие обходные решения которые обсуждались здесь

Цой Владимир, добрый день!

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

Sorotiuk Anna,

А разве при этом, если у пользователя нет прав на операцию CanManageLookups, то он получит доступ к изменению справочника?

А получив права на эту операцию, он получит доступ ко всем справочникам

Владимир Соколов,добрый день.

Базовыми средствами Creatio реализовать возможность управления пользователем только частью справочников не получится.

Есть некие обходные решения которые обсуждались здесь

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

Коллеги, добрый день.

Версия 7.17.2.1728.

 

Возможно ли использование фильтров по колонке и подзапросу на клиенте, аналогично данному примеру:

public IEntitySchemaQueryFilterItem CreateFilter(FilterComparisonType comparisonType, string leftExpressionColumnPath, EntitySchemaQuery rightExpressionValue)

Где: comparisonType – тип сравнения leftExpressionColumnPath – путь к колонке в левой части фильтра rightExpressionValue – подзапрос в правой части фильтра



Пример:

var esq = new EntitySchemaQuery(EntitySchemaManager, "ESQCityNA"); esq.AddColumn("Id"); var subEsq = new EntitySchemaQuery(EntitySchemaManager, "ESQCityNA"); subEsq.AddColumn(subEsq.CreateAggregationFunction(AggregationTypeStrict.Max"ModifiedOn")); var filter = esq.CreateFilter(FilterComparisonType.Equal"ModifiedOn", subEsq); esq.Filters.Add(filter); string sqlText = esq.GetSelectQuery(CurrentConnection).GetSqlText();



SqlText запроса:

SELECT "ESQCityNA"."Id" "Id" FROM "ESQCityNA" "ESQCityNA" WHERE "ESQCityNA"."ModifiedOn" = (SELECT MAX("ESQCityNA"."ModifiedOn") "Max" FROM "ESQCityNA" "ESQCityNA")

Взято отсюда: https://community.terrasoft.ru/articles/opisanie-osnovnykh-metodov-entityschemaquery-chast-1

 

Попытка аналогичной подстановки:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Object"
});
 
esq.addAggregationSchemaColumn("ObjectColumn.InnerColumn", Terrasoft.AggregationType.MAX, "ActivityRoute", Terrasoft.AggregationEvalType.ALL);
filters.addItem(Terrasoft.createFilter(Terrasoft.ComparisonType.EQUAL, "ObjectColumn.InnerColumn", esq));

Приводит к ошибке в консоли с сообщением "Ошибка кодирования значения в JSON-строку".

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

 

Нравится

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

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

 

Подобную задачу решали в рамках этих обсуждений:

https://community.terrasoft.ru/articles/esq-select-s-neskolkimi-exists-…

https://community.terrasoft.ru/questions/dobavlenie-filtra-notexists-ne…

 

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

Zarichnyi Anton,

Антон, здравствуйте!

 

Пример запроса на SQL может выглядеть так:

SELECT *
  FROM [BPMSrvEntSS].[dbo].[ORDVisa] iov
  Where iov.ORDId = '4024cda7-ff90-4068-b872-c27851c33108'
  and [CreatedOn] in (SELECT max([CreatedOn])
  FROM [BPMSrvEntSS].[dbo].[ORDVisa] iov
  Where iov.ORDId = '4024cda7-ff90-4068-b872-c27851c33108'
  and [StatusId] = 'e79facb3-3c32-43e7-a59e-12ba125e6132'
  group by Objective,[VisaOwnerId])

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

 

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

Смородинов Денис,



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



Если у в результате согласования и переназначения меняется существующая запись, а не создается новая, то CreatedOn не должен изменяться.  

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



Для более глубокого анализа причин такого поведения рекомендую Вам обратится в тех. поддержку. 

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

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

 

Вопрос, касающийся фильтрации графиков в разделе Итоги:

Необходимо иметь возможность не применять фильтр на выбранную серию в графике. Как это осуществить?

 

Подробнее с примером:

Мы имеем график с 5 сериями - Хвост, Решено с подтверждением за период, Поступило за период, Дубль, Отклонено.

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

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

 

Как нужно, чтобы работало:

Необходимо иметь возможность отфильтровать все серии (к примеру) по группам ответственных, кроме серии "Поступило за период" - этот показатель должен остаться неизменным и охватывать значение поступивших Обращений на все группы ответственных. В то время как остальные показатели должны отображать значение Обращений только по группе ответственных, заданной в фильтре.

 

Вопрос:

Есть ли возможность отмены фильтров (быстрых/расширенных) на одну из серий в рамках одного графика? И как это осуществить?

 

Прошу дать рекомендации по решению данного вопроса.

Спасибо.

Нравится

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

Добрый день!



На текущий момент описанный Вами функционал отсутствует в продукте. Мы зарегистрировали идею развития функциональности на основании Вашей бизнес-задачи.

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