Добрый день! Столкнулся со следующей проблемой:

1) Захожу в Tools -> Configuration -> Schemas:All

2) Кликаю по кнопке "Add"

3) Выбираю "Source code"

4) Появляется сообщение:

> An error occurred in bpm'online. We apologize for the inconvenience.

> Back to Previous Page.

> Please notify the bpm'online support about this error.

> We guarantee your confidentiality and anonymity.



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

Какова может быть причина данной ошибки?

Нравится

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

Добрый день!



Пришлите, пожалуйста, скриншоты из консоли. (Нажмите F12 - Перейдите на вкладку Консоль - Воспроизведите ошибку)

Анна, скрин консоли прикрепил

engineer7,

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

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



Если ошибка будет продолжать воспроизводится, советую Вам отправить подробное описание кейса со скриншотами поведения на почтовый ящик support@bpmonline.com

В логах нашел более подробное описание: 

Exception Message: Value for argument "uid" must be specified.

Exception Type: Terrasoft.Common.ArgumentNullOrEmptyException

Exception Source: Terrasoft.Common



Exception Stack Trace:

   at Terrasoft.Common.ValidateUtilities.CheckArgumentEmpty(Guid source, String argumentName)

   at Terrasoft.Core.Packages.PackageIdentifierMapper.GetIdByUId(Guid uid, Guid workspaceId)

   at Terrasoft.Core.SchemaManager`1.CreateSchemaItem(Guid packageUId, String name, TSchemaManagerSchema parentSchema, Boolean extendParent, UserConnection userConnection)

   at Terrasoft.Core.SchemaManager`1.CreateDesignSchema(UserConnection userConnection, Guid parentSchemaUId, Guid packageUId, Boolean extendParent)

   at Terrasoft.Core.SchemaManager`1.Terrasoft.Core.ISchemaManager.CreateDesignSchema(UserConnection userConnection, Guid parentSchemaUId, Guid packageUId, Boolean extendParent)

   at Terrasoft.WebApp.WorkspaceExplorerModule.CreateSchema(String managerName, Guid packageUId, IDictionary`2 extraParameters)

   at Terrasoft.WebApp.WorkspaceExplorerModule.OnTreeAddMenuItemClick(Object sender, AjaxEventArgs e)

   at Terrasoft.UI.WebControls.Controls.ComponentAjaxEvent.OnEvent(Object sender, AjaxEventArgs e)

   at Terrasoft.UI.WebControls.Controls.Observable.FireAsyncEvent(String eventName, ParameterCollection extraParams)

   at Terrasoft.UI.WebControls.Controls.ScriptManager.RaisePostBackEvent(String eventArgument)

   at Terrasoft.UI.WebControls.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)

   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)



Form:

    submitAjaxEventConfig: {"config":{"viewStateMode":"include","extraParams":{"tag":"","ManagerName":"SourceCodeSchemaManager"}}}

    __EVENTTARGET: ScriptManager

    __EVENTARGUMENT: AddSourceCodeSchemaMenuItem|event|Click

    __VIEWSTATEFIELDCOUNT: 37

    __VIEWSTATE0:

engineer7,

для детального анализа Вашего кейса необходим доступ к сайту с ошибкой. Направьте нам его, пожалуйста, на почтовый ящик support@bpmonline.com (параметры для входа/удаленного подключения или обезличенный бекап БД)

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

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



Нашел информацию по этой ссылке:https://academy.terrasoft.ru/documents/technic-sdk/7-12/dataservice-cht…

Тут именно тот код:

//------------------------------------------------------------------------------

