Приветствуют, коллеги.

Необходимо создать экземпляр UserConnection в Unit тестах, поиск привели меня к классу TestSystemUserConnection в пространстве имён Terrasoft.TestFramework. Только подключить пространство имён мне не удается в проекте тестов и с ошибкой тесты не запускаются. Кто нибудь сталкивался с такой проблемой?

Нравится

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

Линар, обратите внимание на тему «Тестирование работы запросов через AppConnection», там есть примеры кода тестов.

Нашёл в папке Terrasoft.WebApp\bin библиотеку Terrasoft.TestFramework.dll, подключил в проект тестов. Пространство имён подключилось, буду пока двигаться дальше

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

Пытаюсь сделать так

var update = this.Ext.create("Terrasoft.UpdateQuery", {rootSchemaName: this.entitySchemaName});
update.filters.add("IdFilter", this.Terrasoft.createColumnFilterWithParameter("Id", selectedRows));
update.setParameterValue("B2BClient", Terrasoft.GUID_EMPTY, Terrasoft.DataValueType.GUID);
update.execute(function() {
	this.updateDetail({reloadAll: true});
}, this);

Упорно ничего не работает. 

Даже если писать вместо Terrasoft.GUID_EMPTY null или  Terrasoft.DataValueType.LOOKUP, выдает Uncaught Идентификатор GUID должен содержать 32 цифры и 4 дефиса (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

Нравится

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

Лёш, проблема не там где ищешь.



Ты фильтр добавляешь selectedRows а тип фильтра используешь как для this.get("Id").

Ошибка в том что фильтр ожидает от тебя не array а GUID.



Для массива измени тип фильтра на createColumnInFilterWithParameters.



А в исходниках кстати указано что апдейте надо Null передавать, а не GuidEmpty

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

 

Попробуйте написать таким образом:

update.setParameterValue("B2BClient", null, Terrasoft.DataValueType.LOOKUP);

 

Лёш, проблема не там где ищешь.



Ты фильтр добавляешь selectedRows а тип фильтра используешь как для this.get("Id").

Ошибка в том что фильтр ожидает от тебя не array а GUID.



Для массива измени тип фильтра на createColumnInFilterWithParameters.



А в исходниках кстати указано что апдейте надо Null передавать, а не GuidEmpty

В конфигурации встречается и работает нормально null и с Terrasoft.DataValueType.GUID тоже. Например, в FileDetail:

var update = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: this.entitySchema.name
});
update.enablePrimaryColumnFilter(itemId);
update.setParameterValue("LockedOn", currentDateTime, Terrasoft.DataValueType.DATE_TIME);
if (isLocked) {
	update.setParameterValue("LockedBy", Terrasoft.SysValue.CURRENT_USER_CONTACT.value,
		Terrasoft.DataValueType.GUID);
} else {
	update.setParameterValue("LockedBy", null, Terrasoft.DataValueType.GUID);
}
update.execute(function(response) {
...

 

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

Всем привет!

 

Столкнулся со странным поведением: не всегда отрабатывает метод this.reloadEntity(); в карточке. Заметил, что при открытии страницы в режиме редактирования он отрабатывает корректно, но если создавать новую сущность и сохранить карточку ("тихое" сохранение без выхода их карточки через isSilent) метод не отрабатывает: поля не обновляются, ошибок в консоле нет. Вижу, что контекст отличается от контекста страницы в режиме редактирования, но как это победить непонятно. Кто-нибудь сталкивался?

 

Заранее благодарен за ваши ответы.

Нравится

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

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

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

Довольно простая задача - прочитать параметр БП который содержит ID или текст. При следующем коде в Задание-сценарий:

Guid activityId = Get("Activity11");

String activity1 = Get("ActivityGuid");

 

return true;

Выдает всегда ошибку:  

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

   в Terrasoft.Common.ReflectionUtilities.GetPropertyValueByPath(Object source, String propertyPath)

   в Terrasoft.Core.Process.ProcessModel.Get[T](String propertyPath)

   в Terrasoft.Core.Process.UsrProcess17NvgIncident1MethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)

   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

 

В чем может быть проблема ? 

Нравится

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

Добрый день.

 

Какую версию срм используете?

Алла Савельева,

7.14.1.935

Александр Че,

Проверьте, чтобы у Вас был интерпритируемый процесс (это в свойствах самого процесса устанавливается признак) и у скрипт такста был установлен признак 'Для интерпритируемого процесса' (точно не помню название).

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

Спасибо,

но как я понял из того же поста:

"Начиная с версии 7.12.3 все создаваемые бизнес-процессы в bpm’online являются интерпретируемыми. Для обращения к значениям параметра процесса следует использовать методы get и set."

В расширенных настройках только поле с Именем есть теперь.



Есть еще идеи ? 

Александр Че,

Служебное слово 'string' пишется с маленькой буквы, а у Вас с большой. Попробуйте написать правильно, вот так:

string activity1 = Get<string>("ActivityGuid");

И ещё меня смущает названия Ваших параметров: в строку пытаетесь получить параметр с названием 'ActivityGuid'. Вы точно правильно параметры приводите к соответствующим типам?

 

Александр Че пишет:

Начиная с версии 7.12.3 все создаваемые бизнес-процессы в bpm’online являются интерпретируемыми. Для обращения к значениям параметра процесса следует использовать методы get и set

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

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

Пересобрал БП.  И добавил другие параметры:

И все равно та же ошибка с GET ..

Скриншоты БП ниже



А после изменения кода в скрипте компилировали процесс или только сохраняли?

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

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

 

На 7.16.1 аналогичное работает нормально:

String ProcessSchemaParameter1 = Get<String>("ProcessSchemaParameter1");
Set("ProcessSchemaParameter2", ProcessSchemaParameter1);
return true;

Но тут механизм параметров дорабатывался, добавили направление.

Сомневаюсь, что в 7.14.1 просто стандартное обращение к параметру не работало. Может, у Вас сначала было неправильно с типом или названием параметра, и это закешировалось?

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

 в 7.14 еще нет направления, и параметры указываются в коде через их имена, которые указаны в параметрах процесса. 

Я тоже думал что закэшированно, и потому поднял быстро дефолтный Service и создал БП в пакете Custom и компилировал еще раз пакет уже в конфигурации, но ошибка так и не уходит.. такое ощущение что библиотеки не хватает.

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

 

Возможно, Ваш вопрос решит обновление.

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

Коллеги, всем доброго дня!

У нас есть справочник, абсолютно обычный, никакого кастома. Некий отдельный процесс наполняет данный справочник записями в соответствии с алгоритмом своей работы, порядка 2-3 тысяч записей. После обработки данных записей пользователи производят удаление стандартными методами: Действия - Выбрать все записи, затем Удалить. По истечению некоторого времени получаем ошибку вида: "Произошла ошибка. Пожалуйста, обратитесь к администратору". Скажите, возможно есть какие-то подводные камни у данного механизма удаления, что может стать причиной такого поведения, как можно диагностировать и устранить проблему? Справочник абсолютно линейный и простой, никакого кастомного кода в нем нет, логики на объекте справочника тоже нет.

Буду признателен за любые идеи в решении данного вопроса!

Нравится

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

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

- у пользователя под которым выполняется данная операция (удалить), нет соответствующих прав;  

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

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

- у пользователя под которым выполняется данная операция (удалить), нет соответствующих прав;  

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

Добрый день.

 

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

 

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

 

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

Алла Савельева,

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

На тайм аут это действительно больше всего похоже. Но пока не знаем как выйти из положения, разве что написать кастомный сервис зачистки данного справочника. Удаление частями выход, но это крайне неудобно пользователям (как бить записи на группы, если их 3000, и помечать их к удалению)?

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

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

 

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

 

Ещё длительное удаление может быть связано с логикой, которая добавлена во встроенном или отдельном БП на событии удаления для этого объекта.  В таком случае она отработает только при удалении средствами EntiteSchemaQuery (оно происходит и при удалении пользователем вручную). А при удалении средствами класса Delete она не вызывается: будет намного быстрее, но логика не отработает, что нужно будет учесть и реализовать нужные вычисления отдельно.

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

Добрый день.

Например имеется объект UsrEntity. Хочу открыть справочник для добавления элемента на деталь с возможностью выбора из списка этого объекта. Но, чтобы в списке НЕ БЫЛО тех элементов, которые удовлетворяют условию UsrEntity.UsrA in existedA && UsrEntity.UsrB in existedB && UsrEntity.UsrC in existedC. Пока вижу только один путь это создать представление в SQL и открывать это представление. А возможно ли сделать подобный фильтр на фронте? Может быть есть возможность сделать кастомный фильтр и вставить в конфиг при открытии справочника?

Нравится

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

Решил задачу. Можно же просто UsrEntity.UsrA not in existedA || UsrEntity.UsrB not in existedB || UsrEntity.UsrC not in existedC.

Но так как по колонке A, я уже фильтровал, достаточно было только B и C. А ещё засунул в группу фильтров, другую группу фильтров. Не знал, что так можно

addRecord: function () {
					let activeRowId = this.get("ActiveRow");
					if (!activeRowId) {
						return;
					}
 
					const gridData = this.getGridData();
					let rowData = gridData.get(activeRowId).values;
					if (rowData.IDSBParent){
						activeRowId = rowData.IDSBParent.value;
						rowData = gridData.get(activeRowId).values;
					}
 
					let filterCollection = Terrasoft.createFilterGroup();
					const productFilter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
						"IDSBProductId", rowData.IDSBProduct.value);
					filterCollection.add("productFilter", productFilter);					
 
					let existed = [];
					gridData.collection.items.forEach(function(item){
						if (!item.values.IDSBParent){
							return;
						}
 
						if (item.values.IDSBParent.value !== activeRowId){
							return;
						}
 
						existed.push(item.values);
					}, this);
 
					let notExistedFilterCollection = Terrasoft.createFilterGroup();
					notExistedFilterCollection.logicalComparisonTypes = Terrasoft.LogicalOperatorType.OR;
 
					let existsWarehouseFilter = Terrasoft.createColumnInFilterWithParameters("IDSBWarehouseId", existed.map(item => item.IDSBWarehouse.value));
					existsWarehouseFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
					notExistedFilterCollection.add(existsWarehouseFilter);
 
					let existsPercentFilter = Terrasoft.createColumnInFilterWithParameters("IDSBPercent", existed.map(item => item.IDSBPercent));
					existsPercentFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;
					notExistedFilterCollection.add(existsPercentFilter);
 
					filterCollection.add("notExistedFilterCollection", notExistedFilterCollection);
 
					const config = {
						entitySchemaName: "IDSBVwExpiredRemaining",
						multiSelect: true,
						columns: ["IDSBWarehouseId", "IDSBProductId", "IDSBPercent"],
						filters: filterCollection
					};
 
					this.openLookup(config, this.IDSBAddSelectedProducts, this);
				},

 

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

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

