Всем привет, прошу помощи в вопросе кастомизации страницы авторизации.

Задача переопределить действие по нажатию на кнопку "Войти", дело в том, что по мимо CRM у нас есть внутренние продукты компании, хотелось бы сделать общий интерфейс входа для пользователя. Пользователь тыкает на "Вход", а ему список существующих продуктов.

Блок авторизации представлен: viewContainer, но не понятно где он генерируется

 

Подскажите куда копать?

 

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

Нравится

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

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

Кастомизировал в итоге с помощью jQuery, просто и быстро получилось

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

Добрый день!

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

select 

(case  when [key] like 'columns%' then replace(replace([key],'Columns.',''),'.Caption','') else '' end),

Value

 from SysLocalizableValue

where SysSchemaId in (select id from SysSchema where Name='ContactAddress')

and ([key] Like 'Columns%')

and SysCultureId='1A778E3F-0A8E-E111-84A3-00155D054C03'

order by (case when [key] like 'columns%' then replace(replace([key],'Columns.',''),'.Caption','') else '' end)

но столкнулась с проблемой наследования. данный запрос мне возвращает только 1 строку - Contact, так как остальные поля наследуются из Address.

как можно получить итоговый список полей сущности с учетом всех изменений из разных пакетов?

 

Нравится

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

Можно посмотреть поля в таблице базы через системные таблицы:

SELECT  t.name AS [Table Name], c.name AS [Column Name], value AS [Extended Property]
FROM sys.extended_properties AS ep
INNER JOIN sys.tables AS t ON ep.major_id = t.object_id 
INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id
WHERE class = 1 and t.name = 'ContactAddress'
AND CAST(value AS VARCHAR) LIKE 'ru-RU|%'

 

 

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

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

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

Доброго времени! 



У меня интересная задача)

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



Задача:

1. Поставить фильтр (допустим выдало 100 записей)

2. Нажать "Выбрать все" (показано что выбрано 100)

3. Снять 1 галочку (показано что выбрано 99)

4. Нажать "Изменить ответственного"



Методы:

var selectedRows = this.getSelectedItems();

var selectedRows = this.get("SelectedRows");



Возвращают Id только отображенных записей (29)!



Как получить ожидаемые 99 Id записей?

Нравится

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

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

Когда загружается реестр посылается один запрос (который оптимизирован и загружает не все записи, а 30 – если у вас 100000 записей то не будет накладки по производительности). Когда вы нажимаете «Выбирать все», то не произойдет загрузки всех записей(оптимизация описанная выше), а отправится отдельный запрос который просто вернет количество и обновит название кнопки (при дебаге в network это видно). Чтобы добиться требуемого результата нужно самостоятельно посылать запрос.

Тоже столкнулся с такой проблемой. Самое простое решение, которое я нашел - это использовать функцию, возвращающую запрос на получение записей для экспорта:

                    var esq = this.getExportToExcelEsq();

                    esq.rowCount = -1;

                    esq.getEntityCollection(function (response) {...}, this);

Можно посмотреть, как она работает и заменить её своей. Результатом запроса будут все выделенные записи (99 в Вашем случае).

 

Поправка: в 7.12.2 функция, возвращающая запрос, переехала, теперь так:

var esq = this.getGridDataInitializedEsq(true);

esq.rowCount = -1;

...

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

Добрый день.

Где-то в темах проскакивало взаимодействие php и odata. Решил сделать свой запрос на добавление контакта, запросы кросс-доменные, пример . Авторизация проходит(code=0), но данные в bpm не добавляются. в iis 500 ошибка.





<?php
$url = "http://localhost:8001/ServiceModel/AuthService.svc/Login";
$requestData["UserName"] = "User";
$requestData["UserPassword"] = "Password";
$jcres = json_encode($requestData);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $jcres);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($jcres))
);
$result = curl_exec($ch);
echo $result;
curl_close($ch);

//Запрос odata
$urlGetCardInfo = "http://localhost:8001/0/ServiceModel/EntityDataService.svc/ContactCollection";
$requestDataService["Name"] = "123";
$jcres = json_encode($requestDataService);
$ch = curl_init($urlGetCardInfo);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
$file = "cookie.txt";
$lines = file( $file );
$str =  $lines[6];
$prefix = "BPMCSRF";
$index = strpos($str, $prefix) + strlen($prefix);
$token = trim(substr($str, $index));
echo $token;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json;odata=verbose',
      'BPMCSRF:' .  $token,
        'Content-Length: ' . strlen($jcres))
);
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
curl_close($ch);