// Экземпляр класса запроса.
var selectQuery = new SelectQuery()
{
    // Название корневой схемы.
    RootSchemaName = "Contact",
    // Коллекция колонок запроса.
    Columns = new SelectQueryColumns()
};
// Выражение, задающее тип колонки [[ФИО].
var columnExpressionName = new ColumnExpression()
{
    // Тип выражения — колонка схемы.
    ExpressionType = EntitySchemaQueryExpressionType.SchemaColumn,
    // Путь к колонке.
    ColumnPath = "Name"
};
// Конфигурирование колонки [Name]. 
var selectQueryColumnName = new SelectQueryColumn()
{
    //Заголовок.
    Caption = "ФИО",
    // Направление сортировки — по возрастанию.
    OrderDirection = OrderDirection.Ascending,
    // Позиция порядка сортировки.
    OrderPosition = 0,
    // Выражение, задающее тип колонки.
    Expression = columnExpressionName
};
// Выражение, задающее тип колонки [Количество активностей].
var columnExpressionActivitiesCount = new ColumnExpression()
{
    // Тип выражения — вложенный запрос.
    ExpressionType = EntitySchemaQueryExpressionType.SubQuery,
    // Путь к колонке относительно корневой схемы.
    ColumnPath = "[Activity:Contact].Id",
    // Тип функции — агрегирующая.
    FunctionType = FunctionType.Aggregation,
    // Тип агрегации — количество.
    AggregationType = AggregationType.Count
};

//------------------------------------------------------------------------------

В данном случае, у меня к примеру нет заголовка "ФИО", у меня есть просто столбец "Name"("ФИО" в данном случае это есть то как будут отображаться полученные данные или это именно часть таблицы к которой я обращаюсь?)

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

"Exception thrown: 'System.Net.WebException' in System.dll"

 

Нравится

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

engineer7 пишет:

и ошибок он не выдает...

Защиту от CSRF атак выключили? Просто добавление токена не наблюдаю. Попробуйте до вызова 

using (var requestStream = selectRequest.GetRequestStream())

// Добавление CSRF-токена в заголовок запроса.
CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
string csrfToken = cookieCollection["BPMCSRF"].Value;
selectRequest.Headers.Add("BPMCSRF", csrfToken);

 

Указанный пример — это при работе с системой извне. Если просто в серверном коде получать данные из таблицы, см. тут.

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

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

Указанный пример — это при работе с системой извне. Если просто в серверном коде получать данные из таблицы, см. тут.

Если Вам действительн...

Александр, спасибо за ответ! 



В данном случае, меня интересует второй случай, когда нужно работать с удаленным сайтом по веб-сервисам, но дело в том, что сервер возвращает не 404(нет ответа) ошибку, а 403(проблемы с доступом).



Возможно такое что я не правильно заполняю конфигурирование запроса?

 

// Экземпляр класса запроса.

            var selectQuery = new SelectQuery()

            {

                // Название корневой схемы.

                RootSchemaName = "Contact",

                // Коллекция колонок запроса.

                Columns = new SelectQueryColumns()

            };



            // Выражение, задающее тип колонки [[ФИО].

            var columnExpressionName = new ColumnExpression()

            {

                // Тип выражения — колонка схемы.

                ExpressionType = EntitySchemaQueryExpressionType.SchemaColumn,

                // Путь к колонке.

                ColumnPath = "Name"

            };

            // Конфигурирование колонки [Name].

            var selectQueryColumnName = new SelectQueryColumn()

            {

                //Загловок.

                Caption = "",

                // Направление сортировки — по возрастанию.

                OrderDirection = OrderDirection.Ascending,

                // Позиция порядка сортировки.

                OrderPosition = 0,

                // Выражение, задающее тип колонки.

                Expression = columnExpressionName

            };

            // Выражение, задающее тип колонки [Количество активностей].

            var columnExpressionActivitiesCount = new ColumnExpression()

            {

                // Тип выражения — вложенный запрос.

                ExpressionType = EntitySchemaQueryExpressionType.SubQuery,

                // Путь к колонке относительно корневой схемы.

                ColumnPath = "[Activity:Contact].Id",

                // Тип функции — агрегирующая.

                FunctionType = FunctionType.Aggregation,

                // Тип агрегации — количество.

                AggregationType = AggregationType.Count

            };

            // Конфигурирование колонки [Количество активностей].

            var selectQueryColumnActivitiesCount = new SelectQueryColumn()

            {

                //Загловок.

                Caption = "",

                // Направление сортировки — по возрастанию.

                OrderDirection = OrderDirection.Ascending,

                // Позиция порядка сортировки.

                OrderPosition = 1,

                // Выражение, задающее тип колонки.

                Expression = columnExpressionActivitiesCount

            };

            // Добавление колонок в запрос.

            selectQuery.Columns.Items = new Dictionary<string, SelectQueryColumn>()

            {

                {

                    "Name",

                    selectQueryColumnName

                },

                {

                    "ActivitiesCount",

                    selectQueryColumnActivitiesCount

                }

            };

            // Сериализация экземпляра класса запроса на добавление в JSON-строку.

            var json = new JavaScriptSerializer().Serialize(selectQuery);

            // Преобразование строки JSON-объекта в массив байтов.

            byte[] jsonArray = Encoding.UTF8.GetBytes(json);

            // Создание экземпляра HTTP-запроса.

            var selectRequest = HttpWebRequest.Create(selectQueryUri) as HttpWebRequest;

            // Определение метода запроса.

            selectRequest.Method = "POST";

            // Определение типа содержимого запроса.

            selectRequest.ContentType = "application/json";

            // Добавление полученных ранее аутентификационных cookie в запрос на получение данных.

            selectRequest.CookieContainer = AuthCookie;

            // Установить длину содержимого запроса.

            selectRequest.ContentLength = jsonArray.Length;

            using (var requestStream = selectRequest.GetRequestStream())

            {

                requestStream.Write(jsonArray, 0, jsonArray.Length);

            }

            ResponseStatus status = null;

            // Получение ответа от сервера. Если аутентификация проходит успешно, в свойство AuthCookie будут

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

            using (var response = (HttpWebResponse)selectRequest.GetResponse())

            {

                using (var reader = new StreamReader(response.GetResponseStream()))

                {

                    // Десериализация HTTP-ответа во вспомогательный объект.

                    string responseText = reader.ReadToEnd();

                    status = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<ResponseStatus>(responseText);

                }

            }

 

