Добрый день. Нужно выполнять отмену процесса прямо из C#. Я знаю, что можно при удалении записи сделать так entity.DeleteWithCancelProcess, но такой вариант не подходит, запись не надо удалять. 

Кто-то сталкивался с такой задачей?

Нравится

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

Добрый день!

Разобрались с добавлением продукта к заказу, но есть одно НО. Не получается подтянуть цену продукта, нужно указывать вручную (в API запросе). Вопрос:

Как при добавлении продукта к заказу через API можно автоматически подтягивать цену из прайс листа? Пробовали указывать PriceListId, но это не помогает. Так же пробовали указывать разные CurrencyId, но это так же не помогает.



Используем oData для работы с API.



Пример запроса:

 

-header 'Accept: application/json' \
--header 'Content-Type: application/json; charset=utf-8; IEEE754Compatible=true' \
--header 'ForceUseSession: true' \
--header 'BPMCSRF: UX.Xa1Suc01arS7jMhppkO' \
--data-raw '{
"ProductId": "e85b3371-79e5-4606-9e1c-70976a09c040",
"OrderId": "102b0d66-3744-44de-95b9-fb5ee806bc04",
"Name": "Yeremenko Test",
"BaseQuantity": "1",
"Quantity": "1",
"UnitId": "917f764e-62e6-df11-971b-001d60e938c6",
"CurrencyId": "915e8a55-98d6-df11-9b2a-001d60e938c6",
"PriceListId": "fa689c95-c63c-4908-8fd2-19a95e0425bd",
"CurrencyRate": "1",
"TaxId": "c7ec6b33-a9d6-df11-9b2a-001d60e938c6"
}

 

Нравится

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

Добрый день! Не совсем понимаю что вы хотите сделать. Разве вы уже не указали id продукта, у которого уже посчитана цена. 

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

Добрый день. 

Глобальный поиск и дедубликация ранее корректно работал на версии 2.0, после перевода его на 3.0, стал странно работать.

В системе есть раздел Purchase в нем порядка 25 млн записей. 

Глобальный поиск его судя по всему не проиндексировал, поиск по нему не происходит, хотя я принудительно пытаюсь его проиндексировать через 

/indexation/SiteName/Purchase/reindex/full мне в ответе приходит ОК, но ничего не происходит. 

 После запуска дедубликации по этому разделу она в базе mongo сразу стает завершенной без ошибок, а в интерфейсе остается на 0%. 

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

В mongo залазил согласно https://community.terrasoft.ua/articles/kak-proverit-nalichie-zapuschen…



 Ошибок по логам контейнеров не нашел. Подскажите может, кто-то сталкивался с такой проблемой, возможно есть дополнительные настройки?  Спасибо.

Нравится

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

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

 

Возможно, очередь не долшла к записям из этого раздела.

Полная переидексация для БД только в разделе Purchase может проходить достаточно долго.

Можно посмотреть значения колонки LastIndexeOn для раздела Purchase в таблице IndexingEntity в базе глобального поиска Postgres. Когда индексация дойдет к этому разделу значения из этой колонки начнет расти и можно будет поискать записи после завершения индексации раздела.

 

Как узнать завершилась ли индексация глобального поиска в on-site?

 

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

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

  • LastIndexedOn - дата последней итерации индексации.

  • InProcess - в процессе ли индексация (одной итерации) по текущей сущности.

Индексация завершилась для конкретной сущности, лишь тогда, когда LastIndexedOn = дата подключения сайта к ГП и в InProcess установлено значение “false“.

Полностью индексация завершена, когда для всех записей из таблицы "IndexingEntity" значения в LastIndexedOn и InProcess установлены аналогично описанию выше.

Порядок настройки

  1. Зайти в контейнер с БД глобального поиска.

     

    docker exec -it gs-postgres bash

  2. Подключиться к БД глобального поиска.

     

    psql -d postgres -U postgres

  3. Выбрать, все записи из таблицы IndexingEntity.

     

    SELECT "EntityName", "LastIndexedOn", "InProcess" FROM "IndexingEntity";

 

P.S. Планировщик (который ответственный за первичную индексацию) запускается раз в 50 дней, таким образом доиндексирует\актуализирует необходимое.

То есть, это к тому, что каждые 50 дней эта дата будет обновляться.

Жмурко Сергей,

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

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

Добрый день.

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

Например у меня есть правило:

rules: {

            "Status": {

                "FiltrationStatusNrbUseInCalls": {

                    ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,

                    autocomplete: true,

                    autoClean: true,

                    baseAttributePatch: "Finish",

                    comparisonType: Terrasoft.ComparisonType.EQUAL,

                    type: BusinessRuleModule.enums.ValueType.CONSTANT,

                    value: true

                },

        },

},