Имеется следующая проблема. Для отправки логгов в кафку, был использован appender https://www.nuget.org/packages/NLog.Targets.KafkaAppender/

Сделаны все необходимые настройки. Добавлены rule и targets, но сообщения в кафку не уходят. В логах так же ошибок нет. 

Из обычного проекта c#, проблем нет. 

Есть ли опыт использования расширения для NLog, если есть прошу поделится опытом внедрения!

Нравится

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

Здравствуйте, Максим!

 

Есть рекомендации, как развернуть минимальный набор компоненов для передачи логов NLog -> Kafka -> GrayLog

 

1. Поднимаем контейнеры 

docker run --name mongo -d mongo:3
docker run --name elasticsearch -e "http.host=0.0.0.0" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -d docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.4
docker run --name kafka -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=kafka --env ADVERTISED_PORT=9092 -d spotify/kafka
docker run -it --rm  -p 9001:9000 --link kafka -e ZK_HOSTS="kafka:2181" -e APPLICATION_SECRET=letmein -d sheepkiller/kafka-manager
docker run --name graylog --link mongo --link elasticsearch --link kafka -p 9000:9000 -p 12201:12201 -p 514:514 -e GRAYLOG_HTTP_BIND_ADDRESS="0.0.0.0:9000" -e GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/ -d graylog/graylog:3.0