В данном случае, конфигурирование колонки [name], каким образом нужно заполнять поле "Caption"?

Так как по умолчанию стояла запись "ФИО", я ее удалил, так как в таблице "Contact" у меня нет данного столбца.

Так же я не очень хорошо понимаю значение выражения, задающее тип колонки (количество активностей).

Пример, по которому пытаюсь получить доступ к БД: https://academy.terrasoft.ru/documents/technic-sdk/7-12/dataservice-cht…

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

Попробовал с исходным кодом:

// ----------------------------------------------

using System;

using System.Text;

using System.IO;

using System.Net;

using System.Collections.Generic;

using Terrasoft.Nui.ServiceModel.DataContract;

using Terrasoft.Core.Entities;

using System.Web.Script.Serialization;

using Terrasoft.Common;

namespace DataServiceSelectExample

{

    class Program

    {

        // Основной URL приложения bpm'online. Необходимо заменить на пользовательский.

        private const string baseUri = @"http://url";

        // Строка запроса к методу Login сервиса AuthService.svc.

        private const string authServiceUri = baseUri + @"/ServiceModel/AuthService.svc/Login";

        // Строка пути запроса SelectQuery.

        private const string selectQueryUri = baseUri + @"/0/DataService/json/SyncReply/SelectQuery";

        // Cookie аутентификации bpm'online.

        private static CookieContainer AuthCookie = new CookieContainer();



        // Метод выполняет аутентификацию пользователя.

        // Параметры:

        // userName — имя пользователя bpm'online,

        // userPassword — пароль пользователя bpm'online.

        private static bool TryLogin(string userName, string userPassword)

        {

            // Создание экземпляра запроса к сервису аутентификации.

            var authRequest = HttpWebRequest.Create(authServiceUri) as HttpWebRequest;

            // Определение метода HTTP-запроса.

            authRequest.Method = "POST";

            // Определение типа контента запроса.

            authRequest.ContentType = "application/json";

            // Включение использования cookie в запросе.

            authRequest.CookieContainer = AuthCookie;

            // Помещение в тело запроса учетной информации пользователя.

            using (var requesrStream = authRequest.GetRequestStream())

            {

                using (var writer = new StreamWriter(requesrStream))

                {

                    writer.Write(@"{

                        ""UserName"":""" + userName + @""",

                        ""UserPassword"":""" + userPassword + @"""

                    }");

                }

            }

            // Получение ответа от сервера. Если аутентификация проходит успешно, в свойство AuthCookie будут

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

            using (var response = (HttpWebResponse)authRequest.GetResponse())

            {

                if (AuthCookie.Count > 0)

                {

                    return true;

                }

            }

            return false;

        }