и оно не работает, ошибки в консоли нет.

но если я буду фильтровать по полю с id (например укажу baseAttributePatch: "Id"? а в value конкретный Id), то фильтр работает.

 "Status" указан в атрибутах, как виртуальная колонка.

Нравится

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

Решила вопрос сама, где бы не располагалась фильтрация, будь то в секции filters у атрибута, или в rules, для справочников типа ENUM это не работает. Помогло только вынести метод getLookupQuery и все его зависимые методы на страницу. 

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

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

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

Как добавляю модальное окно: 

1) Создаю в пакете модель представления страницы и указываю в качестве родителя BaseModalBoxPage

2) Код страницы:

 define("NrbTestModalBox", [],

    function() {

        return {

            mixins: {},

            messages: {},

            attributes: {

                "Contact": {

                    isRequired: true,

                    dataValueType: Terrasoft.DataValueType.LOOKUP,

                    referenceSchemaName: "Contact",

                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

                    lookupListConfig: {

                        filters: [

                            function () {

                                debugger;

                                var filterGroup = Ext.create("Terrasoft.FilterGroup");

                                filterGroup.add("ContactFilter",

                                                Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "CreatedById", null));

                                return filterGroup;

                            }

                        ]

                    }

                },

            },

            details: {},

            diff: /**SCHEMA_DIFF*/[

                {

                    "operation": "insert",

                    "name": "mainBoxContainerGrid",

                    "parentName": "CardContentWrapper",

                    "propertyName": "items",

                    "values": {

                        "itemType": Terrasoft.ViewItemType.GRID_LAYOUT,

                        "items": []

                    }

                },

                {

                    "operation": "insert",

                    "parentName": "mainBoxContainerGrid",

                    "propertyName": "items",

                    "name": "Contact",

                    "values": {

                        "bindTo": "Contact",

                        "caption": "Контакт",

                        "contentType": Terrasoft.ContentType.ENUM,

                        "layout": {

                            "column": 0,

                            "row": 0,

                            "colSpan": 24

                        }

                    },

                }

            ]/**SCHEMA_DIFF*/,

            methods: {

                init: function() {

                    this.callParent(arguments);

                },

 

                getLookupQuery: function(filter, column) {

                    var esq = this.callParent(arguments);

                    var lookupListConfig = this.getLookupListConfig(column);

                    if (lookupListConfig) {

                        this.Terrasoft.each(lookupListConfig.columns, function(column) {

                            if (!esq.columns.contains(column)) {

                                esq.addColumn(column);

                            }

                        }, this);

                    }

 

                    var schemaColumn = this.getColumnByName(column);

                    if (schemaColumn.lookupListConfig && schemaColumn.lookupListConfig.filter) {

                        esq.filters.addItem(schemaColumn.lookupListConfig.filter());

                    }

 

                    return esq;

                },

                getLookupListConfig: function(columnName) {

                    var schemaColumn = this.getColumnByName(columnName);

                    if (!schemaColumn) {

                        return null;

                    }

                    var lookupListConfig = schemaColumn.lookupListConfig;

                    if (!lookupListConfig) {

                        return null;

                    }

                    var excludedProperty = ["filters", "filter"];

                    var config = {};

                    this.Terrasoft.each(lookupListConfig, function(property, propertyName) {

                        if (excludedProperty.indexOf(propertyName) === -1) {

                            config[propertyName] = property;

                        }

                    });

                    return config;

                }

            }

        };

    });

 

3) Вызываю модальное окно так: 

this.sandbox.loadModule("ModalBoxSchemaModule", {

id: this.sandbox.id + "_NrbTestModalBox", //NrbCompleteCallModalBox

instanceConfig: {

     moduleInfo: {

           schemaName: "NrbTestModalBox",

     },          

 }

});

 

 

debugger не срабатывает при разворачивании справочника. Подскажите пожалуйста, в чем у меня ошибка?

Нравится

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

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

Однако, возможно дело в том, как вы в атрибуте работаете со значением CreatedBy.

Для теста создал подобный фильтр для поля Owner:

attributes: {
			"Owner": {
                "dataValueType": Terrasoft.DataValueType.LOOKUP,
                "lookupListConfig": {
                    "filters": [
                        function() {
                            var filterGroup = Ext.create("Terrasoft.FilterGroup");
                            filterGroup.add("TestSd",
                                Terrasoft.createColumnIsNullFilter("[Contact:Id].CreatedBy")
										   );
                            return filterGroup;
                        }
                    ]
                }
			}
		},

