Для некоторых сложных списков и отчётов приходится создавать View и объекты на их основе. Однако необходимо и учитывать права доступа на записи в этих объектах. 

Для этого предлагаю:

1. В свойстве "Режим использования" колонок объекта добавить значение (например, "Системные"). Колонка с таким свойством будет доступна в отчётах, фильтрации esq, в бизнес-процессах. Но будет недоступна в аналитике, настройке колонок в реестрах и деталях, в фильтрах в реестре. (Таким образом ещё облегчим пользователю интерфейс, убрав из фильтров и аналитики служебные колонки).

2. Добавить аналогичное свойство "Режим использования" для объектов. Кроме ограничения доступа, опять же облегчаем интерфейс пользователю, легко скрыв неиспользуемые объекты вообще

3. Позволить использовать VIEW (наряду с таблицами) для определения прав доступа на записи. Это позволит гибко настраивать права как для объектов на базе реальных таблиц (например, в зависимости от значений записи), так и позволит быстро и гибко (даже в зависимости от текущего времени, дня недели и температуры за бортом :) ) назначать права на записи объектов на основе VIEW

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

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

 

Благодарю за детальное описание идеи.

Передали ответственной команде разработки для реализации в будущих версиях.

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

Для некоторых сложных списков создали View и объекты на их основе. Но в этих списках необходимо так же распределить права на записи. Можно ли каким-то образом эти права определять так же в другом View? 

Нравится

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

Добрый день!

Можете уточнить в чем именно заключается проблема? Созданные объекты не отображаются в разделе "Права доступа на объекты", что бы можно было настроить для них права?

Sorotiuk Anna пишет:

Добрый день!

Можете уточнить в чем именно заключается проблема? Созданные объекты не отображаются в разделе "Права доступа на объекты", что бы можно было настроить для них права?

ЕщеСвернуть

Проблема в том, что View не хранит записи, а выбирает при каждом Select. Если включит права на объект, то нужно будет высчитывать и хранить эти права в таблице Sys....Rights. Но необходимо, чтобы система брала права не из таблицы, а из другого View

Владимир Соколов,

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

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

Посоветуйте, пожалуйста, документацию по работе с полем "справочник" на странице пользовательского раздела. Мне нужно получить это поле и в зависимости от его значения рассчитать другие поля. На моей среде используется устаревшая версия 7.15, в которой установка значений бизнес-правилами недоступна. Всё действие происходит на одной странице раздела без перехода по кейсам, поэтому реализация с помощью бизнес процесса не рассматривается, так же как реализация посредстом бизнес-правил. Интересует именно пользовательская реализация в коде страницы посредством JavaScript

Нравится

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

У меня работает таким образом

 

			onEntityInitialized: function(){
 
				this.on("change:CardStatus", function() {
				this.set("CardClosingReason", null);
				this.set("CardSuspendingReason", null);
		//	this.set("CardClosingReason", {value: null});
			}, this);
			},

 

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

У меня работает таким образом

 

			onEntityInitialized: function(){
 
				this.on("change:CardStatus", function() {
				this.set("CardClosingReason", null);
				this.set("CardSuspendingReason", null);
		//	this.set("CardClosingReason", {value: null});
			}, this);
			},

 

Oleg, большое спасибо, это то что надо. А где вы этому научились?

Может, где-то есть документация по работе с ExtJS в Creatio? Я обращался за материалам к террасофт, мне сказали, что не могут предоставить курсы/треннинг, охватывающие именно это. 

Где я могу узнать список всех возможных событий с примерами подписки на них? Если синтаксис this.on можно прочитать в туториалах по ExtJS, то аргументы "event":"sender" для Creatio я просто понятия не имею, где посмотреть. Заранее спасибо за ваш ответ

Гусейн Гулиев,

методом тыка, кучей проб и ошибок, а так же по крупицам собирая информацию на форуме.



ОГРОМНЕЙШЕЕ СПАСИБО тем, кто выклыдывает реальные примеры кода - это помогает гораздо больше, чем 1000 строк теории.

Oleg, то есть инструмент террасофт предоставили, а полную инструкцию к нему - нет? Это прям ну очень неприятно. Неужели вот совсем нигде нет прилично собранной инфы по фронту с использованием ExtJS и перечисления всех возможных событий каждого элемента поля и данным, которые из них можно извлечь?

Я правильно понимаю, что CardStatus в вашем примере - это код поля типа "справочник" на странице, верно? Который в diff указывается как bindTo?

 

О нет. Документации нет) Исходники, подсматривания в примеры, вотэтовотвсё. 

Немного помогает практикум по разработке на платформе. https://academy.terrasoft.ua/trainings

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

Добрый день.



Собственно, при попытке в мастере выбрать подобный объект, появляется следующее сообщение:



"Выбранный объект является представлением в БД. Вы можете создать раздел

для объекта, который не является представлением
"




Можно ли как-то реализовать подобное?

Нравится

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

Добрый вечер.

 

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

 

Подробнее, как это можно сделать описано в этом посте.

Добрый вечер.

 

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

 

Подробнее, как это можно сделать описано в этом посте.

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



На текущей конфигурации нет возможности добавить раздел на основе представления. Вы можете рассмотреть вариант реализации раздела на основе представления средствами разработки. Например, в системе на базовой версии присутствуют разделы на основании представлений прямо в коробке (Библиотека процессов, Журнал процессов и тд.)



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

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

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

 

Параметр - период, за который сформировать отчет (с какой даты по какую).

На данный момент я добавляю 2 дополнительные колонки (CreatedOn) в представление и фильтрую по ним.

 

Вопрос - можно как-либо улучшить данный функционал (хранимыми процедурами, например)?

и дополнительный вопрос - какой Id лучше использовать при создании представления в Creatio? На данный момент я беру Id тех записей, которые используются в отчёте (следовательно, которые уже есть в БД), хотелось бы узнать, есть ли более правильный подход или можно оставить так, как есть.

Нравится

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

Добрый день.

 

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

Насчет улучшения и оптимизации функционала сложно что-то порекомендовать, не зная деталей реализации.

 

Относительно того, какой Id лучше использовать, можно либо генерировать новый Id в представлении (например, в T-SQL функцией newid()), либо делать так, как Вы, - использовать Id записей. Фактически значение этого поля ни на что не влияет, а нужно только для сохранения представления в конфигурации, так как Id является обязательным параметром для создания схемы представления.

Добрый день.

 

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

Насчет улучшения и оптимизации функционала сложно что-то порекомендовать, не зная деталей реализации.

 

Относительно того, какой Id лучше использовать, можно либо генерировать новый Id в представлении (например, в T-SQL функцией newid()), либо делать так, как Вы, - использовать Id записей. Фактически значение этого поля ни на что не влияет, а нужно только для сохранения представления в конфигурации, так как Id является обязательным параметром для создания схемы представления.

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

При выведении в Итоги виджета "список" данных объекта, созданного на основе View, в Списке  иногда отображаются дублирующиеся записи. Но при экспорте в excel такие дубли отсутствуют. Есть подозрение, что такое поведение связано как-то с пагинацией.  Такая же ситуация происходит если делать на основе такого объекта деталь.

Кто-нибудь сталкивался с подобным?

Ниже пример схемы View используемый для объекта

CREATE VIEW [dbo].[VwTest] AS

SELECT

    NEWID() as Id

    ,GETDATE() as CreatedOn

    ,(SELECT Id FROM Contact WHERE Id='BE80A149-0089-4311-A775-CA6CD8937E2B') as CreatedById

    ,GETDATE() as ModifiedOn

    ,(SELECT Id FROM Contact WHERE Id='BE80A149-0089-4311-A775-CA6CD8937E2B') as ModifiedById

    ,0 as ProcessListeners

    ,Id as ContactId

    ,Age

FROM Contact

WHERE Age>30

 

 

 

Нравится

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

Добрый день!

Прошу уточнить следующую информацию:

1. Полную версию приложения

2. Данное поведение наблюдается с одним объектом, или воспроизводится вне зависимости от объекта?

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

 

Спасибо!

Роман Казекин,

 1. Версия Sale Ent 7.16.3

2. Данное поведение характерно для всех объектов созданных на основе view.

3.

- Создал View ( как описано выше)

-  в управление конфигурацией создал объект с названием View

- включил checkbox Поведение - Представление в базе данных

4. Вывод объекта в Итогах в виде Списка

Евгений Кобзарь,

 

Уточните, пожалуйста, по какому полю Вы определяете записи, как дубли?

Также прошу посмотреть Select, который приходит детали. Есть ли там одинаковые записи?

Роман Казекин,

По полю Контакт. Select с View выбирает только 1 запись. Но в таблице/списке показывает несколько. Как правило происходит такое когда нажимаешь кнопку Показать больше. См. скриншот

Евгений Кобзарь,

 

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

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

 

https://academy.terrasoft.ru/docs/user/bazis_platformy/dannye/dubli/poi…

Роман Казекин,

 

Дублей нет. На скриншоте видно, что ссылки на эти записи формируются идентичные (на основе одного Id). Мне кажется что проблема все же в offsetе и order by (по Id).  При нажатии показать больше идет повторный запрос к View у которого НЕ статический  ID (newid()). Если это так? То каким образом можно и как правильно во view создать этот ID.

Добрый день