        // Главный метод приложения.

        static void Main(string[] args)

        {

            // Если выполнение аутентификации неудачно, приложение завершает работу.

            if (!TryLogin("login", "password"))

            {

                Console.WriteLine("Ошибка аутентификации!");

                return;

            }

            // Экземпляр класса запроса.

            var selectQuery = new SelectQuery()

            {

                // Название корневой схемы.

                RootSchemaName = "Contact",

                // Коллекция колонок запроса.

                Columns = new SelectQueryColumns()

            };

            // Выражение, задающее тип колонки [[ФИО].

            var columnExpressionName = new ColumnExpression()

            {

                // Тип выражения — колонка схемы.

                ExpressionType = EntitySchemaQueryExpressionType.SchemaColumn,

                // Путь к колонке.

                ColumnPath = "Name"

            };

            // Конфигурирование колонки [Name].

            var selectQueryColumnName = new SelectQueryColumn()

            {

                //Загловок.

                Caption = "ФИО",

                // Направление сортировки — по возрастанию.

                OrderDirection = OrderDirection.Ascending,

                // Позиция порядка сортировки.

                OrderPosition = 0,

                // Выражение, задающее тип колонки.

                Expression = columnExpressionName

            };

            // Выражение, задающее тип колонки [Количество активностей].

            var columnExpressionActivitiesCount = new ColumnExpression()

            {

                // Тип выражения — вложенный запрос.

                ExpressionType = EntitySchemaQueryExpressionType.SubQuery,

                // Путь к колонке относительно корневой схемы.

                ColumnPath = "[Activity:Contact].Id",

                // Тип функции — агрегирующая.

                FunctionType = FunctionType.Aggregation,

                // Тип агрегации — количество.

                AggregationType = AggregationType.Count

            };

            // Конфигурирование колонки [Количество активностей].

            var selectQueryColumnActivitiesCount = new SelectQueryColumn()

            {

                //Загловок.

                Caption = "Количество активностей",

                // Направление сортировки — по возрастанию.

                OrderDirection = OrderDirection.Ascending,

                // Позиция порядка сортировки.

                OrderPosition = 1,

                // Выражение, задающее тип колонки.

                Expression = columnExpressionActivitiesCount

            };

            // Добавление колонок в запрос.

            selectQuery.Columns.Items = new Dictionary<string, SelectQueryColumn>()

            {

                {

                    "Name",

                    selectQueryColumnName

                },

                {

                    "ActivitiesCount",

                    selectQueryColumnActivitiesCount

                }

            };

            // Сериализация экземпляра класса запроса на добавление в JSON-строку.

            var json = new JavaScriptSerializer().Serialize(selectQuery);

            // Преобразование строки JSON-объекта в массив байтов.

            byte[] jsonArray = Encoding.UTF8.GetBytes(json);

            // Создание экземпляра HTTP-запроса.

            var selectRequest = HttpWebRequest.Create(selectQueryUri) as HttpWebRequest;

            // Определение метода запроса.

            selectRequest.Method = "POST";

            // Определение типа содержимого запроса.

            selectRequest.ContentType = "application/json";

            // Добавление полученных ранее аутентификационных cookie в запрос на получение данных.

            selectRequest.CookieContainer = AuthCookie;

            // Установить длину содержимого запроса.

            selectRequest.ContentLength = jsonArray.Length;

            // Помещение JSON-объекта в содержимое запроса .

            using (var requestStream = selectRequest.GetRequestStream())

            {

                requestStream.Write(jsonArray, 0, jsonArray.Length);

            }

            // Выполнение HTTP-запроса и получение ответа от сервера.

            using (var response = (HttpWebResponse)selectRequest.GetResponse())

            {

                // Вывод ответа в консоль.

                using (StreamReader reader = new StreamReader(response.GetResponseStream()))

                {

                    Console.WriteLine(reader.ReadToEnd());

                }

            }

            // Задержка выполнения приложения.

            Console.ReadKey();

        }

    }

}

