Небходимо на редактируемом окне создать поле (LookupDataControl).Т.е нужен выпадающий список названий. Данные находятся в таблице на связанном сервере (linked server). Поэтому создала источник данных со строкой соединения(ADODataset).

Но, в ADODataset нет поля типа "поле справочника", чтобы указать конкретную колонку из таблицы как колонку для отображения. Версия 3.2.0.90

Как можно иначе реализовать?

Спасибо.

Нравится

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

"Марина Карапетян" написал:Как можно иначе реализовать?

Можно сделать в основной базе view, которая тянет данные из linked server.
А затем к этой view создать обычные сервисы таблицы (название должно совпадать, в базе не сохранять), запроса и датасета.

Здравствуйте Александр. Спасибо.

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

Добрый день!
После закрытия обращения, пользователю приходит письмо с просьбой оценить качество работы. Выбрав оценку, он попадает на веб-сервис CaseRatingManagementService.svc с надписью "Thank you for raiting".
Немного разобравшись, я понял что этот логотип храниться в таблице SysSettingsValue (SysSettingsId = 59EE36CC-2790-456E-896A-469ACC434BA1) в формате varbinary(max) в виде "0x89504E470D0A1A0A0000000D494..."
Мне необходимо заменить логотип спасибо за оценку, как я могу это сделать?

Нравится

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

Это hex строка, вот вам декодер из хекс строки в картинку:
http://tomeko.net/online_tools/hex_to_file.php?lang=en

там же есть декодер обратно:
http://tomeko.net/online_tools/file_to_hex.php?lang=en
снимаете обе галочки, кормите нужный файл, добавляете в начало 0x
и подменяете в бд :wink:

Спасибо Максим!

Максим Шевченко,Молчанов Антон Сергеевич,

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

Update SysSettingsValue SET [Value] = '0х.... ' where [SysSettingsId] = '59EE36CC-2790-456E-896A-469ACC434BA1'

 

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

Доброго времени суток, есть вопрос следующего характера
У меня есть расширяющий модуль для FileDetailV2
Внутри него я получаю контент PDF документа (контент строкой)
Каким образом мне этот контент передать на FileApiService модуль в метод Upload что бы загрузить этот файл?
Если я загружаю руками документ то получаю в консоли POST запрос на

https://testDomain.bpmonline.com/0/rest/FileApiService/Upload?fileapi14996709535744&totalFileLength=47386&fileId=file_id&mimeType=application%2Fpdf&columnName=Data&fileName=20846491.pdf&parentColumnName=Document&parentColumnValue=parent_document_value&entitySchemaName=DocumentFile

И также интересно как в JS получить текущий entitySchemaName?

Нравится

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

Сформируйте аналогичный запрос со значениями колонок в url, и с данными файла в теле запроса средствами js.
Ответ на второй вопрос:

"Максим Шевченко" написал:file_id

Спаибо за Ваш ответ
Но в url есть значение file_id откуда мне его взять если файл еще не создан?

"Nickstery" написал:Но в url есть значение file_id откуда мне его взять если файл еще не создан?

Это просто новый рандомный гуид по которому далее файл можно будет получить, создать новый гуид можно следующим образом:
https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascri…

"Максим Шевченко" написал:
Nickstery пишет:

Но в url есть значение file_id откуда мне его взять если файл еще не создан?

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

https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript

С формированием параметра понятно
Каким образом отправлять контент файла в теле запроса, это form-data по ключу определенному или передаеться как binary data?
Если я формирую запрос в Postman (приложение для отправки запросов) как приведено ниже

http://joxi.ru/V2VKJBwuxeDROA

Я получаю следующий ответ:

http://joxi.ru/L21bq0kh8Jx3dA

Есть где-то дока какой ендпоинт/модуль какие есть методы, и какие поля нужно отправлять что бы загрузить документ?
Не совсем понятно каким образом проиходит передача самого документа

Я набросал кусок кода, который получает контент файла, формирует BLOB и пытаеться отправить его на FilApiService Только я получаю ту же ошибку