Евгений, это абсолютно объяснимое поведение View при использовании Fetch next. Вы же получаете записи пачками, а каждая пачка имеет свои Id и сортировка может вам выдать "дубль"

Как правильно? Просто используейте Id из основного объекта. Вы же выбираете из Contact, так берите его Id вместо генерации newid()

 

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

Привет, не работает маппинг полей если в качестве источника макросов указать объект созданный на основе представления, но работает с обычными объектами. Сталкивался ли кто, с использованием представления в качестве источника макросов.

Нравится

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

Добрый день!

Как проявляет себя проблема?

Возможно Вы пытались получить значения, которых нет в самой таблице представления. Найти какие поля есть и доступны в таблице представления можно через СУБД.

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

Добрый, не отображаются значения полей в итоговом письме, при использовании блока отправить email и передачи в него Id записи из представления.

 

Глеб Макаров,

Проверьте, пожалуйста, есть ли в БД в таблице представления те колонки, которые Вы с помощью макросов помещаете в шаблон.

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

Добрый день всем! 

Просьба помочь кто  сталкивался:

Создала вью в БД, создала для нее объект "Представление в БД".

Данные выводит, если написать select.

В БПМ объект виден, колонки тоже (Уточнение: как видите, некоторые колонки справочного типа).

Но при попытке построить график в итогах по данному объекту получаю ошибочки. Не понимаю, чего от меня хочет приложение :( Мне показалось, БПМ ищет колонки с определенными названиями.

Хэлп!

SELECT TOP (1000) [UsrId]
      ,[UsrCaseId]
      ,[UsrCreatedOn]
      ,[UsrGroupId]
      ,[UsrUserid]
      ,[UsrStatusId]
  FROM [dbo].[Usr1LineReport]

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

Нравится

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

А добавьте все необходимые колонки (Id, CreatedById, ModifiedById, ModifiedOn, ProccessListener - если наследуетесь от Base object) во View

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

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

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

Нужно сделать некий отчет, который будет содержать информацию по активностям, в том числе вычисляемые поля по количеству активностей, их длительности и тп. На вход отчету нужно задавать как минимум диапазон дат. Стандартными итогами такой отчет получить не могу, т.к. конструктор не позволяет выполнять вычисления. Планирую сделать sql view, но в нее не знаю как передавать параметры, взятые из фильтра. Помогите, пожалуйста, с передачей параметров.

Нравится

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

Отчет где будет строиться?

1) Был опыт вывода view в итоги

2) В excel отчеты

3) подключение вычисляемых полей из view к реестру раздела

Добрый день! Вы строите View c набором итоговых столбцов по которым уже и будите фильтровать из интерфейса.

Вот пример моего представления:

CREATE VIEW dbo.[VwDynamicOsago] ([Id],[CreatedAt],[WeekId],[MonthId],[Name], [InsuranceCount], 
[AvgPolicyCost], [PolicyIncome], [Cpa], [ProfitByOnePolicy], [Turnover], [Revenue], [AdsCost], [Profit], 
[MultiplexCoeff], [SingleTax], [BankExpenses], [MotivationCC],[BankRatio]) AS
SELECT 
	NEWID() [Id],	
	CONVERT(date, DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I].[CreatedAt])) [CreatedAt],
	[I].[WeekId] [WeekId],
	[I].[MonthId] [MonthId],
	'Динамика '+'('+CONVERT(varchar(10), DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I].[CreatedAt]), 120)+')' [Name],
	COUNT([I].[Id]) [InsuranceCount],
	AVG([I].BrokerDiscountedPayment) [AvgPolicyCost],
	AVG([I].Revenue) [PolicyIncome],
	dbo.fn_AbCalculateCpa([CpcCost].[AdsCost], COUNT([I].[Id])) [Cpa],
	dbo.fn_AbCalculateProfitByOnePolicy(SUM([I].Revenue), 
										dbo.fn_AbCalculateSingleTax(SUM([I].[Commission]), 5), 
										dbo.fn_AbCalculateBankExpenses(AVG([I].Revenue), dbo.fn_AbGetBankRatio(CONVERT(date, DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I].[CreatedAt])))), 
										dbo.fn_AbCalculateMotivationCC(SUM(CC_MOTIVATION.[Value]), COUNT([I].[Id])), 
										[CpcCost].[AdsCost], 
										COUNT([I].[Id])
										) [ProfitByOnePolicy],	
	SUM([I].BrokerDiscountedPayment) [Turnover],
	SUM([I].Revenue) [Revenue],
	[CpcCost].[AdsCost] [AdsCost],
	dbo.fn_AbCalculateProfit(SUM([I].Revenue), 
							 dbo.fn_AbCalculateSingleTax(SUM([I].[Commission]), 5), 
							 dbo.fn_AbCalculateBankExpenses(AVG([I].BrokerDiscountedPayment), dbo.fn_AbGetBankRatio(CONVERT(date, DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I].[CreatedAt])))), 
							 dbo.fn_AbCalculateMotivationCC(SUM(CC_MOTIVATION.[Value]),	COUNT([I].[Id])), 
							 [CpcCost].[AdsCost]
							 ) [Profit],
	IIF([CpcCost].[AdsCost] IS NOT NULL AND [CpcCost].[AdsCost] > 0, SUM([I].Revenue)/[CpcCost].[AdsCost],0) [MultiplexCoeff],
 
	dbo.fn_AbCalculateSingleTax(SUM([I].[Commission]), 5) [SingleTax],
	dbo.fn_AbCalculateBankExpenses(AVG([I].BrokerDiscountedPayment), dbo.fn_AbGetBankRatio(CONVERT(date, DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I].[CreatedAt])))) [BankExpenses],
	dbo.fn_AbCalculateMotivationCC(SUM(CC_MOTIVATION.[Value]), COUNT([I].[Id])) [MotivationCC],
	dbo.fn_AbGetBankRatio(CONVERT(date, DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I].[CreatedAt]))) [BankRatio]
 