echo $jcres;

echo "
";
echo var_dump($result);
?>

 

Куки:

# Netscape HTTP Cookie File

# http://curl.haxx.se/docs/http-cookies.html

# This file was generated by libcurl! Edit at your own risk.

#HttpOnly_localhost    FALSE    /    FALSE    0    BPMLOADER    fnmuevt2z4bpsxmyookyy3g3

#HttpOnly_localhost    FALSE    /    FALSE    0    .ASPXAUTH    BCF0752E4949BD3D6EC56072B957CB5C1B9517D2F7C19B9C3F70E0BBA6ED4BD46FE55B0E90853EF5E88CD83EE9AA689C5595517AA5B7F7DF913873919C440E5ED7607A04F4C0C14D61216682067F860D1EC6DC3872811FFAF710CA7F8FC8A8B0C0F77A146D40447FBEE6629EC37546E4C7B08DAFFC8EA37F2F5D7AF522D1816B16A968A0BAAC80738D874AEE3C2A0A9730B7C7155430F3B033C6A934F56AF04FF659C62C191822CC743FEA070757841FF4C73B7FC67EFA5CE4C4B430CFA8E798B085E84BAD37C56D80FFBB9244AC5ED83DCF8052F30D442637EB668DD93B2A4C591382EC09F3A0CE8CB18C56BD327745A983E70A9D3F911439AE4173AF04849AA84713883CEB089AB5D9F89A324ADA0FC02CDA670B07FBCD0B10670FD9F6ADC8D58B7DB2E9A27CD49FE0DCB9E21AEDAD76EA95134024BACE86C9BDFAEB2A30FDC177927BFFF25A16AC80A3B37084D0D4067DBAFD992CB95E14BEC365E5CB26BA82CB393B

localhost    FALSE    /    FALSE    0    BPMCSRF    Ao/SdrXnBoquQZZ39643ue

#HttpOnly_localhost    FALSE    /    FALSE    1526629837    UserName    83|117|112|101|114|118|105|115|111|114 

Нравится

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

Добрый день, Евгений!

Вы пробовали создать такой-же контакт используя Fiddler? Тут есть инструкция: https://academy.terrasoft.ru/documents/technic-sdk/7-12/vypolnenie-zaprosov-po-protokolu-odata-s-pomoshchyu-fiddler-0

Также, хочу обратить внимание что если на сайте ключена Csrf-защита то куки стоит формировать следующим образом: Но это явно не причина ошибки, так как в результате бы вернулся статус код 403.

 

Через Fiddler

отправляю post http://localhost:8001/0/ServiceModel/EntityDataService.svc/ContactColle…

Accept: application/atom+xml

Content-Type: application/atom+xml;type=entry

Cookie: BPMCSRF=fBo.TKVbav4GK31oDrDQTu; BPMLOADER=c3wb3plqvydzx1rgfsy5mgst; .ASPXAUTH=CEE35EFBF41088EA3F2835F9509497C89CF69A9E856192FCC0C9CF74DD91D9A5D5AAF37048F2326F4AFC1C9FE051CE91DF622A5345F143761E4D6B42668043C96506AAED141C4FA97802D4992C3DF49F134750F147D6320D2899561B45FC468F66D531151A067788195CED937DD3192FAA0B3A804F01BBDBEA0C0BDFECB36277C3FABC5CE02474B1B5C21317D3FD2ED64F946504935FD19D09598CB65640AE332309D198200160CF53715714FB16DAD11B4B8FAB76204FCAA1A99B1F77D99E1AD804197342D8D3F7B8604BE9BCFC559029ED353C877190547E03C8F51AA780665361BF5EBE144A7A0E1E0911507B2027E71F7BE3D452AF4AEF6A74B2777546230FBB1236F088074EB2C7345157666D71E0D437489538D4F4D4CBFF82B36721B105CE2A96458E01AF0A9E010579B42532DF808B9EA0C9B3272C83283E74BF037C02029FBF65C2A84F3B25275F48F3DDA4C868C4EE;

BPMCSRF: fBo.TKVbav4GK31oDrDQTu;

Host: localhost:8001

Content-Length: 597

 

Тело 

<?xml version="1.0" encoding="utf-8"?>