window.console.log("Try to grab the file content");
var http = new XMLHttpRequest();
http.open("get", "https://b981fab7.ngrok.io/getPDF", true);
http.responseType = "arraybuffer";
http.onload = function(e) {
    if (this.status === 200) {
        var uInt8Array = new Uint8Array(this.response);
        var i = uInt8Array.length;
        var binaryString = new Array(i);
        while (i--)
        {
             binaryString[i] = String.fromCharCode(uInt8Array[i]);
         }
        var data = binaryString.join("");
 
        var http2 = new XMLHttpRequest();
        http2.open("post", "/0/rest/FileApiService/Upload?fileapi14998570381414&totalFileLength=47386&" +
        "fileId=*****&mimeType=application/pdf&columnName=Data" +
        "&fileName=20846491.pdf&parentColumnName=Document" +
        "&parentColumnValue=***&entitySchemaName=DocumentFile", true);
        http2.onload = function(e) {
             window.console.log("UPLOAD FILE OPERATION DONE");
             window.console.log(e);
        };
        http2.send(new Blob([data]));
 
        }
    };
http.send();

Разобрался:
Суть в том что при расширении FileDatailV2 (логично) мы унаследуем и методы оринильного модуля.
Можно не использовать FileApiService и не генерировать 100500 параметров а просто обойтись готовым решением, как это делает аплоад документа юзер, который находится в CRM.
Достаточно использовать FileDetailV2 -> onFileSelect метод и из строчного контента сгенерировать window.File
Пример как я это реализовал ниже:

window.console.log("Try to grab the file content");
var http = new XMLHttpRequest();
http.open("get", "https://b981fab7.ngrok.io/getPDF", true);
http.responseType = "blob";
var parent = this;
http.onload = function(e) {
    if (http.readyState === 4) {
    var blob = http.response;
    parent.onFileSelect([new window.File([blob], "UPLOADED.pdf")]);
    }
};
http.send();

Таким образом не нужно думать как приатачить документ в таблицу после его загрузи, это все делает модуль автоматически

У меня задача как раз стоит чтобы загрузить файл, но не из интерфейса приложения, а сторонним приложением. И мне необходимо использовать FileApiService. Как правильно им пользоваться? Может кто нибудь показать рабочий пример кода?

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

Установил фидлер и при включенном захвате трафика выходит такая ошибка:

Зато удалось в консоли разработчика увидеть запрос отправленный на сервер:

https://my.domain.com/0/rest/FileApiService/Upload?fileapi1606730904835…

При попытке отправить этот запрос из POSTMAN, сервер возвращает ошибку: 

400 Bad request

Может, что-то не то с заголовками или content type содержимого, не знаю.  А если прямо в браузере отловить?

Отловил запрос прямо в браузере, вот:

https://my.domain.com/0/rest/FileApiService/Upload?fileapi1606730904835…

Но при попытке отправить этот запрос из POSTMAN, сервер возвращает ошибку: 

400 Bad request

Можно попробовать сравнить запрос с нормально работающим, поискать в чём отличия в содержимом.

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

Так в том и вопрос, какой он нормально работающий запрос. Я ни как не могу его найти. Могли бы вы предоставить пример рабочего запроса? Буду очень признателен.

Нормальный запрос идёт из браузера при добавлении файла на деталь. Но Вы, видимо, его и так уже видели:

Request URL: https://0987561-se-m-se-demo.creatio.com/0/rest/FileApiService/Upload?fileapi16068281951725&totalFileLength=42738&fileId=0015222a-e192-4e2d-a305-7029653b76eb&mimeType=image%2Fpng&columnName=Data&fileName=test.png&parentColumnName=Contact&parentColumnValue=eba7839a-6dff-430f-8325-fb8e02546348&entitySchemaName=ContactFile
Request Method: POST
Status Code: 200 
Remote Address: 40.91.213.136:443
Referrer Policy: strict-origin-when-cross-origin
cache-control: private
content-type: application/json; charset=utf-8
date: Tue, 01 Dec 2020 13:16:21 GMT
server: Microsoft-IIS/10.0
status: 200
x-aspnet-version: 4.0.30319
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-powered-by: ASP.NET
:authority: 0987561-se-m-se-demo.creatio.com
:method: POST
:path: /0/rest/FileApiService/Upload?fileapi16068281951725&totalFileLength=42738&fileId=0015222a-e192-4e2d-a305-7029653b76eb&mimeType=image%2Fpng&columnName=Data&fileName=test.png&parentColumnName=Contact&parentColumnValue=eba7839a-6dff-430f-8325-fb8e02546348&entitySchemaName=ContactFile
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,uk;q=0.8,ru;q=0.7
bpmcsrf
content-disposition: attachment; filename=test.png
content-length: 42738
content-range: bytes 0-42737/42738
content-type: image/png
cookie: BPMSESSIONID=oq1w3q0l1yhedqm43aayja1a; _ga=GA1.2.656850260.1571905584; UserName=83|117|112|101|114|118|105|115|111|114; BPMLOADER=ytih30doaflbq4opdaauindd; _gid=GA1.2.1302014581.1606819455; .ASPXAUTH=0008CA5627819C22386A7FD7673D990C515D14E16AAA7C3E962C321AD5B73C8A2E390A6A6F5AE4DDD258B39ED90AE52BB05619534187DF76BBB1D1FF11B042E75619D72724CFE8E56619EEA9AC684DD352340A7212E60D621B3347E1116DE823140E48AE7FF68CE26734B92A9535C2C69D4BF9A6DE071595ECA44536D4EDF49958CBE863D46ABF8E86B2BAB87496310E5A25A03B4037A458240E6FAB1DFA93DE265821214B9C08D57C5CF3D2376E197C94AC1CF59BE9DA24BE2415465689C40BB1306488AB986D58ADCA8764F99566A0BCBB108248B7FB62678B541F509BC80525781C299A0A5FE2EB0F6997868942D0BD146D40C89B36E12CC760D7C05709175E01F26E6B67BF67846BE78BFE1E583A830ACFFF907A58B713DED3C10FC4E422C74DF27E792BADD1138259551A290978A88414B1CDC15E000D4A44B70BD9E296B74C0601BD3DDD315F2722EC95987F77427E73EB062C147611AD43A0DEE6B967AB07C932
origin: https://0987561-se-m-se-demo.creatio.com
referer: https://0987561-se-m-se-demo.creatio.com/0/Nui/ViewModule.aspx
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
x-requested-with: XMLHttpRequest
fileapi16068281951725: 
totalFileLength: 42738
fileId: 0015222a-e192-4e2d-a305-7029653b76eb
mimeType: image%2Fpng
columnName: Data
fileName: test.png
parentColumnName: Contact
parentColumnValue: eba7839a-6dff-430f-8325-fb8e02546348
entitySchemaName: ContactFile
‰PNG

 
IHDRТA7fœsRGB®ÎégAMA±üa

 

Если его, то видел. Но повторить и выполнить самому, для начала из POSTMAN, ни как не получается из-за ошибки 400 Bad request.

Руслан, можно в Fiddler сравнить все заголовки правильного и неправильного запросов, может чего-то не хватать.

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

Всем доброго времени суток.
Часто возникает проблема с веб-сокетами(веб-сокеты родные) следующего характера:
На сервере развернут сайт (версия 7.10), имеется несколько рабочих пространств. Во всех рабочих пространствах, кроме Default, веб-сокеты работают корректно. Помогает перезагрузка IIS, но через некоторое время снова появляется аналогичная проблема.

Может кто-то сталкивался с подобным и знает как решить?

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

Нравится

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

Поведение очень напоминает постоянную перезагрузку приложения. Для установления факта посмотрите логи приложения, при необходимости включите расширенное логирование сайта (настройка в файле log4net.config).
Далее зайдите в приложение. В логах будет сообщение, что версия приложения (из ядра) не совпадает с данными, указанными в таблице SysWorkspace (поле Version).
Нужно убедиться, что сайт использует уникальную БД Redis. Далее возможны два варианта решения:
1) Скомпилировать приложение, чтобы увеличить версию в SysWorkspace
2) Произвести update поля Version в таблице SysWorkspace для того, чтобы уравнять версии. На какое значение необходимо обновить данные таблицы, можно узнать из логов приложения.

Спасибо за информацию. Но не могли бы Вы подсказать в каком файле log4net.config (один находится в Terrasoft.WebApp\DesktopBin\MessagingService\Config\ второй лежит в корне) настроить расширенное логирование и какую настройку включить?

Кирилл, логирование настраивается в файле, который в корне папки Terrasoft.WebApp

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

Добрый день!

Подскажите, пожалуйста, как нужно настроить блок "Открыть страницу редактирования" таким образом, чтобы на коммуникационной панели в центре уведомлений отображалась данная активность.
Сейчас настройки блока:
Открыть странице автоматически = нет,
Показывать в расписании = да

