Примеры публикаций¶
Примеры публикации SQL View¶
Пример 1¶
Представление SQL View выбирает: - номера задач, в которых хранятся договоры; - номер задачи в справочнике контрагентов, к кому относится договор (связка через lookup); - имя клиента; - ID категории с договорами (subcatid); - ID ДП типа lookup в категории договоров, ссылающегося на контрагента (extparamid).
CREATE VIEW [dbo].[Contracts] as
SELECT taskid as Num_Contract, selectedtaskid as Num_Client, extparamvalue as Client_Name
FROM ExtParamValues
WHERE taskid in (select taskid from tasks where subcatid=117) and extparamid=352
Пример 2:¶
Представление SQL View выводит параметры по задаче в единую таблицу. Данные об оплатах по договорам.
CREATE VIEW [dbo].[Example] as
SELECT epv1.extparamvalue NoДоговора, epv2.DateTimeValue Дата, epv4.extparamvalue Плательщик, epv3.moneyvalue СуммаКОплате
FROM tasks t
LEFT JOIN extparamvalues AS epv1 ON t.taskid=epv1.TaskID
LEFT JOIN extparamvalues AS epv2 ON t.taskid=epv2.TaskID
LEFT JOIN extparamvalues AS epv3 ON t.taskid=epv3.TaskID
LEFT JOIN extparamvalues AS epv4 ON t.taskid=epv4.TaskID
WHERE t.subcatid=16 AND epv3.extparamid=114 AND epv1.ExtParamID=188 AND epv2.extparamid=242 AND epv4.extparamid=402
где t.subcatid — ID категории с оплатами;
epvN.extparamid — поле в таблице extparamvalues, где хранятся ID параметров.
Примеры публикации пакетов действий
Публикация html-страницы
Пример: нужно предоставить внешним пользователям доступ к определенным данным из приложения "Первая Форма". Для наглядности эти данные можно опубликовать в виде HTML-страницы. 1. В разделе "Публикации" создайте публикацию пакета действий с типом запроса GET.
- Пакет действий должен содержать смарт-действие "HTTP-ответ". Смарт-выражение должно возвращать полный текст HTML-страницы с форматированием и данными.
Пример хранимой процедуры
В результате внешние пользователи смогут просматривать данные в удобном виде (адрес страницы образуется из адреса приложения, к которому добавляется URL опубликованного пакета действий).
ALTER PROCEDURE \dbo.\page_html\ AS BEGIN SET NOCOUNT ON; declare @res nvarchar(max) = ''; set @res = '<table>' + '<thead><tr><th>Задача</th><th>Номер</th></tr></thead>'; set @res += '<tbody>' + ( select STUFF((SELECT N' <tr><td>' + TaskText + '</td><td>' + CAST(TaskID as varchar) + '</td></tr>' FROM TasksInSubcat4241Denormalized FOR XML PATH, TYPE).value(N'.[1\', N'nvarchar(max)'), 1, 1, N'')] ) + '</tbody>'; set @res += '</table>'; select @res; END
ℹ️ Чтобы данные могли просматривать внешние пользователи, не авторизованные в "Первой Форме", надо включить анонимный доступ к объекту публикации.
Публикация произвольных данных¶
Пример: опубликованный пакет действий возвращает значения всех ДП в задаче. Публикация Пакет содержит единственное действие — HTTP ответ. Опубликованный смарт-пакет Номер задачи выделяется из входящего параметра \@eventParam0, имеющего вид строки в формате JSON. Смарт-выражение Индикатор для ДП на карточке задачи
С помощью js и css вставок и публикаций на карточку задачи можно выводить различные индикаторы, которые дают дополнительную информацию для пользователей. Например, руководитель подразделения планирует работу своих сотрудников на неделю вперёд (управление по методу Agile, планирование недельных спринтов). Чтобы понимать, какие задачи могут быть выполнены в течение следующей недели (т.е. какие задачи войдут в следующий спринт), руководителю нужно видеть, сколько часов трудозатрат он может запланировать на всех сотрудников (т.е. общий объём трудозатрат в спринте), сколько часов он уже запланировал и сколько часов ещё осталось свободных. Для этого на карточку задачи выводится индикатор — свободные часы (общие часы). JS-вставка
$(window).on('MTFMainLoadFinished', function() {
var team = new ExtParam ( 11 )
var sprint = new ExtParam ( 22 )
team.change ( function () { createAlertBar (); });
sprint.change ( function () { createAlertBar (); });
// подготовка индикатора — текст, цвет
function drawAlertBar ( hh, av ) {
var label = new ExtParam(11).label()[0]
var alertLabel = document.getElementById('teamAlertLabel');
if (!alertLabel) {
var alertLabel = document.createElement('span');
alertLabel.id = 'teamAlertLabel';
alertLabel.classList.add('alert-label');
label.appendChild(alertLabel);
}
// цвет индикатора (стили описаны в css-вставке)
if (hh >= 0) {
alertLabel.classList.remove('danger');
alertLabel.classList.add('success');
} else {
alertLabel.classList.remove('success');
alertLabel.classList.add('danger');
}
// текст индикатора
alertLabel.innerHTML = hh + ' (' + av + ')';
}
// вызов публикации
function createAlertBar () {
var purl = '/app/v1.2/api/publications/action/getteamhoursov?Util=80' + '&Version=' + sprint.val () + '&Team=' + team.val ()
$.ajax({
method: "GET",
url: purl,
})
.done( function( hh ) {
drawAlertBar ( hh.diff, hh.avail );
});
}
createAlertBar ();
});
select dbo.fn_ov_getTeamHours (
JSON_VALUE ( @eventParam0, '$.queryString.version'),
JSON_VALUE ( @eventParam0, '$.queryString.team'),
JSON_VALUE ( @eventParam0, '$.queryString.util')
)
где fn_ov_getTeamHours — скалярная функция, которая возвращающая строку формата JSON с тремя значениями: avail — общее число рабочих часов на команду, planned — число запланированных часов, diff — оставшиеся свободные часы, т.е. разность между avail и planned. Изменение параметров задачи по кнопке из портального блока
Пример: в портальном блоке отображается список задач — мероприятий. Для каждой задачи есть кнопка "Записаться". По нажатию кнопки пользователь, нажавший на нее, добавляется в соответствующую задачу в ДП "Выбор пользователей". 1. Настроим портальный блок Smart Html со списком задач из категории. Кнопкам назначим общий класс btnapply и уникальные ID, равные номеру задачи.
{{#smart999}}
<br>{{description}} <button class="btnapply" id="{{taskID}}">Записаться</button>
{{/smart999}}
где 999 — ID смарт-выражения, отбирающего задачи в список. 2. Добавим на портал JS-вставку, которая назначает обработчик события для кнопок "Записаться". ID пользователя, нажавшего на кнопку, получаем с помощью функции getSessionUserInfo().
const info = getSessionUserInfo();
(window.firstForma.portal.block(111)).onLoaded(function () {
function apply(taskid) {
var surl = '/app/v1.2/api/publications/action/apply?taskid='+ taskid + '&userid=' + info.responseJSON.data.userId;
return new Promise(resolve => {
let xhr = new XMLHttpRequest();
xhr.open('GET', surl, true);
xhr.send();
alert('Вы записаны')
});
}
var arr = document.getElementsByClassName('btnapply');
for (var i = 0; i < arr.length; i++) {
document.getElementById(arr[i.]id).addEventListener('click', function(taskid) {
apply(this.id);
});
}
});
где 111 — ID портального блока, apply — alias публикации, которую мы создадим дальше, а btnapply — класс, который назначен кнопке 3. Настроим публикацию пакета действий, которая будет добавлять ID текущего пользователя в ДП "Выбор пользователей" в соответствующей задаче. Не забудьте настроить доступ к публикации. В публикацию должны передаваться два параметра — ID задачи и ID пользователя. Публикация
Пакет действий должен включать смарт-действие "Изменить значение ДП", а также обязательное для публикации смарт-действие "HTTP-ответ". Пакет действий В смарт-действии "Изменить значение ДП" в ДП "Выбор пользователей" добавляется ID пользователя, нажавшего на кнопку. Смарт-действие "Изменить значение ДП" Смарт-выражения сохраняются в формате TSQL.
Смарт-выражение для номера задачи использует параметр публикации taskid:
select JSON_VALUE(@eventParam0, '$.queryString.taskid')
Смарт-выражение для значения ДП использует параметр публикации userid:
select '{"Users":{"Added":[' + JSON_VALUE(@eventParam0, '$.queryString.userid') + '}}]'
Загрузка файла в ДП с помощью API¶
Для загрузки файла в ДП с помощью API необходимо настроить публикацию пакета действий со следующими параметрами: Тип публикации: Пакет действий Тип запроса: POST Тип содержимого: multipart/form-data
Не забудьте настроить доступ к публикации. В поле Объект должен быть выбран предварительно созданный общий смарт-пакета с включенной опцией "Для публикаций". Обратите внимание на особенности публикуемых смарт-пакетов Пакет действий должен включать смарт-действие "Отправить комментарий", в котором должны быть заданы параметры "Текст" и "Задача". Параметры пакета действий В качестве текста в редакторе смарт-выражения задается контекстный параметр "JSON параметров опубликованного объекта"
Настройки смарт-выражения На сгенерированный в публикации URL необходимо отправлять API-запрос.