Распределение доступа в BPM
Технические вопросы
5.x

Добрый день, Коллеги!
У меня есть пару вопросов по администрированию:
1. Как можна скрыть полностью детали по уровню доступа ? Или они будут так и висеть, но там не будет не видно записей ? В разделе контрагенты снял галочку администрируется по записям, на объект детали поставил только галочку администруеста по операциям и запретил групе доступ к ней. Но деталь видна в списке деталей. Редист очистил.
2. Как можна в справочнике запретить доступ к определенной записи, в раздели понятно по детали, а в справочнике не нашел.
3. Есть объект с которого сделаны две детали, к одной открыть доступ к другой закрыть ? Как это реализировать ? Администрировать по записям так не выйдет =(
4. Как закрыть доступ к "Аналитике" и "Печатям"? нашел эти объекты закрыл доступ но все равно вижу их и могу использевать.

Зарание спасибо за помощ!

Нравится

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

"Ильюша Сергей Николаевич" написал:1. Как можно скрыть полностью детали по уровню доступа ? Или они будут так и висеть, но там не будет не видно записей ? В разделе контрагенты снял галочку администрируется по записям, на объект детали поставил только галочку администруется по операциям и запретил группе доступ к ней. Но деталь видна в списке деталей. Редис очистил.

Скрыть деталь можно только путем удаления ее из Рабочих мест - просто сделать ее невидимой не предусмотрено в системе, поскольку отображаемые детали кэшатся в Redis. Этот вопрос уже неоднократно обсуждался ранее на Community. Оптимальное решение в Вашем случае - не добавлять деталь в рабочие места, а отдельно добавить ее в карточку (такая возможность есть в Рабочих местах). Детали карточки могут появляться/скрываться динамически.

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

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

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

Либо же Вы можете зарегистрировать справочник как раздел, затем удалить его из рабочих мест, и установить ему в качестве окна редактирования окно раздела. В этом случае в окне редактирования справочника у Вас в том числе будет деталь Доступ, где можно будет разбать доступы для отдельных записей. Пример - Шаблоны сообщений в коробочной версии.

3. Есть объект с которого сделаны две детали, к одной открыть доступ к другой закрыть ? Как это реализовать? Администрировать по записям так не выйдет

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

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

4. Как закрыть доступ к "Аналитике" и "Печатям"? нашел эти объекты закрыл доступ но все равно вижу их и могу использовать.

Для того, чтобы скрыть эти детали из раздела, следует снять галочку "включить аналитику" в рабочих местах. Что касается отдельных элементов, Вам следует раздать доступ на соответствующие объекты.

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

Показать все комментарии
права доступа по умолчанию
Технические вопросы
5.x

Добрый день!

Уважаемые гуру bpm, а не подскажете ли вы то таинственное место в системе, где можно посмотреть, а может быть и изменить работу стандартного функционала по раздаче прав на создаваемые записи по умолчанию? Откуда берутся данные для назначения прав понятно, а вот "кто" дальше их применяет неясно.
Триггеров на таблицах нет (как это было в 3.х), остается два варианта - функция эта зашита в ядро (грустно, но хотя бы буду знать об этом), или доступна и вызывается в каком-либо процессе в системе (и можно ее поправить/использовать/доработать/изучить!)
Характер вопроса познавательно-теоретический:smile:
Заранее безмерно благодарен...

Нравится

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

Здравствуйте, Александр!

Боюсь, дам Вам повод для грусти, однако же данная функция зашита в ядро.

Есть и отрадная новость: права по умолчанию гибко настраиваются. В частности, можно для объекта установить так называемого Владельца. Для этого следует выбрать в расширенных свойствах объекта одно из полей (Ответственный, Автор, Создал) и выпадающем меню поля Владелец.

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

Кроме того, BPMonline также поддерживает различный уровень вложенности при работе с записями. Рекомендую обратить Ваши взоры к системной настройке Способ администрирования связанных объектов (QueryJoinRightLevel)

[Способ администрирования связанных объектов] — позволяет определить способ администрирования связанных объектов, например, при отображении информации об основном контакте (должности или дате рождения) из раздела [Контрагенты]. Тип: целое число. Значение по умолчанию: 0. Настройке можно присвоить следующие значения:

0 — отображать данные только по записям связанного объекта, к которым у текущего пользователя есть доступ;
1 — отображать данные только по записям связанного объекта, к которым у текущего пользователя есть доступ, но в случае отсутствия доступа к записи, отображать данные основного отображаемого поля;
2 — отображать данные по всем записям связанного объекта независимо от распределения прав доступа.

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

Спасибо за ответ, Анна! Принцип понял.
Вопрос на данный момент имеет, как и писал, теоретически-образовательный характер.

Показать все комментарии
бизнес-процесс
Добавление участников
Технические вопросы
5.x

Здравствуйте!
Подскажите, как в БП можно добавить в участники задачи всех, кто входит в определенную группу?

То, что пробовал я, взяв за пример участок из вшитого в CRM+SD процесса:

1. Создание задачи с помощью элемента "Добавление данных"
2. Удаление из этой задачи ответственного по умолчанию (элемент "Изменение данных")
3. Элемент "Добавление данных":

Объект - Участник активности
Добавить результат выборки по объекту -> Объект Администрирования -> В фильтре указываю группу, установленную ранее в карточке инцидента в поле "Группа"

Значения полей:

Активность - созданная чуть ранее задача
Участник - Результат выборки (Объект администрирования-Сотрудник-Id)

В результате при прохождении этапов процесса создается задача с участниками: Автор, Ответственный (которого установили вручную), Контакт Инцидента и Участник без имени, но с ролью Участник.

Как сделать, чтобы все входящие в группа добавлялись в участники?

Заранее спасибо!

Нравится

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

Изменил на

Добавить результат выборки по объекту -> Вхождение пользователя в роль -> В фильтре "Роль = Группа"

По логике всё должно работать, но поле "Группа" невозможно подставить в условие и приравнять к полю "Роль" - оно не отображается через элемент "Чтение данных".

Решение найдено. В фильтре объекта Вхождение пользователя в роль следует прописывать так: Роль.Id равно %чтение данных%.Группа.

Показать все комментарии
wnd_CreateNewWorkspace
главное окно
реестр
Создание нового раздела
Технические вопросы
Разработка

Создал новый сервис с помощью мастера, Затем дополнил его новыми полями. Создал карточку редактирования. Работает, при заполнении в базе появляется запись в соответствующей таблице (проверял).
Однако, необходимо чтобы записи отображались в реестре и главном разделе нового раздела. Обе формы созданы, но этого не происходит.
Проверял по инструкции https://community.terrasoft.ru/developer/advice/4567 : соответствующие обработчики событий сгененрированы мастером, соответствующие поля заполнены, компоненты созданы.
В чём может быть ошибка?

Нравится

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

А есть корневая группа в дереве групп? Если есть, то есть ли на неё права у текущего пользователя?

Простите, но я не совсем понимаю, что подразумевается под коневой группой, Main Grid нет?

Например, группа "Все контакты".

Добрый день, Игорь, действительно, проблема скорее всего с правами доступа. Ранее с похожими проблемами уже поступали обращения.

"Зверев Александр" написал:

А есть корневая группа в дереве групп? Если есть, то есть ли на неё права у текущего пользователя?


Да, есть, полные права

Господа-эксперты, проблема не решена...
Есть-ли у кого-нибудь ещё мысли по этому поводу?

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

Обнаружил, что при попытке добавления записи в созданный раздел под учетной записью отличной от той, с которой был создан сервис, помощью карточки редактирования при нажатии кнопки [Ок] выскакивает ошибка (см. скриншот), окно редактирования не закрывается, а запись не добавляется в таблицу раздела.

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

Игорь, подскажите, Вам пришло сообщение о регистрации инцидента? если да, то в нем указаны сроки реакции на инцидент. Если сообщение о регистрации Вам не пришло - попробуйте повторить отправку письма в поддержку, либо позвонить нам.
Так же, обращаю Ваше внимание, у каждой компании есть свой пакет поддержки, если пакет поддержки бесплатный - реакция на обращение в течении 5ти рабочих дней.

Сообщение переслал, первое не дошло.
Решением проблемы явилось удаление раздела и создание нового.
Видимо где-то накосячил

Показать все комментарии
MS SQL
MS SQL 2005
select
оптимизация
Технические вопросы
Разработка

Нужна помощь советом в какую сторону нужно смотреть.

Реализовал импорт прайс-листа по продуктам указанного производителя. В начале импорта указывается производитель и выбирается Excel-файл прайс-листа этого производителя. В процессе импорта добавляются/обновляются продукты. Считывается строка из Excel-файла, проверяется наличие этого продукта в БД по артикулу и производителю, дальше в зависимости от наличия продукта выполняется либо добавление (если нет), либо обновление (если есть) продукта. Также, во время импорта происходит проверка на дубли по артикулу (коду) продукта, в конце выводиться отчет.

Попробовал дефрагментировать индексы по этому совету. С большим файлом Excel (22411 строк) импорт занял: до - 45 минут, после - 33 минуты.

Задача: максимально ускорить процесс импорта.

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

В результате, узкими местами оказались функции GetOffering (10 минут, 29.4 %), CheckHasDuplicate (11.5 минут, 33.6 %), которые выполняют запрос на выборку (Select query) по продукту:
[[fn]GetOffering] TotalDuration - 600573 ms, NumberOfCalls - 22409, MinDuration - 15 ms, MaxDuration - 328 ms, AverageDuration - 26.8 ms, Portion - 29.4 %
[[fn]CheckHasDuplicate] TotalDuration - 684564 ms, NumberOfCalls - 22409, MinDuration - 15 ms, MaxDuration - 328 ms, AverageDuration - 30.55 ms, Portion - 33.6 %

Portion - это процент от общего времени выполнения импорта прайса.

Вот эти запросы:

функции GetOffering

SELECT
        [tbl_Offering].[ID] AS [ID],
        [tbl_ProductCode].[Code] AS [ProductCode]
FROM
        [dbo].[tbl_Offering] AS [tbl_Offering]
LEFT OUTER JOIN
        [dbo].[tbl_ProductCode] AS [tbl_ProductCode] ON [tbl_ProductCode].[ID] = [tbl_Offering].[ProductCodeID]
WHERE([tbl_Offering].[Article] = N'20237-179' AND
        [tbl_Offering].[VendorID] = '{AFF31DDE-20C5-4207-AD54-275962A4D7F8}')

Execution plan
execution plan

функции CheckHasDuplicate

SELECT
        [tbl_Offering].[ID] AS [ID],
        [tbl_Offering].[OriginalName] AS [OriginalName],
        [tbl_Offering].[VendorID] AS [VendorID],
        [Vendor].[Name] AS [VendorName],
        [tbl_ProductCode].[Code] AS [ProductCode],
        [tbl_Offering].[Article] AS [Article]
FROM
        [dbo].[tbl_Offering] AS [tbl_Offering]
LEFT OUTER JOIN
        [dbo].[tbl_Account] AS [Vendor] ON [Vendor].[ID] = [tbl_Offering].[VendorID]
LEFT OUTER JOIN
        [dbo].[tbl_ProductCode] AS [tbl_ProductCode] ON [tbl_ProductCode].[ID] = [tbl_Offering].[ProductCodeID]
WHERE([tbl_Offering].[Article] = N'PCM-3730I-AE')

Execution plan
execution plan

Большие картинки в прикрепленном архиве execution_plan.rar.

Смотрю в сторону индексов. В таблице tbl_Offering 152773 записи. С индексами раньше особо не работал. Возможно, стоит добавить некластерный индекс по полю Article, по которому происходит фильтрация продуктов? Может, еще что-то посоветуете? Нужно ли запускать какую-то регулярную обработку индексов, чтобы их оптимизировать?

Вот SQL-код создания таблицы tbl_Offering:

/****** Object:  Table [dbo].[tbl_Offering]    Script Date: 05/14/2013 15:05:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tbl_Offering](
        [ID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [PDFOfferingID]  DEFAULT (newid()),
        [CreatedOn] [datetime] NULL,
        [CreatedByID] [uniqueidentifier] NULL,
        [ModifiedOn] [datetime] NULL,
        [ModifiedByID] [uniqueidentifier] NULL,
        [Name] [nvarchar](250) NOT NULL,
        [Code] [nvarchar](250) NULL,
        [CurrencyID] [uniqueidentifier] NULL,
        [BasicPrice] [decimal](15, 2) NULL,
        [DefaultUnitID] [uniqueidentifier] NULL,
        [VendorID] [uniqueidentifier] NULL,
        [SupplierID] [uniqueidentifier] NULL,
        [OwnerID] [uniqueidentifier] NULL,
        [OfferingTypeID] [uniqueidentifier] NULL,
        [URL] [nvarchar](250) NULL,
        [Description] [image] NULL,
        [Weight] [decimal](15, 4) NULL,
        [Volume] [decimal](15, 4) NULL,
        [SerialNumber] [nvarchar](50) NULL,
        [OriginalCountryID] [uniqueidentifier] NULL,
        [UnitDivision] [decimal](15, 4) NULL,
        [IsUsed] [int] NULL,
        [ProductCodeID] [uniqueidentifier] NULL,
        [GuaranteePeriod] [decimal](15, 4) NULL,
        [QuantityInPackage] [decimal](15, 4) NULL,
        [MinRest] [decimal](15, 4) NULL,
        [StatusID] [uniqueidentifier] NULL,
        [OriginalName] [nvarchar](250) NULL,
        [DeliveryTerm] [decimal](15, 4) NULL,
        [Price1FOB] [decimal](15, 4) NULL,
        [Price1DDP] [decimal](15, 4) NULL,
        [VendorCurrencyID] [uniqueidentifier] NULL,
        [SupplierCurrencyID] [uniqueidentifier] NULL,
        [VendorSupplierConvRateID] [nvarchar](250) NULL,
        [DeliveryBasisID] [nvarchar](250) NULL,
        [SupplierMarkup] [decimal](15, 4) NULL,
        [SupplierExtraCostsForUkraine] [decimal](15, 4) NULL,
        [EndUserPriceFOB] [decimal](15, 4) NULL,
        [EndUserPriceDDP] [decimal](15, 4) NULL,
        [IsSpecialSupplierPrice] [int] NULL,
        [Article] [nvarchar](250) NULL,
        [SupplierConversionRateID] [nvarchar](250) NULL,
        [IsFixedCosts] [int] NULL,
        [FixedCosts] [decimal](15, 4) NULL,
        [SpecialSupplierPrice] [decimal](15, 4) NULL,
        [IsRequiredIncomeControl] [int] NULL,
        [OrderCode] [nvarchar](250) NULL,
        [Note] [nvarchar](1000) NULL,
        [IsUsedInPriceListImport] [int] NULL,
        [CategoryID] [uniqueidentifier] NULL,
        [GnomeID] [nvarchar](250) NULL,
        [IsSeparateLineMarkupInSupplie] [int] NULL,
 CONSTRAINT [POfferingID] PRIMARY KEY NONCLUSTERED
(
        [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FK13238CategoryIDtbl_Offeri1] FOREIGN KEY([CategoryID])
REFERENCES [dbo].[tbl_OfferingCategory] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FK13238CategoryIDtbl_Offeri1]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingCurrencyID] FOREIGN KEY([CurrencyID])
REFERENCES [dbo].[tbl_Currency] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingCurrencyID]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingDefaultUnitID] FOREIGN KEY([DefaultUnitID])
REFERENCES [dbo].[tbl_Unit] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingDefaultUnitID]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingOfferingTypeID] FOREIGN KEY([OfferingTypeID])
REFERENCES [dbo].[tbl_OfferingType] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingOfferingTypeID]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingOriginalCountryID] FOREIGN KEY([OriginalCountryID])
REFERENCES [dbo].[tbl_Country] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingOriginalCountryID]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingOwnerID] FOREIGN KEY([OwnerID])
REFERENCES [dbo].[tbl_Contact] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingOwnerID]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingProductCodeID] FOREIGN KEY([ProductCodeID])
REFERENCES [dbo].[tbl_ProductCode] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingProductCodeID]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingStatusID2] FOREIGN KEY([StatusID])
REFERENCES [dbo].[tbl_OfferingStatus] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingStatusID2]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingSupplierCurrencyID2] FOREIGN KEY([SupplierCurrencyID])
REFERENCES [dbo].[tbl_Currency] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingSupplierCurrencyID2]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingSupplierID] FOREIGN KEY([SupplierID])
REFERENCES [dbo].[tbl_Account] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingSupplierID]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingVendorCurrencyID] FOREIGN KEY([VendorCurrencyID])
REFERENCES [dbo].[tbl_Currency] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingVendorCurrencyID]
GO
ALTER TABLE [dbo].[tbl_Offering]  WITH CHECK ADD  CONSTRAINT [FOfferingVendorID] FOREIGN KEY([VendorID])
REFERENCES [dbo].[tbl_Account] ([ID])
GO
ALTER TABLE [dbo].[tbl_Offering] CHECK CONSTRAINT [FOfferingVendorID]

Нравится

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

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

Да, Вам точно нужен индекс, т.к. и в GetOffering и в CheckHasDuplicate есть строки вида:
WHERE([tbl_Offering].[Article] = N'20237-179'

Именно здесь мы и получаем "затык"... Осталось определиться нужно ли создавать кластерный индекс?

На самом деле все просто: если у таблицы есть кластерный индекс, то записи, находящиеся в этой таблице, физически (в дисковом файле) упорядочиваются в соответствии с условием индексирования). Именно поэтому кластерный индекс может быть на таблицу только один. Некластерный индекс хранит ссылки на местоположение данных в дисковом файле.

Со всеми вытекающими.

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

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

3. Если кластерный индекс создается по IDENTITY столбцу, и из таблицы часто удаляются записи, то это приводит к сильной фрагментации таблицы.

Также, вот статья о "Идексах". Описано довольно подробно.

Спасибо, Дмитрий.
Подумав, решил попробовать создать некластерный индекс по полю Article, поскольку предполагается частая вставка новых записей (пункт 2 в Ваших вытекующих), и удаление (пункт 3). Сейчас тестирую импорт с некластерным индексом по полю Article, о результатах отпишусь.

Протестировал:
1. Где основное действие - это вставка (Insert) - 15 минут.
2. Где изменение (Update) - 14 минут.

Результаты на лицо :smile:
Спасибо большое за помощь :twisted:

А начиналось все с 1 часа.

Шаги по оптимизации:
1. Вместо использования Dataset.Append(), Dataset.Edit(), Dataset.Post() переделал на использование Insert и Update Query - стало 45 минут.
2. Дефрагментировал индексы - стало 33 минуты.
3. Добавил индекс по полю Article, по которому происходит фильтрация. Индекс по полю VendorID уже был ранее добавлен автоматически, при добавлении поля в сервис таблицы. Стало - 15 минут.

Показать все комментарии
Технические вопросы
5.x

Портал выдаёт ошибку при создании иницидента, так что спрошу здесь.

У компании Interbrand Group CID 20418007 при попытке прикрепить файл к активности возникает ошибка:

Как можно решить проблему?

Заранее спасибо!

Нравится

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

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

Появившаяся ошибка явно указывает на переполнение журнала транзакций БД.
Это может быть связано с тем, что на накопителе, где находится файл БД недостаточно свободного места, либо действует ограничение на размер файла БД при использовании EXPRESS версии MS SQL Server.

Для устранения ошибки попробуйте сжать БД, для этого в Management Studio в контекстном меню выберите пункт [Tasks] - [Shrink] - [Database]:

Так-же, возможно Вам будет полезна следующая статья:

http://msdn.microsoft.com/ru-ru/library/ms175495.aspx

С уважением,
Шипко Илья
Специалист службы поддержки II линии
BPMonline

Илья, спасибо! Действительно, на сервере не осталось свободного места.

Показать все комментарии
уведомления
Технические вопросы
5.x

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

Подскажите, как в БП сгенерировать полноценное уведомление. Я в элементе добавить данные указываю объект Уведомление, заполняю колонки Кому, Заголовок, Описание. Однако в результате уведомление не появляется.
Возможно нужно заполнить ещё какие-то колонки?

Заранее спасибо!

Нравится

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

Акмаль, проверьте, пожалуйста, добавляются ли данные непосредственно в таблицу БД.
При создании уведомления необходимо заполнять поля Время, Объект и Источник

Хочу уточнить, что при создании активности типа "E-mail" собственно электронное письмо не отправляется адресатам. Для отправки письма необходимо дополнительно настроить соотв. "Рассылку".

Наталия, а какими значениями можно заполнять указанные Вами поля?

Вы хотите сказать, что уведомление создаётся с помощью элемента E-mail?

Время - период, в который должно отобразиться уведомление.
Объект - идентификатор записи активности, по которой создается уведомление.
Источник - идентификатор источника уведомления (уведомление создается автору либо ответственному активности).
Источник, скорее всего, можно пропустить.

"Салихов А" написал:Вы хотите сказать, что уведомление создаётся с помощью элемента E-mail

Смотря какие уведомления. Email уведомления создаются с помощью элемента E-mail.

Наталия, а объектом может быть запись инцидента? Или только активность?

И ещё вопрос - как можно в поле Кому поставить руководителя команды, которая занималась инцидентом?

Наталия, в таблицу Reminding ничего не добавляется...

Судя по всему возникает проблема с полем Объект. Я в это поле заношу Id созданной ранее задачи. При открытии страницы уведомления в колонке Объект надпись "Нет доступа". При двойном клике на уведомлении переход на задачу не осуществляется - возникает ошибка.

Разобрался - в Объект нужно записывать схему объекта Активность.

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

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

Возможно ли привязать время решения инцидента ко времени нахождения в определенных статусах?
Данная задача возникла в связи с необходимостью учета задержек в процессе управления инцидентами при переводе инцидента в статусы "Внешний поставщик" и "Ожидание ответа заказчика".

Нравится

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

Здравствуйте, Акмаль!

Можно. Привязывайте.

А если серьезно, пожалуйста, детализируйте задачу. Правильно ли я понимаю, что Вам требуется, чтобы при переводе инцидента в состояние "ожидаем ответа от пользователя" срок реакции как бы замораживался, и подставлялся при возврате в работу?

Какой именно учет какого времени Вам нужно реализовать в системе? Как это должно работать?

Анна, совершенно верно, перед нами стоит задача приостановки учета времени решения инцидента при переходе в определенные статусы. Самым простым видится вариант, когда время фактического решения равно сумме нахождения инцидента в определенных статусах. Так, например, нам не нужно учитывать время, когда мы ожидаем реакции от инициатора(абонента в нашем случае), при переводе инцидента на внешнего поставщика, а так же время, в течение которого менеджер инцидентов закрывает инцидент (в текущем проекте не предусмотрено автозакрытие инцидента или закрытие инцидента инициатором).

Здравствуйте, Акмаль!

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

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

1. Срок по сервису;
2. Срок по пакету сервисов;
3. Критичность и срочность;
4. Часовой пояс.

Исходя из всех параметров выбирается минимальный срок реакции, и подставляется в карточку. Функциональность реализована в схеме BaseServiceRequestInBPMonlineEditPage. Для того. чтобы внести изменения в данную функциональность необходима объемная проектная доработка.

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

Интересует вопрос, как принято устанавливать время выполнения для активностей внутри процесса управления инцидентами. Ставится какое-то минимальное значение или высчитывается программно из времени решения инцидента?

Нравится

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

Добрый день!

Данный вопрос имеет очень индивидуальное решение. Каждая компания имеет свою специфику отработки сервисных запросов/инцидентов. Поэтому эдиного стандарта нет. По умолчанию, если не ошибаюсь, минут 30 устанавливается на задачу по инциденту.

Думаю, подойти к решению можно так:
1) Провести анализ по отработанным инцидентам в срезах: линии (1-я, 2-я, 3-я...)
2) По собранной статистической информации провести анализ времени решения инцидента на каждой из линий.
3) Провести анализ загружености (к примеру: среднее время за которое специалист приступает к решению инцидента с момента его регистрации).

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

Показать все комментарии
Технические вопросы
Разработка

Вот так выглядит у меня preview select_query :

SELECT DISTINCT
        min(cast([tbl_Opportunity].[ID]  AS char(36))) AS [ID],
        [tbl_Opportunity].[ShopName] AS [ShopName],
        MIN([tbl_Contract].[StartDate]) AS [StartDate]
FROM
        [dbo].[tbl_Contract] AS [tbl_Contract]
LEFT OUTER JOIN
        [dbo].[tbl_Opportunity] AS [tbl_Opportunity] ON [tbl_Opportunity].[ID] = [tbl_Contract].[OpportunityID]
LEFT OUTER JOIN
        [dbo].[tbl_Activity] AS [tbl_Activity] ON [tbl_Activity].[ID] = [tbl_Opportunity].[ActivityID]
LEFT OUTER JOIN
        [dbo].[tbl_Assortment] AS [tbl_Assortment] ON [tbl_Assortment].[ID] = [tbl_Activity].[AssortmentID]
LEFT OUTER JOIN
        [dbo].[tbl_ContractStatus] AS [tbl_ContractStatus] ON [tbl_ContractStatus].[ID] = [tbl_Contract].[ContractStatusID]
WHERE([tbl_Assortment].[ID] = :AssortmentID AND
        [tbl_Opportunity].[TradeCentreID] = :TradeCentreID AND
        NOT [tbl_Opportunity].[ShopName] IS NULL AND
        [tbl_ContractStatus].[Name] = :Statuss)
GROUP BY
        [tbl_Opportunity].[ShopName]
ORDER BY
        2 ASC

Однако, при попытке получить из query данные, я получаю ошибку :

Нравится

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

А если сделать min(ShopName)?

Ну тогда он выдает самый первый по алфавиту магазин. А мне нужны все.

Тут же GROUP BY ShopName, оно из каждой группы с одним именем и выведет это имя.

Александр, прощу прощения, я не очень понимаю Вас. Так в чем у меня ошибка?

Наталия, немного изменила Ваш запрос чтобы проверить в базовой версии - отработал без ошибок:
/system/files/1_125.png

Выполните его на уровне СУБД, отсекая отдельные фрагменты (чтобы понять в чем причина).

А в том то и дело, что если я запускаю вышеуказанный скрипт в SQL - все отрабатывается идеально.
А при попытке вывести значения в LookUp, получаю вот такое сообщение.

А если так:

SELECT 
        min(cast([tbl_Opportunity].[ID]  AS char(36))) AS [ID],
        min([tbl_Opportunity].[ShopName]) AS [ShopName],
        MIN([tbl_Contract].[StartDate]) AS [StartDate]

"Зверев Александр" написал:

А если так:

SELECT

        min(cast([tbl_Opportunity].[ID]  AS char(36))) AS [ID],

        min([tbl_Opportunity].[ShopName]) AS [ShopName],

        MIN([tbl_Contract].[StartDate]) AS [StartDate]


"Наталия П." написал:

Ну тогда он выдает самый первый по алфавиту магазин. А мне нужны все.

Наталия, скорее всего происходит отключение конструкции GROUP BY, что и вызывает ошибку.
Для тестирование необходима следующая информация:
1. Результат профайлера при попытке вывести значения в LookUp.
2. Сервис select query (и другие сервисы, необходимые для его работы).
3. Какая логика программно обрабатывает select query (код в событии OnPrepareSelectWindow)

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