Error occurred when saving: The Scheduler has been Shutdown - получаю такую ошибку когда пробую опубликовать БП, происходит часто, после того как начали использовать фоновые таски, помогает рестарт сайта.

 

7.18.5 .net core

Нравится

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

Добрый день!

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

логика точно не при чем.

в какие логи смотреть конкретно? 

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

Приветствую!

 

Есть задача через БП выгружать печатную форму счета. Сам файл формы получаем с помощью элемента "Обработать файл".

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

Как далее его передать на выгрузку? Может у кого есть подобный пример реализации стандартными средствами или средствами разработки.

Нравится

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

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

Так просто из бп выгрузить файл не получится. В нём можно только работать с ним (например, прикрепить к письму) или добавить на деталь "Файлы и Ссылки". Сама выгрузка реализована в методе _downloadReport клиентского модуля FastReportService. Для выгрузки файла в бп придется подстраиваться под эту логику.

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

Веб-сервис.

Как для GET метода передать кастомный тип объекта во входных параметрах?

Есть тип:

    [DataContract]

    public class SomeType {

        [DataMember]

        public string path { get; set; }

        [DataMember]

        public string als { get; set; }

    }




Есть метод: 

[OperationContract]

        [WebInvoke(Method = "GET", 

            RequestFormat = WebMessageFormat.Json, 

            BodyStyle = WebMessageBodyStyle.Wrapped,

            ResponseFormat = WebMessageFormat.Json,

            UriTemplate = "/ping/{s}")]

            [return: MessageParameter(Name = "data")]

        public object Pong(string s, SomeType SomeData) {

            return JsonConvert.SerializeObject(SomeData);

        }

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



"data": "{\"path\":null,\"als\":null}

 

Что по факту равно если вообще не передавать параметр.



Но если мы делаем метод POST и передаем в теле этот же параметр вот так:

{

    "SomeData":  {

        "path": "Name",

        "als": "name"

    }

}

 

То работает, чего я не понимаю? 

Нравится

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

Я не помню, что бы в get запросе можно было передавать тело запроса анонимно,  для такого метод post предназначен, а get данные через параметры в url всегда передаются.

можно попробовать принять json из урла , сделав так, но это уже извращение

`?someBody={key:"value"}`? 

Dima Avdoshin,

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

Dima Avdoshin,

вопрос в тому как передать в гет запросе данные так что бы это потому преобразовалось в объект, потому как с List<Guid>  передается и все норм, я вот думаю в чем разница между Guid и моими типами? скрин приложу как передаю

ответ: 

{

    "data": "{\"path\":null,\"als\":null}[\"c31b1382-d7c1-4318-a241-16a64c825720\"]sasdasdasd"

}

Стас Гаврилюк,

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

 

[DataContract]
[KnownType(typeof(OpenIdStatus))]
[KnownType(typeof(string))]
public class ReturnValue
{
    [DataMember]
    public object Value { get; set; }
}

также для меня работало следующее

/ping/12?someObj='{"path":"dsadsadas","als":"dsadsadasdsadasdasdsa"}'

тоже самое и с обжектом работает

[OperationContract]
        [WebInvoke(Method = "GET", 
            RequestFormat = WebMessageFormat.Json, 
            BodyStyle = WebMessageBodyStyle.Wrapped,
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "/ping/{s}?someObj={SomeData}")]
            [return: MessageParameter(Name = "data")]
        public dynamic  Pong(string s, dynamic SomeData) {
            return JsonConvert.DeserializeObject(SomeData);
        }

 

параметр ввиде объекта определенного типа не принимает , не смог нагуглить почему, пишет , что 

>Операция &quot;Pong&quot; в контракте &quot;WebService1C&quot; содержит переменную запроса с именем

        &quot;SomeData&quot; и типом &quot;Terrasoft.Configuration.SomeType&quot;, но тип

        &quot;Terrasoft.Configuration.SomeType&quot; не является преобразуемым посредством

        &quot;QueryStringConverter&quot;. Переменные для переменных запроса UriTemplate должны иметь типы, которые могут

        преобразовываться при помощи &quot;QueryStringConverter&quot;.

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

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

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

