Все довольно просто: есть чтение данных с режимом чтения = "Читать коллекцию записей". Имя элемента ReadDataUserTask1. Версия bpm 7.12.4, процесс не компилируемый, соответственно напрямую, как раньше к элементу не обратиться.

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

 Нужно использовать метод T Get<T>(string propertyPath), но возникает 2 проблемки:

1) Чему равен propertyPath? Точно не ResultCompositeObjectList - поскольку он выдаёт результат для режима чтения = "Читать коллекцию записей"

2) какой тип T использовать, Entity? Или какой-то другой? В аналогичной задаче удалось определить как получить массив элементов с колонками. Но там читали коллекцию записей.

var entities = Get<ICompositeObjectList<ICompositeObject>("ReadDataUserTask1.ResultCompositeObjectList");

 

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

var x01 = Get<object>("ReadDataUserTask1.DataSourceFilters");
var x02 = Get<object>("ReadDataUserTask1.ResultType");
var x03 = Get<object>("ReadDataUserTask1.ReadSomeTopRecords");
var x04 = Get<object>("ReadDataUserTask1.NumberOfRecords");
var x05 = Get<object>("ReadDataUserTask1.FunctionType");
var x06 = Get<object>("ReadDataUserTask1.AggregationColumnName");
var x07 = Get<object>("ReadDataUserTask1.OrderInfo");
var x08 = Get<object>("ReadDataUserTask1.ResultEntity");
var x09 = Get<object>("ReadDataUserTask1.ResultCount");
var x10 = Get<object>("ReadDataUserTask1.ResultIntegerFunction");
var x11 = Get<object>("ReadDataUserTask1.ResultFloatFunction");
var x12 = Get<object>("ReadDataUserTask1.ResultDateTimeFunction");
var x13 = Get<object>("ReadDataUserTask1.ResultRowsCount");
var x14 = Get<object>("ReadDataUserTask1.CanReadUncommitedData");
var x15 = Get<object>("ReadDataUserTask1.ResultEntityCollection");
var x16 = Get<object>("ReadDataUserTask1.EntityColumnMetaPathes");
var x17 = Get<object>("ReadDataUserTask1.IgnoreDisplayValues");
var x18 = Get<object>("ReadDataUserTask1.ResultCompositeObjectList");
var x19 = Get<object>("ReadDataUserTask1.ConsiderTimeInFilter");

Но ни один из них не наполнен полями объекта и их значениями.

 

 

У меня такой же вопрос

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

Добрый день! Не подскажу про элемент процесса "читать коллекцию", но для работы с коллекцией проще всего использовать такой код:

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "UsrCustom123");
esq.AddColumn("Id");
esq.AddColumn("Name");
 
var Filter1 = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", "zzz");
esq.Filters.Add(Filter1);
 
var EsqCollection = esq.GetEntityCollection(UserConnection);
	if (EsqCollection.Count>0) {
		foreach (var name in EsqCollection) {
          var param1 = name.GetTypedColumnValue<string>("Name");
          var param2 = name.GetTypedColumnValue<Guid>("Id");
         ///ваш код..
        }
    }

 

Получить и обработать коллекцию в интрпритируемом БП можно примерно так:

var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask.ResultCompositeObjectList");
var result = "";
foreach(var entity in entities) 
{
      var cityName = entity.GetTypedColumnValue<string>("Name");
}

 

Константин, я так понял вам нужно считать 1 запись, а не коллекцию?
Тогда можно просто поставить режим чтения "Читать коллекцию записей", "Читать первые 1 записей". Ну и дальше использовать коллекцию ResultCompositeObjectList

var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList");
var entity = entities.FirstOrDefault();

Так как, к сожалению, ReadDataUserTask1.ResultEntity всегда возвращает null для интерпретируемых процессов

Сидоров Александр В.,

Интересно как вы это поняли?  в начале первая строчка:

"Все довольно просто: есть чтение данных с режимом чтения = "Читать коллекцию записей". "

Добавить комментарий

Григорий Чех, далее в тексте автор говорит про одну запись

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

Добрый день!