// ----------------------------------------------

На вот этом месте возникает ошибка:

// ----------------------------------------------

// Выполнение HTTP-запроса и получение ответа от сервера.

            using (var response = (HttpWebResponse)selectRequest.GetResponse())

Сложно сказать, не видя конкретных запросов и ответов на них в Fiddler.

Может, логин и пароль не подходит.

В той статье есть ссылки на скачивание готовых файлов примеров программы на C#. Возможно, с ними заработает. 

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

Это и есть код из той статьи(https://academy.terrasoft.ru/documents/technic-sdk/7-12/dataservice-cht…), единственное что я заменил, это логин и пароль. Они в свою очередь верны, так как вызывается метод tryLogin до вызова SelectRequest, и ошибок он не выдает...

engineer7 пишет:

и ошибок он не выдает...

Защиту от CSRF атак выключили? Просто добавление токена не наблюдаю. Попробуйте до вызова 

using (var requestStream = selectRequest.GetRequestStream())

// Добавление CSRF-токена в заголовок запроса.
CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
string csrfToken = cookieCollection["BPMCSRF"].Value;
selectRequest.Headers.Add("BPMCSRF", csrfToken);

 

Варфоломеев Данила,

Большое спасибо, вопрос решен! Проблема была именно в этом!

Видимо, пример из справки не актуализировали для поддержки CSRF в последних версиях.

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

Добрый день!

Возник такой вопрос, если пользователь добавил к примеру к себе в аккаунт фотографию, данная фотография находится в БД, каким образом можно скачать фотографию через c# на локальную машину с удаленного сервера? 



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



На сайте помимио экспорта в excel файлы текста нашел только экспорт настроек(css, js ..), есть ли такая возможность скачать информацию вообще? 

Нравится

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

В базе они хранятся в таблицах вроде ContactFile, AccountFile и т.д.

Скачать можно точно так же, как это делает браузер по нажатию пользователя: послать GET на адрес вроде:

http://адрес_сайта/0/rest/FileService/GetFile/e9eafee9-c4e4-4793-ad0a-003bd2c6a9b4/935b6ecb-3509-4c8a-bc7e-03ab0661da24

Тут первый GUID — ID схемы ContactFile (видно в URL, если её открыть в дизайнере), второй — ID записи в таблице.

В ответ придёт сам файл.

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

 

В базе они хранятся в таблицах вроде ContactFile, AccountFile и т.д.

Скачать можно точно так же, как это делает браузер по нажатию пользователя: послать GET на адрес вроде:

http://адрес_сайта/0/rest/FileService/GetFile/e9eafee9-c4e4-4793-ad0a-003bd2c6a9b4/935b6ecb-3509-4c8a-bc7e-03ab0661da24

Тут первый GUID — ID схемы ContactFile (видно в URL, если её открыть в дизайнере), второй — ID записи в таблице.

В ответ придёт сам файл.

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

 

Александр, большое спасибо! 

В данном случае "rest/FileService/GetFile" это имеющийся сервис у bpm или собственный сервис? 

engineer7 пишет:

это имеющийся сервис у bpm

Да. Это базовый сервис работы с файлами. 

Также, если надо будет дёргать картинки из профилей контактов/контрагентов, то придётся лезть в местную "помойку" с изображениями:

[адрес сайта]/img/entity/hash/SysImage/Data/[id записи из SysImage]

Данила, понял Вас, большое спасибо!

Показать все комментарии
РасширенныйФильтр
7.10
studio

Добрый день, коллеги, поделитесь решением вопроса:

  1. Создал справочник 
  2. Создал модуль унаследованный от "Конфигурационный раздел базового справочника ( UIv2 )"
  3. Удалил унаследованный грид, и определил грид "зебра".
  4. Добавил фильтр по датам, по аналогии как в активностях

Вопрос: подскажите, метод добавления расширенного фильтра, по аналогии как и в разделах?

Нравится

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

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

Показать все комментарии
обновление_7.x
7.10
sales_enterprise

Добрый день!

В процессе обновления с версии 7.10.0 на версию 7.10.1 произошла ошибка:

Executing SQL Script: tsp_CreateClusteredPrimaryKeyIndexes.sql

ERROR:An exception occurred while executing a Transact-SQL statement or batch.

   at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType)

   at bpmOnlineUpdaterCLI.ScenarioStepInvokeSQL.ExecuteSqlScript(String connectionString, String query)

   at bpmOnlineUpdaterCLI.ScenarioStepInvokeSQL.Execute()

   at bpmOnlineUpdaterCLI.UpdateScenario.ExecuteAllSteps()

 