<entry xmlns="http://www.w3.org/2005/Atom">

    <content type="application/xml">

        <properties xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">

            <Title xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">Title</Title>

            <Notes xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">mail@mail.ru</Notes>

            <OwnerId xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">410006E1-CA4E-4502-A9EC-E54D922D2C00</OwnerId>

        </properties>

    </content>

</entry>

 

Возвращает 403 ошибку, пользователю прав доступа на операции к Odata и объекту Contact для доступа к внешним сервисам дал.

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

Кстати проверил через Fiddler запрос, который указан в первичном тексте вопроса на php

POST http://localhost:8001/0/ServiceModel/EntityDataService.svc/ContactColle… HTTP/1.1

Content-Type: application/json;odata=verbose

Cookie: BPMCSRF=uUgOi6S8fuXqmug7vK2Ixe; BPMLOADER=lbe4eo5r33xib5qzd4ilx0bo; .ASPXAUTH=9630392393DE5EA7C5C41399383A5C111A47ABD6DCE480276852590B03DBD938B354ACB488248FB6B2DE737C412A6CAD487A526C576BCAEA8D48B4751FB045606900009B81DCBACC54C4802571A4AF339B05F101E2993A6AD6D93708FC79FCDACAB6F7411105FC0E2A2D9AB123968243E02990824FC08B401999FFF8F5A7A1240AB69D56771E64F9495EEAB17F094FAB101016326A99081644034ABA4C64F797E974EC2D833037F7282F04E46D6FA8F04FFC85BFD9030D39916F99F082C122CEFE53EFF585FD40E913474A949B9E38601E86C0C4C921541B4082B0E9732B8645F73E508304ABFBC92D7BB581858040760374F25368001F2DEF1CE2458A0B4DC81352952FBBAEE05F59E4C9D330198361B929FF0A4D5392D4956CB7F46CD6B97D3D909A92A37D3FCA07AAD00396BB38F911BAA1DEEA23E53395A7C6D88009B148F468F2D237EF132055A71C8ABD923EA22460A916B38F17DE2DDB202622EEF54424D06F7B;

BPMCSRF: uUgOi6S8fuXqmug7vK2Ixe

Host: localhost:8001

Content-Length: 16

{"Name": "1233"}

Запись создается удачно. Почему тогда через php не работает? есть пример post на php для odata ?

Получилось.

$url_1 = "http://localhost:8001/0/ServiceModel/EntityDataService.svc/ContactCollection/";

$requestDataService["Name"] = "123";
$jcres = json_encode($requestDataService);
$ch5 = curl_init($url_1);
curl_setopt($ch5, CURLOPT_COOKIEFILE, 'cookie.txt');

//curl_setopt($ch5, CURLOPT_HTTPHEADER, array(
//    'Accept: application/json;odata=verbose'));

curl_setopt($ch5, CURLOPT_COOKIEJAR,'cookie.txt');
curl_setopt($ch5, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch5, CURLOPT_POSTFIELDS, $jcres);
curl_setopt($ch5, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch5, CURLOPT_HEADER   ,FALSE);
curl_setopt($ch5, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json;odata=verbose',
        'BPMCSRF: ' .$token,
        'Content-Length: ' . strlen($jcres))
);

$result5 = curl_exec($ch5);
curl_close($ch5);
Показать все комментарии

Добрый день.

В документации bmponline написано, что 

В bpm’online реализована поддержка протокола SAML 2.0, благодаря чему возможно использование любого провайдера идентификации, совместимого с SAML 2.0.

Но детально описана интеграция только с ADFS и oneLogin. Где и как можно почитать про интеграцию с другими сервисами по протоколу SAML 2.0, может быть есть примеры?

 

Нравится

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

Добрый день, 



Планируется отдельная статья по настройке SSO с GSuite. На текущий момент выполняли проверку работы SSO с GSuite - базовые кейсы входа работают корректно. На будущие версии планируется доработать поддержку Just In Time User Provisioning, т.к. GSuite отдает SAML атрибуты несколько иначе, чем другие провайдеры. Вы можете обратиться в поддержку за инструкцией по настройке, пока данная статься не опубликована в Академии.

Nikolay Kostruba,

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

Добрый день, 



Верно, планируется описание настроек для работы SSO с GSuite.



