Здравствуйте, коллеги. Появился вопрос как из БП запустить экспорт Excel файла (нужно каждую неделю отправлять этот файл на email). Пробовал записывать файл с помощью GetExcelData из ExcelConverter. Но выходила ошибка с FETCH запросом - количество строк должно быть больше нуля. Подскажите пожалуйста как это лучше реализовать.Изображение удалено.

Нравится

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

Удалось решить проставлением значения batchsize:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "VwDoorTT");
esq.AddColumn("Id");
var collection = esq.GetEntityCollection(UserConnection);
int count = collection.Count;
 
var excelConverter = new ExcelConverter();
excelConverter.BatchSize = count;
var data = excelConverter.GetExcelData(exportEsq, UserConnection);
Set<byte[]>("ExcelFile", data);

 

Добрый день.



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

Mykhailo Storozhuk,

Добрый.

Terrasoft.Configuration.ExportToExcel.ExportToExcelException: Exception during export to excel. Inner exception Количество строк, указываемое в предложении FETCH, должно быть больше нуля. ---> System.Data.SqlClient.SqlException: Количество строк, указываемое в предложении FETCH, должно быть больше нуля.

   в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

   в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)

   в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)

   в System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()

   в System.Data.SqlClient.SqlDataReader.get_MetaData()

   в System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)

   в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)

   в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)

   в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)

   в System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)

   в Polly.Policy.<>c__DisplayClass119_0`1.<Execute>b__0(Context ctx, CancellationToken ct)

   в Polly.Policy.<>c__DisplayClass129_0`1.<ExecuteInternal>b__0(Context ctx, CancellationToken ct)

   в Polly.Policy.<>c__DisplayClass103_0.<NoOp>b__1(Context ctx, CancellationToken ct)

   в Polly.NoOp.NoOpEngine.Implementation[TResult](Func`3 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.<>c.<NoOp>b__103_0(Action`2 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.ExecuteInternal[TResult](Func`3 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.Execute[TResult](Func`3 action, Context context, CancellationToken cancellationToken)

   в Polly.Policy.Execute[TResult](Func`1 action)

   в Terrasoft.DB.MSSql.MSSqlExecutor.FailoverExecute[TResult](DbCommand command, Func`1 func)

   в Terrasoft.Core.DB.DBExecutor.FailoverExecuteReader(DbCommand command, Func`1 func)

   в Terrasoft.Core.DB.DBExecutor.<ExecuteCommandAsync>d__88`1.MoveNext()

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

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Terrasoft.Core.DB.DBExecutor.ExecuteCommand[TResult](Func`2 commandExecutionCallback, String sqlText, QueryParameterCollection queryParameters, CancellationToken cancellationToken)

   в Terrasoft.Core.DB.DBExecutor.InternalExecuteReader(String sqlText, QueryParameterCollection queryParameters, CommandBehavior behavior, CancellationToken cancellationToken)

   в Terrasoft.Core.DB.DBExecutor.InternalExecuteReader(String sqlText)

   в Terrasoft.Core.DB.Select.<ExecuteReaderAsync>d__54.MoveNext()

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

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Terrasoft.Core.DB.Select.ExecuteReader(DBExecutor dbExecutor)

   в Terrasoft.Core.Entities.EntitySchemaQuery.<GetNativeDataReaderAsync>d__299.MoveNext()

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

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Terrasoft.Core.Entities.EntitySchemaQuery.GetNativeDataReader(UserConnection userConnection, Select selectQuery)

   в Terrasoft.Core.Entities.EntitySchemaQuery.<GetDataReaderAsync>d__302.MoveNext()

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

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Terrasoft.Core.Entities.EntitySchemaQuery.GetDataReader(UserConnection userConnection, Select selectQuery)

   в Terrasoft.Core.Entities.EntitySchemaQuery.<ExecuteReaderAsync>d__290.MoveNext()

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

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Terrasoft.Core.Entities.EntitySchemaQuery.ExecuteReader(UserConnection userConnection, EntitySchemaQueryOptions options)

   в Terrasoft.Core.Entities.EntitySchemaQuery.<GetEntityCollectionAsync>d__342.MoveNext()

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

   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntityCollection(UserConnection userConnection, EntitySchemaQueryOptions options)

   в Terrasoft.Configuration.ExportToExcel.ExcelConverter.SaveData(EntitySchemaQuery entitySchemaQuery, UserConnection userConnection)

   в Terrasoft.Configuration.ExportToExcel.ExcelConverter.GetExcelData(EntitySchemaQuery entitySchemaQuery, UserConnection userConnection)

   --- Конец трассировки внутреннего стека исключений ---

   в Terrasoft.Configuration.ExportToExcel.ExcelConverter.GetExcelData(EntitySchemaQuery entitySchemaQuery, UserConnection userConnection)

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

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

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

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

Удалось решить проставлением значения batchsize:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "VwDoorTT");
esq.AddColumn("Id");
var collection = esq.GetEntityCollection(UserConnection);
int count = collection.Count;
 
var excelConverter = new ExcelConverter();
excelConverter.BatchSize = count;
var data = excelConverter.GetExcelData(exportEsq, UserConnection);
Set&lt;byte[]&gt;("ExcelFile", data);

 

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

Добрый день!

 

Скажи, пожалуйста, можно ли с помощью вашего дополнения высчитать среднее и максимальное время TTL (time to live) Обращения?

Нравится

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

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

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

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

 

Пытаемся авторизоваться в демонстрационной версии одного веб-сервиса (Lamoda Fulfilment) из интерфейса Creatio OAUTH 2.0

 

При попытке авторизации в веб-сервисе получаем ошибку

Invalid grant_type parameter or parameter missing



При этом "собранный" запрос с передачей в GET необходимых тех же самых параметров client_id, client_secret и grant_type (даже с redirect_url) в адресной строке и как отдельный метод Creatio возвращает ответ без ошибок.



Дополнительные разрешения / scopes для пользователей веб-сервиса не требуются (это demo версия веб-сервиса, условия самые "лайтовые")

 

В связи с этим вопрос?

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



Спасибо всем ответившим Изображение удалено.

Нравится

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

Александр, здравствуйте.

 

На данный момент такие типы авторизации OAuth 2.0 не поддерживаются. Так как в запрос не добавляется параметр grant_type.

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

Разработали свой пользовательский сервис. Из-под учетки Supervisor все работает корректно

 

Создали пользователя системы, отличного от Supervisor. Выдали роль только All Employess. При обращении к сервису выдается сообщение, что метод не доступен (авторизация проходит успешно).

Если пользователю выдать роль System Administrators, то вызов сервиса отрабатывает корректно. 

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

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

 

Нравится

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

Добрый день, Оксана.

Предоставьте больше информации о проблеме.



1) Что это за сервис? Rest?

2) Каким образом вызывается через Supervisor и через обычного сотрудника.

3) Скиньте код сервиса. Или хотя бы атрибуты сервиса и метода.

4) Каким образом был создан сервис?

5) Какой код, текст ошибки при попытке вызвать через пользователя без прав администратора?

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

апапапп

Нравится

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

апапапп

Нравится

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

Возник вопрос по возможности реализации следующей задачи для creatio (on site):

Необходимо встроить в секцию на карточку объекта кастомную секцию/iframe, в которой должно отображаться spa со своей логикой, spa развернуто в IIS.

SPA должно сообщаться с формой и данными из creatio (выполняются запросы к бд creatio при манипуляциях в spa)

В 

Можно ли такое сделать в creatio и каким образом?

Смотрел в сторону добавления Веб-Сервиса в пакет, но, насколько я знаю, он используется только для бекэнд логики.

 

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

Нравится

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

Николай, здравствуйте.

 

Вы можете разместить страницу с помощью HTML-элемента <iframe>. Пример такой реализации можно найти в статье на академии по ссылке:

https://academy.terrasoft.ru/docs/developer/elements_and_components/htm…

 

Но реализовать обмен данными между страницей и Creatio не получится. Если нужно выполнять запросы в базу данных Creatio, можно реализовать свое API, или использовать, например, Odata.

Дмитрий, спасибо за вариант, попробую реализоватьyes

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

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

Суть:

Нужно чтобы система автоматически убирала из справочника (Черный список Email адресов) email адреса через год после их внесения в справочник ЧС

Нравится

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

Tigran Gevorgyan пишет:

Что Вы имеете введу  "сделать отдельное представление"  Создать отдельный раздел,  записывать туда все записи из черного списка с полем даты создания и в БП определить запись которая произведена год назад и если да, то удалить запись из раздела и из справочника ?

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

А потом для работы с ним из конфигурации создать новую EntitySchema.

 

Чтобы связать EntitySchema с представлением, необходимо убедиться в соблюдении следующих условий:

1. В свойствах объекта установлен признак “Представление в базе данных”.

2. Название объекта соответствует названию представления в БД.

3. Структура объекта и представления идентичны.

Со стороны приложения View воспринимается как обычный объект.

 

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

 

Tigran Gevorgyan пишет:

Я думая это можно как-то осуществить через системные настройки

На данном этапе не вижу необходимости в добавлении новой системной настройки и использовании её  в бизнес-процессе.

Добрый день.

 

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

 

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

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

Добрый день. Спасибо за отклик!

Что Вы имеете введу  "сделать отдельное представление"  Создать отдельный раздел,  записывать туда все записи из черного списка с полем даты создания и в БП определить запись которая произведена год назад и если да, то удалить запись из раздела и из справочника ?

 

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

 

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

 

Tigran Gevorgyan пишет:

Что Вы имеете введу  "сделать отдельное представление"  Создать отдельный раздел,  записывать туда все записи из черного списка с полем даты создания и в БП определить запись которая произведена год назад и если да, то удалить запись из раздела и из справочника ?

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

А потом для работы с ним из конфигурации создать новую EntitySchema.

 

Чтобы связать EntitySchema с представлением, необходимо убедиться в соблюдении следующих условий:

1. В свойствах объекта установлен признак “Представление в базе данных”.

2. Название объекта соответствует названию представления в БД.

3. Структура объекта и представления идентичны.

Со стороны приложения View воспринимается как обычный объект.

 

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

 

Tigran Gevorgyan пишет:

Я думая это можно как-то осуществить через системные настройки

На данном этапе не вижу необходимости в добавлении новой системной настройки и использовании её  в бизнес-процессе.

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

Спасибо))

Tigran Gevorgyan,

Если будут вопросы, обращайтесь

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

Добрый день, уважаемое сообщество!

Силами своей разработки, мы пытаемся передать данные по "языку общения" (Language) в карточку контакта с нашей рабочей базы данных в базу данных Creatio.

 

Открыв объект Contacts, я понял, что язык общения указан как Language, который ссылается на объект SysLanguage. Если я правильно понял, то при добавлении/обновлении записей контактов требуется передавать ID языка именно из этого справочника, так как просто текстовая запись вида: Английский (США) не подойдет.



Ознакомившись с документацией api https://academy.terrasoft.ua/documents/technic-sdk/7-16/integraciya-s-sistemoy-i-vneshniy-api мы пытаемся понять, где найти rootSchemaName для списка языков?

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

Кто-то может подсказать?

Нравится

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

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

 

Объект называется "SysLanguage". Это можно узнать зайдя через конфигурацию в "Контакт", найти интересуемое поле и посмотреть на какой справочник оно ссылаться. Далее найти справочник в конфигурации.

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

Добрый день!



Есть деталь со списком, унаследованная от BaseGridDetailV2.



Список из результата хранимой процедуры генерируется в методе loadGridData. Как можно вывести значение одной из колонок этого списка не как обычный текст а ссылку на запись в другом разделе Creatio?



Пробовали так, но всё равно выводится как текст:



 

UsrAccount: {
  columnPath: "UsrAccount",
  name: "Account",
  isLookup: true,
  referenceSchemaName: "Account",
  dataValueType: Terrasoft.DataValueType.LOOKUP
},

 

Нравится

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

Добрый день.

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

n.isaev пишет:

Добрый день.

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

А можете привести пример?



Напрямую написать href не помогло 

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

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



Через set не получится установить тег для поля, т.к. он экранирует теги.



Для реализации можно использовать следующею статью или напрямую изменять дом дерево страницы.

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