В папке с логами (Terrasoft.WebApp\DesktopBin\WorkspaceConsole\Log) по этой ошибке ничено нет.

 

При повторном запуске обновления (бд не откатывалась) обновление завершилось.

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

Executing SQL Script: DropOldViews.sql

Executing SQL Script DropOldViews.sql completed successful

Нравится

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

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

Направьте на support@bpmonline.com все логи обновления <app>\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\Log

И результат выполненного скрипта на стороне БД после неуспешного обновления <app>\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\InstallPackages\Scenario\CreateClusteredPrimaryKeyIndexes.sql

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

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

Имеется стандартный справочник с кастомной страницей реестра. 

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

Подскажите метод реализации.

 

Нравится

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

А можете перефразировать, что именно вы хотите? Не могу понять, что вы хотите сделать

Наверное лучше я опишу все свои действия, что бы лучше понять мою цель:

1. Создал вьюху на SQL

2. Создал объект в БПМ с именем точь-в-точь как и в п.1

3. Накидал столбцов в объекте из п.2 точь-в-точь как и в п.1

4. В свойствах объекта из п.2 ("ВСЕ") поставил птЫчку "Представление в базе данных"

5. Получил справочник в BPM с наполнением данных из вьюхи п.1. Страница отображения справочника - базовая, а значит с возможностью редактировать поля и с отображением всех кнопок типа "Добавить"

6. Решил сделать "по-феншую" - создал свою страницу с параметром "Родительский объект" = "Конфигурационный раздел базового справочника (UIv2)"

7. Удалил кнопку "Добавить"

8. Определил цвет отображения кнопки "Закрыть" - "Terrasoft.controls.ButtonEnums.style.BLUE"

9. Удалил унаследованный DataGrid

10. Определил свой DataGrid

    {

        "operation": "insert",

        "name": "DataGrid",

        "parentName": "DataGridContainer",

        "propertyName": "items",

        "values": {

            "itemType": Terrasoft.ViewItemType.GRID,

            "listedZebra": true,

            "activeRow": {"bindTo": "ActiveRow"},

            "collection": {"bindTo": "GridData"},

            "isEmpty": {"bindTo": "IsGridEmpty"},

            "isLoading": {"bindTo": "IsGridLoading"},

            "primaryColumnName": "Id",

            "sortColumn": {"bindTo": "sortColumn"},

            "sortColumnDirection": {"bindTo": "GridSortDirection"},

            "sortColumnIndex": {"bindTo": "SortColumnIndex"},

            "needLoadData": {"bindTo": "needLoadData"}

        }

    }

Суть вопроса: данная страница имеет Фильтр с одной возможностью "Добавить условие". 

Интересует возможность добавления "Перейти в расширенный режим" или отображение фильтра по датам, как это реализовано в разделе "Активности".

Пытался в п.6. "Родительский объект" = "Базовая схема раздела (NUI)" - получаю необходимый результат, но сама страница некорректно себя ведет при отображении данных. Видимо там много чему нужен "remove", 

однако недостаточно информации чему именно...

Терещенко Алексей,