FROM [AbInsurance] [I] WITH(NOLOCK)
LEFT OUTER JOIN [CpcCost] [CpcCost] WITH(NOLOCK) ON [CpcCost].[Date] = CONVERT(date, DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I].[CreatedAt]))
OUTER APPLY (SELECT SUM(IIF( DATEPART(HOUR, DATEADD(HOUR,dbo.fn_AbGetAddedHoursToSqlQuery(),CreatedAt)) > 18, 50, 40)) [Value]
			 FROM [AbInsurance] [I1] WITH(NOLOCK)
			 WHERE [I1].ProcessingReasonCCId IS NOT NULL AND [I1].Id = [I].Id
			 GROUP BY CONVERT(date,DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I1].[CreatedAt]))
			 ) AS CC_MOTIVATION
WHERE [I].StatusId = '195CD1AD-37B3-4F0A-B4FC-70E2BF0B3F06'
		AND [I].[CreatedAt] IS NOT NULL
GROUP BY CONVERT(date, DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I].[CreatedAt])), 'Динамика  '+'('+CONVERT(varchar(10), DATEADD(HOUR, dbo.fn_AbGetAddedHoursToSqlQuery(), [I].[CreatedAt]), 120)+')', [CpcCost].[AdsCost], [I].[MonthId], [I].WeekId

 

Может, лучше не создавать динамически view под каждый запуск отчёта, а при его запуске формировать программно в ESQ или Select выборку с нужными условиями и группировками и записывать её  результаты в некоторую (одну и ту же) служебную таблицу, добавив в отдельную колонку Id запуска. А при построении отчёта фильтровать её по этому Id. А когда после построения отчёта эти записи станут ненужными, чистить.

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

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

 

Вам необходимо реализовать страницу настроек отчёта (пример схемы в конфигурации — ContactAnniversariesReportFilter) и зарегистрировать её в БД, в таблице SysModuleAnalyticsReport, в колонке SysOptionsPageSchemaUId записи Вашего отчёта.

 

Для конкретной реализации с вычислениями, видимо, нужно будет сделать логику записи результатов в таблицу, а затем передавать в отчёт один параметр — Id для фильтрации.

Нигрескул Алексей пишет:

Добрый день! Вы строите View c набором итоговых столбцов по которым уже и будите фильтровать из интерфейса.

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

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

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

В базе данных bpmonline я создал представление dbo.UsrGetStats c нужными мне атрибутами (Contact, MaxTime, MinTime, AvgTime).

Такой вопрос, как создать объект на основе этого DB VIEW (UsrGetStats)? 

Нравится

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

Добрый день.

Создаете так же, как и простую схему объекта. Подробнее об этом почитайте на академии.

Важно, чтобы названия колонок совпадали с названиями колонок в представлении и, если это справочная колонка, как например, Contact, то в представлении она должна называться ContactId, а в схеме Contact (это только в случае, если Вы ее хотите сделать справочной в схеме).

Также при создании схемы не забудьте указать признак 'Представление в базе данных':

Добрый день.

Создаете так же, как и простую схему объекта. Подробнее об этом почитайте на академии.

Важно, чтобы названия колонок совпадали с названиями колонок в представлении и, если это справочная колонка, как например, Contact, то в представлении она должна называться ContactId, а в схеме Contact (это только в случае, если Вы ее хотите сделать справочной в схеме).

Также при создании схемы не забудьте указать признак 'Представление в базе данных':

Алла Савельева,

Здравствуйте, спасибо за ответ, помогло!

Примечание: во View не было Id из-за этого выходила ошибка.

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