Может кто-то пробовал работать с RabbitMQ. Подскажите, пожалуйста, возможно ли забирать данные из очередей бизнес-процессом? Можно ли отправлять данные в очередь RabbitMQ из Creatio?

https://marketplace.terrasoft.ua/app/rabbitmq-connector-creatio

Нравится

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

не работал, но если можно с помощью с# то можно и с помощью бп, элемент скрипт и в бой

Делали, но в то время, когда ещё коннектора не было. Позднее могу поискать примеры 

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

Добрый день,

Подскажите, пожалуйста, где можно добавить новое поле на данную форму. Форма открывается, если в action dashboard нажать на кнопку "Complete" на активности.

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

Нравится

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

Ищите пример в ActivityMiniPage (UIv2).

Вам нужно будет кодом добавить элемент в родительский контейнер ResultsContainer и в ResultInfoContainer. Или вообще сделать свой контейнер (или или элемент), настроить "видимость" через bindTo на метод isEditableResultsVisible

 

Пример элемента:

{

                "operation": "insert",

                "parentName": "ResultsContainer",

                "propertyName": "items",

                "name": "ProcessResult",

.........

 

если это справочник с "выпадающим списком", то нужно повторять свою логику, как методах onPrepareProcessResultList и ProcessResultList.

 

или вот еще пример элемента  

  

 {

                "operation": "insert",

                "parentName": "MiniPage",

                "propertyName": "items",

                "name": "DetailedResult",

........

 

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

"visible": {  "bindTo": "isEditableResultsVisible" // или какой-то другой метод.

 

Само поле добавлял через мастер редактирования раздела, а потом в созданной схеме руками дописывал в секции values для созданного поля значения :

"wrapClass": ["container-mini-wrap"],
"controlWrapConfig": {
	"classes": {
		"wrapClassName": ["control-mini-wrap"]
	}
},

 

Ищите пример в ActivityMiniPage (UIv2).

Вам нужно будет кодом добавить элемент в родительский контейнер ResultsContainer и в ResultInfoContainer. Или вообще сделать свой контейнер (или или элемент), настроить "видимость" через bindTo на метод isEditableResultsVisible

 

Пример элемента:

{

                "operation": "insert",

                "parentName": "ResultsContainer",

                "propertyName": "items",

                "name": "ProcessResult",

.........

 

если это справочник с "выпадающим списком", то нужно повторять свою логику, как методах onPrepareProcessResultList и ProcessResultList.

 

или вот еще пример элемента  

  

 {

                "operation": "insert",

                "parentName": "MiniPage",

                "propertyName": "items",

                "name": "DetailedResult",

........

 

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

"visible": {  "bindTo": "isEditableResultsVisible" // или какой-то другой метод.

 

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

Добрый день, имеется лендинг работающий как отдельный сайт в IIS, идея в том чтобы в выпадающий список попадали данные из справочника в Creatio. Подскажите, как это можно реализовать?

Нравится

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

С созданием контактов в Creatio через Лэндинг разобрались, но как достать из справочника не понимаю)

В целом это описано в статье.

https://academy.terrasoft.ru/docs/user/instrumenty_crm/lendingi_i_web_f…

 

Но выпадающий список со значениями и id нужно генерировать на стороне лендинга. Если список справочных значений не меняется со временем, то это можно захардкодить. Если меняется, но редко, то лучше синхронизировать базу сайта и справочник creatio. Опять же при наличии бд на сайте. И потом из базы генерировать "код" со значениями. Третий вариант, через веб сервис/или odata каждый раз считывать значения справочника и генерировать на стороне лендинга список

Трефилов Павел Сергеевич,Спасибо, мы пробовали захардкодить но данными обязательное Контрагент поле все равно не заполняется, можно ли как-то побороть при отправке данных с лендинга? Через БП после создания не хотелось бы делать

Тут наверное делать поле "контрагент" необязательным на уровне объекта. Параллельно создавать текстовое поле контрагент, и процессом после создания пытаться искать (или создавать) контрагента по каким-то критериям. Например, если лендинг с типом "форма регистрации контакта", то там есть процесс по "поиску и созданию контакта", можно в него встроить логику с контрагентом, там доп поле на объекте создавать не нужно, его можно брать из веб формы.

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

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

 

Заменили Timer на Thread.Sleep. На средах разработки и тестирования всё прошло хорошо, но у клиента на средах и Sleep зависает, оставляя процессы в состоянии Running навсегда.



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



Спасибо!

Нравится

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

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

Вероятнее всего дело все же в большой нагрузке на планировщик Quartz.

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

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

Детальнее об этом описано в статье на академии по настройке планировщика.

https://academy.terrasoft.ru/docs/developer/komponenty_prilozheniya/pla…

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

Вероятнее всего дело все же в большой нагрузке на планировщик Quartz.

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

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

Детальнее об этом описано в статье на академии по настройке планировщика.

https://academy.terrasoft.ru/docs/developer/komponenty_prilozheniya/pla…

Зубов Максим,

Очень хотелось бы от них отказаться, но для workaround'а другого бага, приходится ввести задержку в процессе, чтобы данные успели появиться.



А подскажите, как перезапустить Quartz, если в Process log уже есть висящие на таймере процессы?

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

Добрый день, 

Подскажите, пожалуйста, возможно ли скрыть кнопки Reject, Change approver для определенного объекта и как это сделать? 

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

Нравится

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

Это возможно, для реализации можно создать замещающую схему VisaNotificationsSchema со следующим содержимым:

 

define("VisaNotificationsSchema", function() {
   return {
      methods: {

         getVisaActionButtonMenu: function() {
            const menu = this.get("VisaActionButtonMenu");
            if (menu.getCount() > 3) {
               menu.removeByIndex(1);
               menu.removeByIndex(1);
               menu.removeByIndex(1);
            }
            return menu;
         }
      },
      diff: [
         {
            "operation": "merge",
            "name": "VisaActionButton",
            "parentName": "NotificationItemTopContainer",
            "propertyName": "items",
            "values": {
               "itemType": Terrasoft.ViewItemType.BUTTON,
               "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
               "classes": {"wrapperClass": ["visaActionButtonWrap-class"]},
               "caption": {"bindTo": "Resources.Strings.VisaActionButton"},
               "prepareMenu": {"bindTo": "selectNotificationItemOnActionButtonClick"},
               "menu": {
                  "items": {"bindTo": "getVisaActionButtonMenu"}
               }
            }
         }
      ]
   };
});

Олег Нефедьев,

 

спасибо, будем пробовать!

Олег Нефедьев,

 

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

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

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



 message: Uncaught Terrasoft.ItemNotFoundException: Item with key  Does not exist 



Нет никакого Id, что искать.

Пробовали очистить всю схему страницы, но не помогло. Видимо, проблема где-то в регистрированных данных



Как с этой ситуацией справится?

Нравится

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

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



Попробуйте добавить пустой модуль, сохранить его и удалить. Это перегенерирует бандлы и решит ошибку.

Станислав Чернышев,

уточню:



добавил новый раздел, но ошибка осталась. Или я не так понял?

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

 

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







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



Может, его можно удалить как-то на сервере?

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

Добрый день,

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

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

Нравится

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

Подскажите, каким образом реализовано визирование в бизнес-процессе, с помощью элемента "Визирование", или с помощью добавления новой записи объекта визы?

 

Есть ли при открытии коммуникационной панели какие-либо ошибки в консоли браузера (F12)?

Олег Нефедьев,

Визирование реализовано с помощью элемента "Визирование". В консоли какие-то ошибки есть.

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