2. Подлючаем транспорт 

Подключаам необходимый пакет NLog.Targets.KafkaAppender (или копируем dll)

Конфиг NLog

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    autoReload="true"
    throwExceptions="true">
    <extensions>
        <add assembly="Terrasoft.NLog"/>
        <add assembly="NLog.Targets.KafkaAppender" />
    </extensions>
    <targets async="true">
        <target xsi:type="KafkaAppender"
            name="bpmonlineGelfKafka"
            topic="LogTest"
            brokers="v_artemchuk.tscrm.com:9092"
            debug="false"
            async="false">
            <layout xsi:type="GelfJsonLayout" facility="bpmOnline">
                <attribute name="mesasgeObject" layout="${messageObject}" encode="false"/>
                <attribute name="context" layout="${ndlc}" encode="true"/>
            </layout>
        </target>
    </targets>
    <rules>
        <logger name="*" minlevel="Debug" writeTo="bpmonlineGelfKafka" />
    </rules>
</nlog>

 

Мотков Илья,

здравствуйте! воспользовался данным примером, только вместо транспорта использую RabbitMQ Nlog.RabbitMQ.Target.dll

настроил nlog.config и nlog.config.targets согласно рекомендациям к

Nlog.RabbitMQ.Target, но почему то не конектится RabbitMQ. создал MVC проект с него коннектится без проблем. Версия Creatio 7.18.3