Уточните, пожалуйста, что подразумеваете под разработкой кастомных провайдеров SSO. Сейчас в продукте есть поддержка SAML 2.0. Благодаря этому bpm'online умеет выступать в роли Service Provider при SAML SSO сценариях. Вопрос в том как реализовать свой SAML 2.0 Identity Provider (сервис аналогичный GSuite, OneLogin, Azure AD и пр.) или как добавить в bpm'online еще другой провайдер идентификации (не SAML, а другой протокол, например, OAuth или OpenID)?

Nikolay Kostruba,

Добрый день.

Я пока разбираюсь в вопросе, верхнеуровнево задача сделать возможность авторизации через аккаунт google.

Насколько я успел разобраться, только GSuit, OneLogin поддерживают SAML, а авторизация Google работает через OAuth 2.0. Для того, что бы решить мою задачу необходимо реализовать в bpmonline работу с OAuth 2.0. Вопрос - правильно ли я понял? Как это сделать, есть ли примеры? 

В целом - верно, GSuite и OneLogin поддерживают SAML и могут быть интегрированы с коробочным продуктом без доработок. Поддержка OAuth2.0 в продукте есть в планах roadmap. Я уведомлю команду развивающий этот блок о запросе. Возможно, сможем порекомендовать какое-то решение, если Вы подробнее будущий сценарий работы.

На текущий момент не совсем понятно какие именно кейсы хотите реализовать. Это будет вход в bpm'online с использованием Google учетной записи? Если да, то не совсем понятно как вы планируете их администрировать (заводить/удалять), т.к. если учетная запись не входит в GSuite, то вы не можете ими управлять. Или хотите получать доступ к ресурсам Google от имени пользователя bpm'online? Например, доступ к файлам Drive или Календарю (здесь тоже применим OAuth).

Nikolay Kostruba,

Для начала нам нужен вход уже зарегистрированных пользователей, которых настроит вручную администратор через саму bpm, в дальнейшем возможно понадобится автоматическая регистрация с урезанными правами. А когда примерно планируется сделать поддержку OAuth 2.0 штатными средствами?

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

Рекомендуем Вам обратиться в службу технической поддержки по адресу support@terrasoft.ru для более детальной консультации и примерами реализации.

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

Добрый день! Реализовал деталь по статье из академии. Множественное добавление работает. Но заметил странный баг. После добавления нескольких записей, открываю на редактирование одну из них, а в ней пусто (вообще ничего не заполено, хотя я вижу, что данные заполнены в детали), затем закрываю. Повторно открыть какую-либо запись на редактирование уже не получается - в консоль валится ошибка (скрин). Если обновить страничку карточки, то таких проблем нет. Могу открывать любые записи в детали на редактирование, данные в ней тоже подтягиваются.

По ошибке - в базе запись с таким id есть!

 

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

Нравится

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

Ради эксперимента, вставьте вот такой метод на страницу

loadAddedRecords: function(collection) {
	this.reloadGridData();
},

и отпишитесь, сработало или нет.

Дмитрий, здравствуйте!

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

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

Ради эксперимента, вставьте вот такой метод на страницу

loadAddedRecords: function(collection) {
	this.reloadGridData();
},

и отпишитесь, сработало или нет.

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

Какая-то магия - сработало! Спасибо!!!

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

Всем привет)

Подскажите, как сделать значение текстового поля гиперссылкой?

Есть вот такое поле:

	{
		"operation": "insert",
		"name": "STRINGb4b8f8bf-771b-4032-bd24-86256f8f1cb9",
		"values": {
			"layout": {
				"itemType": this.Terrasoft.ViewItemType.HYPERLINK,
			     "style": "t-btn-wrapper t-btn-text t-btn-style-green actions-button-margin-right",
				"colSpan": 24,
				"rowSpan": 1,
				"column": 0,
				"row": 10,
				"layoutName": "ProfileContainer"
 
			},
			"itemType": 
			"bindTo": "UsrEmailTemplateLink",
			"enabled": true
		},
		"parentName": "ProfileContainer",
		"propertyName": "items",
		"index": 10
	},

Как значение этого поля сделать гиперссылкой?

Нравится

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

Роман, здравствуйте!

Пример кода, которым можно реализовать поле-ссылку, недавно рассматривалось на Community, там же есть и пример реализации - https://community.terrasoft.ru/questions/pole

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

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

Изучили ряд тем на сообществе по данному вопросу и попробовали воспроизвести кейс из данной темы:

https://community.terrasoft.ru/questions/anonimnaa-autentifikacia-vnesn…

Сделали всё в точности как описано в примере, включая настройку web-конфигов. 