Нравится

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

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

Возможно ли решить эту задачу с помощью БП?

Например, параллельно запускать два действия: открыть страницу редактирования и добавить новую запись(объект уведомление).

В БП добавила блок добавить новую запись, в объекте указала "Уведомления". Процесс завершился. Уведомление не появилось на панели коммуникаций.

Проверила в БД таблицу Reminding, запись об уведомлении была добавлена.
Подскажите,как правильно работать с уведомлениями, как их создавать из БП.

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

Здравствуйте, подскажите, как реализовать возможность добавления на страницу компонентов "на лету".

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

И вообще возможно ли такая гибкая логика

Спасибо!

Нравится

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

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

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

Есть несколько вопросов по кейсам 7.10
1. Как сделать что бы после выполнения всех шагов автоматически переходило в следующую стадию и меняло стадию в карточке.
2. При нажатии на следующую стадию при невыполнении текущей в нее не переходит(верно) но первый шаг запускается(неверно)
пример: есть 2 задачи на 2 стадии, нажали на 3 стадию(там первым шагом бп на изменение Отв.) она не запустилась, но Отв изменился и осталось 2 задачи с второй стадии.
3. Если есть кейсы то поле стадий должно бить недоступным для редактирования или совсем скрытым?

Нравится

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

Добрый день всем.
Есть необходимость отобразить пользователю окна с вариантами действий. За основу взял оно добавления тэга. Создал модуль. Страницу. Но при открытии окна получаю ошибку TypeError: Cannot read property 'extendParent' of undefined.
Начал разбирать логику на примере того же тега, в процессе генерации окна последовательно вызываются методы this.requireSchema,
this.initSchemaCustomAttributes,
this.initSchemaResources,
this.initSchemaEntitySchema,
this.initSchemaProfile,
this.initSchemaStructure,
this.extendSchemaWithStructure,
this.addSchemaToHierarchy,
.....

метод initSchemaStructure возвращает структуру TagModuleSchemaStructure. Вопрос где она описывается?
Для моей схемы initSchemaStructure никакой структуры не возвращает и при дальнейшей работе возникает ошибка.

Нравится

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

Здравствуйте, Евгений.

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

Большое спасибо за пример.
Проблема была в типе страницы.

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

Коллеги, добрый день.
Подскажите каким образом можно привязать данные к гриду? Допустим есть ESQ, которая возвращает коллекцию. Что необходимо сделать, чтобы коллекция, возвращаемая запросом, отобразилась в гриде?

Нравится

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

Заполните результатом коллекции атрибут на который смотрит грид:

Подробнее реализацию можете посмотреть в схеме BaseGridDetailV2 на которую сделан скриншот выше.

Предположу что Вам необходимо результат ESQ а именно его result.collection
сохранить в атрибут соответствующего типа

...
"dataValueType": this.Terrasoft.DataValueType.COLLECTION,
"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
"isCollection": true
...

И уже собственно его "скармливать" в биндинг. (см.скриншот)

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

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

Нравится

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

Можете попробовать подменять профиль на нужный (см. метод getProfileColumns в GridUtilitiesV2) после чего делать reloadGridData()

Это означает, что у одного из пользователей должны быть обязательно добавлены нужные колонки? Звучит не очень надежно) Нельзя ли добавить колонки в Грид в момент выполнения действия?

Нет, не обязательно, обязательно должны быть колонки в БД, а я вам предлагаю в рантайме сохранять нужный вам json настроек колонок в профиль текущего пользователя, не воровать у кого-то, а формировать динамически, сохранять в бд, и релоудить грид.

"Максим Шевченко" написал:

Нет, не обязательно, обязательно должны быть колонки в БД, а я вам предлагаю в рантайме сохранять нужный вам json настроек колонок в профиль текущего пользователя, не воровать у кого-то, а формировать динамически, сохранять в бд, и релоудить грид.


Здравствуйте!
Делаю, как Вы сказали - в методе getProfileColumns добавляю в this.get("Profile").DataGrid.listedConfig конфигурацию новой колонки в json, перезагружаю данные в гриде, но конфигурация столбцов не меняется. Вы писали про сохранение в БД - каким образом это можно сделать?

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