Попробуйте добавить фильтры как в Активности:

			init: function() {
				this.callParent(arguments);
				this.initFixedFiltersConfig();
			},
			initFixedFiltersConfig: function() {
				var fixedFilterConfig = {
					entitySchema: this.entitySchema,
					filters: [
						{
							name: "PeriodFilter",
							caption: this.get("Resources.Strings.PeriodFilterCaption"),
							dataValueType: this.Terrasoft.DataValueType.DATE,
							startDate: {
								columnName: "UsrDate", //Поле по которому хотите сделать фильтр дат
								defValue: this.Terrasoft.startOfWeek(new Date())
							},
							dueDate: {
								columnName: "UsrDate", //Поле по которому хотите сделать фильтр дат
								defValue: this.Terrasoft.endOfWeek(new Date())
							}
						}
					]
				};
				this.set("FixedFilterConfig", fixedFilterConfig);
			},

 

Литвинко Павел,

Подскажите в какую часть кода необходимо добавить данный код? в 

methods?

Литвинко Павел,

Отлично!!! Спасибо большое! Получилось!

И все таки - возможность добавления "Перейти в расширенный режим" - актуально. Может знает кто как это реализовать?

Тут похожий вопрос решается созданием страницы, унаследованной от страницы раздела с некоторыми доработками. И при открытии лукапа показывает окно раздела, на который он ссылался.

Показать все комментарии
LDAP
синхронизация
7.10
Ninja Forms

Добрый день!

На странице настройки синхронизации с LDAP одно из обязательных полей [Уникальный идентификатор пользователя]. По умолчанию заполняется значением ObjectSid. У меня возник вопрос: значения данного атрибута из AD хранятся где-нибудь в системе BPM Online? Если да, то в каком объекте и в каком поле. Насколько я понял, данные о пользователе AD хранятся в системе в объекте LDAPElement.

Нравится

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

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

Верно, это значение хранится в таблице LDAPElement - колонка LDAPEntryId.

Антон Малий,

Антон, добрый день! А подскажите, поле LDAPEntryDN в каком случае заполняется и как настроить его заполнение, если оно пустое?

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

В LDAPEntryDN хранится полный путь к пользователю в AD. Оно заполняется автоматически при синхронизации. Пустым оно не должно быть, так как по этому пути BPM ищет пользователя в AD.

Показать все комментарии
ProcessEngineService
web-сервисы
Basic authentication
7.10
service_enterprise

Добрый день!

Интересует несколько вопросов, связанных с использованием web-сервисов:

1) Доступна ли  basic авторизация  для ProcessEngineService.svc а так же для кастомных конфигурационных сервисов? 

2) И если 1- да, то как правильно передать параметры авторизации?

Использую вебсервис так:

http://site/0/ServiceModel/ProcessEngineService.svc/RunProcess



{"parameterValues":

[

{"name":"Title","value":"TestValue1"},

{"name":"Description","value":"TestValue2"},

{"name":"Action","value":"TestValue3"}

],

"schemaUId":"AF7E3F40-0EFA-431A-94AA-4DEEFFE16E59",

"schemaName":"UsrCaseIntegrationProcess"}

 

Нравится

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

С авторизацией разобрался

Появился новый вопрос - как вернуть результат выполнения процесса. Как проавильно прописать в POST запрос ResultParameterName

Бакалов Павел Вячеславович,

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

Примеры запроса есть тут: https://academy.terrasoft.ru/documents/technic-sdk/7-12/web-servis-proc…

 

Tsopa,

Да, процесс компилируемый. Руководствуясь данной инструкции удалось выполнить процесс, передать параметры и получить результат используя метод GET. Но в инструкции написано, что так же можно использовать метод POST. Но у меня не вышло это сделать - процесс выполнился, но параметры в него не попали и результат соответственно не вернулся. Нет ли примеров POST запросов к методу Execute ?

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

Александр, спасибо конечно, но это метод RunProcess, который я привел в самом начале своего поста. А меня интересует вызов метода Execute, так как в нем есть возможность вернуть результат выполнения процесса в виде параметра процесса.

Бакалов Павел Вячеславович,

POST запрос к методу Execute  не рекомендуется отправлять, поскольку  операция устарела, вместо этого стоит отправлять запрос /RunProcess.

Но если необходимо отправить POST запрос к Execute это можно сделать следующим образом: 

schemaName - эта название схемы процесса, который необходимо запустить