Сервис:

namespace Terrasoft.Configuration
{
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Data;
 using System.Linq;
 using System.Security;
 using System.ServiceModel;
 using System.ServiceModel.Web;
 using System.ServiceModel.Activation;
 using System.Web;
 using Terrasoft;
 using Terrasoft.Common;
 using Terrasoft.Common.Json;
 using Terrasoft.Core;
 using Terrasoft.Core.DB;
 using Terrasoft.Core.Entities;
 using Terrasoft.Core.Store;
 using Newtonsoft.Json;
 
 using Terrasoft.Web.Common;
 
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UsrGreetingService : BaseService //,System.Web.SessionState.IReadOnlySessionState
    {
 
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "Hello", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        public string TestHello()
        {
            return "Hello!!!!!!!!!!!!!!!!!";
        }
 
 
        [OperationContract]
        [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Xml)]
        public string TestHelloXml()
        {
            return "Hello!!!!!!!!!!!!!!!!!";
        }
 
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        public string TestPostJson()
        {
            return "Hello!!!!!!!!!!!!!!!!!";
        }
 
 
 
 
 //       private UserConnection _userConnection;
  /// <summary>
  /// </summary>
// private UserConnection UserConnection {
//  get {
//   return _userConnection ?? (_userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection);
 //  }
// }
    }
}

 

В результате попробовали отправить запрос через POSTMAN

1) Если указать метод GET без авторизационных Cookie, то всё работает

Как пример можно получить результат запроса по ссылке:

http://93.188.21.108:2022/0/ServiceModel/UsrGreetingService.svc/Hello

 

2) Указываем метод POST без авторизационных Cookie, то получаем 403:

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

 

 

Если же добавить к запросу(метод POST) авторизационные Cookie, то всё работает...

Коллеги, прошу подсказать, что именно делаем не так?

 

Нравится

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

Добрый день, 

Проверьте включена ли на сайте CSRF-защита. В внешнем и внутреннем Web.config есть атрибут UseCsrfToken, содержит значение true то можно поступить следующим образом: 

1. Изменить значение UseCsrfToken в Web.config и WebApp/Web.config на 

&lt;add key="UseCsrfToken" value="false" /&gt;

2. В хедере запроса отправлять Csrf-токен. Следующим образов (в случае безавторизационного сервиса, авторизацитонные куки можно не отправлять):

Tsopa,

Спасибо большое! Решили проблему получением и отправкой

авторизацитонных куков!

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

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



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





1. В BaseCommunicationDetail существует биндинг поля enabled на метод getCommunicationEnabled, но метод getCommunicationEnabled не вызывается.

2. Сможем ли мы в теории посмотреть в таком методе на параметр новизны записи?

Нравится

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

Добрый день, Егор!

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

Этот метод достаточно сложно переопределить, так как он находится в BaseComunicationViewModel.

Проще переопределить метод getCommunicationItemViewConfig в BaseCommunicationDetail в котором модифицировать поле enabled у редактируемого поля.

А чтобы определить новый это объект создается или нет, можно в этой же детали добавить атрибут или переменную булеовго типа и переопределить метод addItem, в котором переменную (например, isNewItem) менять на true, тогда в getCommunicationItemViewConfig смотря на эту переменную вы определите дальнейшее поведение.

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

Всем доброго времени суток. Версия 7.11.

Вопрос - возможно ли в элементе "Вопрос пользователю" бизнес-процесса вывести в тексте рабочую ссылку? Попытка задать ссылку в формуле с помощью html-тегов:

"<a href='ya.ru' target='_blank'>Яндекс</a>"

пока привела только к такому результату:

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

Ещё лучше было бы вывести ссылку в тексте, например "Перейти на Яндекс?" А вообще изначальная идея - формировать ссылку на заданную запись в самой же системе, "Что делать с " + [#Продукт#] + "?"

Нравится

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

Денис, здравствуйте!

К сожалению, заголовок Вопроса пользователю не поддерживает html форматирование. Вы можете указать необходимую ссылку в подсказке пользователю. Тогда нажав на значок (i) пользователю откроется всплывающая подсказка с рабочей ссылкой.

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

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

"<a href = https://yourwebsite.bpmonline.com/0/Nui/ViewModule.aspx#CardModuleV2/Pr…"+[#Читать данные 1.Первый элемент результирующей коллекции.Id#].ToString()+">LinkBody</a>"

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

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