Так же в настройках конфига вижу. что Вы указали в зависимостях Terrasoft.NLog, но я такой сборки не нахожу, можете прокомментировать.

Спасибо.

Алексей, боюсь без личной настройки сложно что-то сказать по этой проблеме. В системе на данный момент не предусмотрено использование Nlog.RabbitMQ.  Возможно стоит обратить внимание на версии Nlog.

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

Добрый день ! Необходимо включить логирование текстов sql - запросов, генерируемых Entity Framework при вызове одного метода кастомного класса, для локализации низкой производительности операции. Подскажите, существует ли такая возможность

Creatio 7.14.3.1686

PostgreSQL 12.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit

Нравится

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

Здравствуйте, Борис!

 

Нам неизвестны никакие юзабельные инструменты кроме встроенных возможностей PostgreSql, описанных тут: https://www.postgresql.org/docs/12/runtime-config-logging.html

Пока единственная альтернатива – включение в web.config в секции db general флажка EnbaleSqlLog, после чего в лог будут падать все запросы, удовлетворяющие условию Threshold. Пример:

  <general connectionStringName="db" securityEngineType="Terrasoft.DB.MSSql.MSSqlSecurityEngine, Terrasoft.DB.MSSql" executorType="Terrasoft.DB.MSSql.MSSqlExecutor, Terrasoft.DB.MSSql" engineType="Terrasoft.DB.MSSql.MSSqlEngine, Terrasoft.DB.MSSql" metaEngineType="Terrasoft.DB.MSSql.MSSqlMetaEngine, Terrasoft.DB.MSSql" metaScriptType="Terrasoft.DB.MSSql.MSSqlMetaScript, Terrasoft.DB.MSSql" typeConverterType="Terrasoft.DB.MSSql.MSSqlTypeConverter, Terrasoft.DB.MSSql" enableRetryDBOperations="false" retryDBOperationFactoryType="Terrasoft.DB.MSSql.MSSqlRetryOperationFactory, Terrasoft.DB.MSSql" binaryPackageSize="1048576" currentSchemaName="dbo" enableSqlLog="true" sqlLogQueryTimeElapsedThreshold="5000" sqlLogRowsThreshold="100" useOrderNullsPosition="false" maxEntitySchemaNameLength="30" />

В данном случае в файл sql.log должны падать все запросы (только тела запросов), выполнение которых длилось более 5 сек.

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

Доброго времени суток.

В системе включаю режим отладки. Всё работает. Переключаюсь на портал - не работает. Как отключить минификацию кода в all-combined.js на портале?

Заранее благодарен

Нравится

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

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

Таблица с настройками:

select * from SysSettingsValue

where SysSettingsId = 'F7827AB8-2EF2-4ACB-A28B-BFB7EB7A01C3'

 

Можно сделать insert например

GUID_USER - id пользователя, которому нужно включить отладку.

insert into SysSettingsValue

(SysSettingsId, SysAdminUnitId, BooleanValue)

VALUES ('F7827AB8-2EF2-4ACB-A28B-BFB7EB7A01C3', GUID_USER, 0)

 

Либо включить глобально для всех через системные настройки: Режим отладки (IsDebug)

 

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

Таблица с настройками:

select * from SysSettingsValue

where SysSettingsId = 'F7827AB8-2EF2-4ACB-A28B-BFB7EB7A01C3'

 

Можно сделать insert например

GUID_USER - id пользователя, которому нужно включить отладку.

insert into SysSettingsValue

(SysSettingsId, SysAdminUnitId, BooleanValue)

VALUES ('F7827AB8-2EF2-4ACB-A28B-BFB7EB7A01C3', GUID_USER, 0)

 

Либо включить глобально для всех через системные настройки: Режим отладки (IsDebug)

 

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

Всем привет!

Каким образом можно с помощью бизнес-процесса прочитать активность из другого объекта?

Например, из объекта [Обращения] необходимо прочесть именно определенную активность и внести в ней изменения.

Нравится

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

Для чтения и изменения данных в объектах используются соответствующие элементы БП.

scr_process_designer_read_data00017.png scr_process_designer_modify_data00019.png 

Связь активности с обращением задаётся в нужном справочном поле «Обращение», по нему объект активности можно фильтровать в настройках элемента.

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