Имеется унаследованная от "базовой схемы детали средств связи" деталь. Внутрь детали рядом с самим средством связи вставлены создаваемые вручную контейнеры (Terrasoft.Container) с чекбоксами (Terrasoft.CheckBoxEdit).
Задача: при полной отрисовки детали блокировать все чекбоксы кроме одного выбранного, если он есть, иначе не блокировать ничего. Решаю с помощью jquery на странице раздела. Т.к. не знаю, как поймать событие полной отрисовки детали (чтобы получить доступ к DOM), использую костыль в виде setTimeout. Как это событие можно отловить? 
И еще один вопрос: есть ли какое-то единое событие для перерисовки детали (детали перерисовывается при нажатии на кнопку "отмена" на странице, переходе между вкладками, сворачивании/разворачивании детали и т.д.). 

Возможно есть какой-то способ решения этой задачи кроме jQuery?

У меня такой же вопрос

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

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

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

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

Добрый день. 

выполнил вес шаги инструкции https://academy.terrasoft.ru/documents/common/7-10/kak-nastroit-integra… . Не могу понять почему не появляется трубка в BPM'Online  для осуществления звонков. как это происходит при интеграции между BPM'Online и webitel. Кто может подсказать что я упускаю. Или нужно что то настроить еще в BPMonline Messaging Service Install?

У меня такой же вопрос

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

Да, для интеграции с телефонией Infinity нужно ещё установить и настроить на своём сервере bpm'online Messaging Service. А если уже установили, обратите внимание на ремарку о https.

да я уже из https настройку делал и без. не появляется трубка для звонка. может что то еще нужно выполнить? нужно настройку самого  BPMonline Messaging Service делать? или дефолтных настроек достаточно? 

Если версия Infinity X, то её поддержку добавили совсем недавно и нужно вносить изменения в конфигах. Опубликованной инструкции ещё нет, обратитесь в службу поддержки.

да Infinity X

См. предыдущий ответ.

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

Задача: 

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

У меня такой же вопрос

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

В БП есть возможность указать запуск по сигналу при добавлении объекта или изминении определенного поля/полей объекта. Id этого объекта получает процесс как параметр стартового сигнала. Думаю это соответствует вашей задаче. Подробности смотри в документации по БП

 

 

 

В БП есть возможность указать запуск по сигналу при добавлении объекта или изминении определенного поля/полей объекта. Id этого объекта получает процесс как параметр стартового сигнала. Думаю это соответствует вашей задаче. Подробности смотри в документации по БП

 

 

 

Григорий Чех,

спасибо большое, то что нужно!

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

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

У меня такой же вопрос

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

Как работать с утилитой WorkspaceConsole, см. справку.

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

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

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

У меня такой же вопрос

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

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

 

Большое спасибо!

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

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

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: {&quot;config&quot;:{&quot;viewStateMode&quot;:&quot;include&quot;,&quot;extraParams&quot;:{&quot;tag&quot;:&quot;&quot;,&quot;ManagerName&quot;:&quot;SourceCodeSchemaManager&quot;}}}
    __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]

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

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

Добрый день.

подскажите как мне сделать выполнения определенного кода старте bpm'online, который регистрирует BPM'Online в определенном сервисе. И так же при выключении BPM'Online делает unregister.

У меня такой же вопрос

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

"при выключении BPM'Online" - это очень странная фраза, учитывая, что bpm-серверное приложение и всегда активно. Ну допустим, что все пользователи не будут бездумно жать на крест в браузере(я так понимаю тогда вообще не отследить), а будут разлогиниваться перед закрытием приложения(кто блин вообще так делает в 2018?)
1) logout в MainHeaderSchema в функции onExitMenuItemClick
2) при входе грузится ViewModuleWrapper и ConfigurationViewModule. Я думаю легче перегрузить wrapper(в нем меньше мусора)

Но, опять же, при такой архитектуре всё будет работать в "лабораторных" условиях: пользователь залогинился, НЕ обновляет никакие страницы, (скорее всего) не открывает доп вкладки (иначе происходит загрузка приложения с нуля, отработает теоретический register), перед закрытием браузера выходит из приложения.

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

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