Обратите внимание каким образом я ищу контакты с CreatedBy null:

Terrasoft.createColumnIsNullFilter("[Contact:Id].CreatedBy").

Возможно данный пример вам поможет.

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

Всем привет.

Всем привет. Мы достаточно молодой интегратор Creatio - QubeSoft https://qube-soft.com/, но в целом внедрением CRM мы занимаемся уже 8 лет. У нас огромнейший опыт реализации e-commerce проектов. Мы первые в Украине получили демо API Розетки, помогали разрабатывать API для Prom.ua и участвовали в релизе API “Новая Почта” фулфилмент. 

 

На данный момент Creatio отличная платформа для “дочерних” e-commerce проектов. Это когда все интеграции делаются, например, через 1С. А Creatio подключается к той же 1С, как окно операторов. Такое встречается, когда e-commerce проект является не основным видом деятельности, а суб-направлением (например интернет-магазин продуктов “Сильпо”; интернет магазин сети “ЛЮКСОПТИКА” и т.д.). 

 

Если же e-commerce проект существует как отдельный и самостоятельный бизнес/направление (там где есть только интернет продажи), то Creatio сильно уступает конкурентам тем, что или не имеет “маст хев коннекторов” для e-commerce. Или существующий коннектор не решает задачи бизнеса (например 90% e-commerce проектов, где более 50+ заказов в день имеют несколько кабинетов Новой Почты, которые должны быть подключены к единой CRM). 

 

Что мы хотим и кого мы ищем? 

Мы хотим разработать коннекторы в правильном виде. В том, которые устроят 95% e-commerce направлений. Так как мы были PM разработчики всех этих приложений и адаптировали их на протяжении почти 6ти лет, то мы очень хорошо понимаем задачу. 

Для этого нам нужен backend разработчик, у которого есть опыт/понимание структуры Creatio. Чтобы сделать все коннекторы “нативными” (не на отдельном сервере-прослойке, а как импортируемый модуль). 

Мы готовы работать с вами на следующих условиях:

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

2. частичная занятость/вовлеченность в проект, оплата за часы (если вы текущий сотрудник Creatio то так, чтобы это не понизило вашу эффективность на основном месте работы)

3. реализация модуля под ключ (оценка, реализация и оплата ТЗ)

4. долевое участие в правах собственности коннектора. Так как коннектор будет платным, то мы готовы рассмотреть вашу долю от прибыли

5. ваше, встречное, предложение или смешанный тип сотрудничества 

 

Если вас заинтересовала данная тема или вы хотите/готовы обсудить.

Или у вас есть для нас совет/предложение/рекомендация специалиста - пишите, пожалуйста:

d.levoshich@qube-soft.com

телега: +380509954784 Дима 

 

Спасибо) 

Нравится

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

Веб-сервис.

Как для 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 запрос.

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

Здравствуйте, коллеги. 

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

 

Нравится

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

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

 

var newGoodsEntity = goodsEntity.Clone() as Terrasoft.Core.Entities.Entity;
newGoodsEntity.SetDefColumnValues();
newGoodsEntity.SetColumnValue("Id", Guid.NewGuid());
newGoodsEntity.SetColumnValue("ChangeRequestId", newChangeRequestId);
newGoodsEntity.Save();

 

если нужно детали копировать то тут нужно или по форинкеям бегать или же кастомно выборочные таблицы, кароче без c# никуда

Добрый день.

Как уже было упомянуто выше, решение такой задачи невозможно в полноценном объеме без разработки. 

Аналогичный вопрос рассматривался в статье: https://community.terrasoft.ru/questions/kopirovanie-suschnosti-iz-deta…  

Также на Marketplace есть такое дополнение, возможно будет полезным:

https://marketplace.terrasoft.ru/app/copy-detail-records-creatio

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

 В кастомном веб-сервисе есть метод создания договора, иногда срабатыват, а иногда нет, и пишет ошибку:

Terrasoft.Core.ProcessRunBySignalException: Ошибка при запуске процесса "Типовой договор", инициируемого событием "начальный сигнал". 



Кто-нибудь сталкивался с этим? Пытался найти процесс такой, но безуспешно.

Нравится

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

Не удалось загрузить файл или сборку "Common.Logging, Version=3.3.1.0, Culture=neutral, PublicKeyToken=af08829b84f0328e" либо одну из их зависимостей. Найденное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

 

Common.Logging никакой версии не удаётся установить. Развернул IIS и на созданном сайте выдаёт такую ошибку. (Пробую развернуть creatio и оценить возможность дальнейшего использования, но пока всё очень сложно)

Нравится

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