https://[site]/0/ServiceModel/ProcessEngineService.svc/[schemaName]/Execute

пример Header: 

Content-Type: application/json

BPMCSRF: BgsjByc16fsEZfuAr/CxDO

Cookie: BPMLOADER=vuhtzmo2wh2mxgb1amggorf2; .ASPXAUTH=FFF4F....; BPMCSRF=BgsjByc16fsEZfuAr/CxDO;

пример body: 

{}

 

как Вы решили проблему Basic авторизации?

См. тут. А вообще, базовую не рекомендуют, вот её сравнение с Cookies.

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

Добрый день!

На кастомной странице редактирования в БП разместил обычную деталь с карточкой редактирования (наследует от Базовая схема детали с реестром). На onRender карточки повесил метод updateDetails(). Однако при добавлении записи в деталь обновления не происходит. Добавленная запись отображается в гриде только после настройки колонок. Подскажите, пожалуйста, как решить проблему обновления грида детали.

Нравится

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

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

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

Александр, добрый день!

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

subscriber пробовали повесить?

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

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

Пробовал, не попадает в отладчике в метод, указанный в subscriber.

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

"DepositInFinApplicationDetail": {
	"schemaName": "snGoldDepositDetail",
	"filter": {
		"masterColumn": "Id",
		"detailColumn": "Id"
	},
	"filterMethod": "goldDetailFilter",
	"subscriber": {
		"methodName": "updateGoldDetail"
	}
},

goldDetailFilter: function() {
	var finApplication =  this.get("Id");
	var goldType = ""
	var filterGroup = new this.Terrasoft.createFilterGroup();
	filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
	filterGroup.add("DepositFilter", this.Terrasoft.createColumnFilterWithParameter(
			this.Terrasoft.ComparisonType.EQUAL, "[snDepositInFinApplication:Deposit:Id].FinApplication.Id", finApplication));
	filterGroup.add("DepositTypeFilter", this.Terrasoft.createColumnFilterWithParameter(
			this.Terrasoft.ComparisonType.EQUAL, "[snDepositInFinApplication:Deposit:Id].Deposit.Type.Id", this.goldTypeId));
	return filterGroup;
},

	updateGoldDetail: function() {
				var detailId = this.getDetailId("DepositInFinApplicationDetail");
				this.sandbox.publish("UpdateDetail", {
					reloadAll: true
				}, [detailId]);
	},

 

Может, вообще убрать дополнительный код, оставить только стандартную логику. В обычных разделах всё ведь работает.

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

Александр, дополнительная логика нужна для реализации бизнес-логики.

Бизнес-логику можно реализовать и на уровне объекта, серверной логикой.

Показать все комментарии
7.10
бизнес-процесс
Задание-сценарий
EmailMessageMultiLanguage
studio
FeatureToggle

Добрый день.

Процесс -> Задание сценарий содержит некий код:

if (UserConnection.GetIsFeatureEnabled("EmailMessageMultiLanguage"))

{

    некий код...

}

else

{

    некий код...

}

При запуске данного процесса всегда отрабатывает ветка "else".

Не могу понять что за параметр "EmailMessageMultiLanguage". В системных настройках по коду ничего найти не удалось... 

В профиле пользователя так же ничего похожего не обнаружил.

Нравится

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

Это Механизм отключения функциональности Feature Toggle. По ссылке написано, как менять значение пользовательскими средствами и где оно хранится в базе.

Конкретно по EmailMessageMultiLanguage на странице включения параметров нет никаких пояснений. Но, очевидно, если его включить, то тут и в других местах выполнение пойдёт по верхней ветке.

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

Спасибо, действительно пройдя по адресу [Адрес приложения]/0/Nui/ViewModule.aspx#BaseSchemaModuleV2/FeaturesPage

попал на некую страницу добавления функциональности и возможностью вкл/выкл этой функциональности. К большому удивлению запись с кодом "EmailMessageMultiLanguage" я не обнаружил. Теперь понятно, почему отрабатывает ветка else.

У меня на тестовом сайте 7.12 Sales Enterprise она есть, выключена. Возможно, зависит от версии.

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