Кто-то знает этот запрос (для чего он, зачем и можно ли оптимизировать):

exec sp_executesql N'SELECT
        [vw_Account].[ID] AS [ID],
        [vw_Account].[Name] AS [Name]
FROM
        [dbo].[vw_Account] AS [vw_Account]
WHERE(EXISTS
        (SELECT
                [vw_Contact].[ID] AS [ID]
        FROM
                [dbo].[vw_Contact] AS [vw_Contact]
        WHERE([vw_Contact].[AccountID] = [vw_Account].[ID] AND
                EXISTS
                (SELECT
                        [tbl_AdminUnit].[ID] AS [ID]
                FROM
                        [dbo].[tbl_AdminUnit] AS [tbl_AdminUnit]
                WHERE([tbl_AdminUnit].[UserContactID] = [vw_Contact].[ID] AND
                        [tbl_AdminUnit].[UserIsEnabled] = @P1)))))
ORDER BY
        2 ASC'
,N'@P1 int',1

Нравится

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

Угадайка?

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

Можно exists убрать и условие ядреное, через inner join как мне кажется... только надо ли?

"Александр Кудряшов" написал:Можно exists убрать

Спасибо, Александр!
К сожалеюнию, пока нельзя убрать, так как не знаю откуда оно формируется. Но когда узнаю, то постараюсь сделать поле "IsUserAccount", в которое запихивать 1 при создании нового юзера с новым юзерКонтрагентом. тада выборка будет проще

SELECT
        [vw_Account].[ID] AS [ID],
        [vw_Account].[Name] AS [Name]
FROM
        [dbo].[vw_Account] AS [vw_Account]
WHERE IsUserAccount IS NOT NULL

Мне кажется отработает раз в 100 быстрее

SELECT
        [vw_Account].[ID] AS [ID],
        [vw_Account].[Name] AS [Name]
FROM
        [dbo].[[tbl_AdminUnit] AS [[tbl_AdminUnit]
inner join [vw_Contact] on [tbl_AdminUnit].[UserContactID] = [vw_Contact].[ID]
inner join [vw_Account] on [vw_Contact].[AccountID] = [vw_Account].[ID]
 
WHERE [tbl_AdminUnit].[UserIsEnabled] = @P1
 
ORDER BY
        2 ASC',N'@P1 int',1

формируется именно из системы, где-то сервис запроса есть, можно его переписать...

а что реально долго работает и тормозит систему???

ps почитал изыскания пытливых умов - вроде как exists в такой ситуации даже быстрее inner'а отработает

затер сообщение. был неправ :lol:

"AlexLS" написал:в которое запихивать 1 при создании нового юзера с новым юзерКонтрагентом

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

"Андросов Дмитрий" написал:не правильно - надо это поле перезаписывать при изменении признака Активен любого пользователя, привязанного к этому контрагенту и выставлять в 0, если активных пользователей не осталось

Дмитрий, спасибо за ответ! Остается малое - выяснить откуда этот зловещий код выполняется!

"Александр Кудряшов" написал:а что реально долго работает и тормозит систему???

к сожалению из "самых страшных" в нашей терре он на 5 месте (остальные прорабатываю), а по частоте выполнения лидирует! То есть суммарный дюрейшен у юзеров зашкаливает!!!

а вообще это похоже на запрос для какого-то справочника типа "Контрагенты ответсвенных"
поищите UserIsEnabled с помощью GREP (у меня есть только в wnd_LicenseManagerScript, но там не то)
вот для сравнения запрос для справочника Ответсвенный (поиск по имени)

exec sp_executesql N'SELECT TOP 2
	[tbl_Contact].[ID] AS [ID],
	[tbl_Contact].[Name] AS [Name]
FROM
	[dbo].[vw_Contact] AS [tbl_Contact]
INNER JOIN
	[dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[UserContactID] = [tbl_Contact].[ID]
WHERE([tbl_AdminUnit].[UserIsEnabled] = @P1 AND
	[tbl_Contact].[Name] LIKE @P2 + ''%'')
ORDER BY
	1 ASC',N'@P1 int,@P2 nvarchar(4000)',1,N'слепо'

"Андросов Дмитрий" написал:но там не то

Я вот тоже не нашел :)
Похожие запросы есть в Users, LicenseManager, но вот точно такого же не было

"Андросов Дмитрий" написал:поищите UserIsEnabled с помощью GREP

к сожалению эта штука ищет только в scr_
а вот в sq_ увы...

"Александр Кудряшов" написал:Похожие запросы есть в Users, LicenseManager, но вот точно такого же не было

хехех. еще бы уметь его находить...

этот запрос выполняется перед function wnd_MainOnPrepare(Window). Как я понимаю, его и ядро юзает...

Выполняется он при старте перед:

exec sp_executesql N'SELECT
	[tbl_SystemSetting].[ID] AS [ID],
	[tbl_SystemSetting].[Code] AS [Code],
	[tbl_SystemSetting].[ValueTypeID] AS [ValueTypeID],
	[tbl_SystemSetting].[StringValue] AS [StringValue],
	[tbl_SystemSetting].[FloatValue] AS [FloatValue],
	[tbl_SystemSetting].[IntegerValue] AS [IntegerValue],
	[tbl_SystemSetting].[BooleanValue] AS [BooleanValue],
	[tbl_SystemSetting].[DateTimeValue] AS [DateTimeValue],
	[tbl_SystemSetting].[DictionaryRecordID] AS [DictionaryRecordID],
	[tbl_SystemSetting].[EnumItemID] AS [EnumItemID],
	[tbl_SystemSetting].[IsCaching] AS [IsCaching]
FROM
	[dbo].[tbl_SystemSetting] AS [tbl_SystemSetting]
WHERE([tbl_SystemSetting].[Code] = @P1)',N'@P1 nvarchar(4000)',N'UpdateActiveSessionPeriod'

Так это... раз уж во все тяжкие (с)
Дебаггер в scr_Main и по шагам идем, ждем появления в профайлере заветных строчек

"Александр Кудряшов" написал:

Так это... раз уж во все тяжкие (с)

Дебаггер в scr_Main и по шагам идем, ждем появления в профайлере заветных строчек


Александр, а есть код выполняющийся перед wnd_MainOnPrepare?

"AlexLS" написал:а есть код выполняющийся перед wnd_MainOnPrepare?

Это уже пограничная область знаний, тут То Самое Ядро может что-то вызывать. Это за пределами моих знаний:smile:
Там раньше окно авторизации и проверка лицензии как раз идет, окно авторизации вроде бы в конфигурации от греха подальше спрятали

"Александр Кудряшов" написал:Там раньше окно авторизации и проверка лицензии как раз идет

она и есть, наверняка, проверка лицензии... Где еще может понадобиться контрагент пользователя? А значит ничего с этим не сделаете. Вам стоит по этому вопросу обращаться напрямую в тех поддержку, причем желательно сразу на кого-нибудь из старожилов с третьей линии выходить :wink: Но, как правило, по всем вопросам, связанным с лицензиями все заканчивается заявлением, что механизм лицензирования закрыт и сакрален :lol:

"Александр Кудряшов" написал:тут То Самое Ядро может что-то вызывать

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

Кстати, оно же (запрос) вызывается и Outlook'ом...

"Андросов Дмитрий" написал:по всем вопросам, связанным с лицензиями все заканчивается заявлением, что механизм лицензирования закрыт и сакрален

Дмитрий, мне кажется что лицензии врядли вьюхой проверять будут, скорее всего обращались бы напрямую к tbl_Account и, так же кажется, что разработчики Террасофта, все-таки не настолько ... (тут каждый сам себе додумает), чтобы такой идиотский код. Хотя, возможно, и у них есть отдельные личности, к примеру разработчики лицензирования :smile:
В принципе, в недалекой перспективе, предполагаем переход на TSv7 и эта тайна может так и остаться не разрешенной, хотя кто знает, может на смену мне прийдут новые :biggrin: с этим же вопросом!

Кстати, очередной банальный (уж простите) вопрос: если выгрузить все сервисы в файлы и потом какой-нить утилиткой "поиск текста в xml" пройтись, тогда шансы на поиск увеличатся?

"AlexLS" написал:чтобы такой идиотский код

Ход абсолютно верен.
У простых пользователей НЕТ доступа к tbl_Account, а есть доступ только к vw_Account.
И проверка лицензии не то, ради чего стоит ломать имеющийся движок обращения к данным.

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

Да, может и так... поискал в sq_ по слову "UserIsEnabled" нашлось в sq_AdminUnit, sq_Contact, sq_ContactInTask, sq_User

Судя по Grep-поиску в скриптах и нахождению етого слова в wnd_LicenseManagerScript ... закрываю тему, благо ясно что этот код зашит

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

Добрый день!
Террасофт 3.3.2.252
У некоторых пользователей в реестре продуктов не отображаются некоторые продукты. (в настройках доступа к группам таблицам права у этих пользователей на чтение продуктов имеются) и какие-то продукты в реестре отображаются. Соответственно те продукты, которые не отображаются в реестре продуктов отсутствуют и в деталях договоров (строки есть,даже суммы есть, а названий продуктов нет)
В чем может быть сбой? Как то возможно отредактировать права доступа на отдельные продукты?

Нравится

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

Олеся, Вам необходимо раздать права доступа на существующие продукты (те, которые не отображаются у пользователей). Права на существующие записи распределяются через деталь [Доступ].
Т.е. Вам необходимо:
1. Под пользователем с правами администратора авторизоваться в Terrasoft.
2. Перейти в раздел [Продукты]. Через деталь [Доступ] изменить уровень прав для пользователей на требуемые продукты.

Если таких записей много, обратите внимание на скрипты: 1 и 2

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

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

Нравится

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

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

Для изменения вида отображения колонок для всех пользователей необходимо внести изменения в страницу реестра раздела (на файлах во вложениях приведен пример на разделе "Контакты").

Вам необходимо перейти в "Инструменты" -> в раздел "Конфигурации", из элементов раздела Вам необходимо выбрать страницу реестра необходимого раздела (см. файл во вложении) и выполнить команду изменить.
В открывшемся окне Вы увидите общий реестр записей раздела, который можно изменить (добавить новые колонки, изменить ширину колонок и т.д). После внесения изменений, сохраните и опубликуйте страницу.

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

Спасибо за оперативный ответ.

Однако, не совсем понятно как быть с пользователями, у которых не доступен функционал раздела "Инструменты". Либо же настройки применяются ко всем пользователям после очистки профиля администратора?

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

Очистка профиля администратора очистит только персональные настройки данного администратора.

Спасибо

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

Alexander, выполните дополнительно следующие действия:
1. В странице реестра установите для колонки элемента DataSource признак "Отображать в реестре":
/system/files/14-01-2014_19-23-41.png
2. Опубликуйте изменения. Очистите профиль.

Наталия, спасибо. Все получилось.

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

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

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

Первоначальный вариант предназначен для редактирования визуального представления реестра записей в разделе (ширина столбцов, их порядок и т.п.). Добавление новых колонок в области структуры и свойств элемента DataSource определяет, какие данные из таблиц БД будут загружены для раздела (GridPage).

Теперь понял. Смутил пункт контекстного меню "Настройка колонки".
Спасибо.

Показать все комментарии
Техподдержка пишет:
Дмитрий Александрович, такое понятие как перевод выполнения БП на другого пользователя отсутствует.
Сделать так, чтобы процесс начал выполняться от лица другого пользователя можно только используя элемент «Задача» и устанавливая ответственного в задаче.
Однако в таком случае будет наблюдаться следующая ситуация: у пользователя, который запустил БП, отобразится задача, где автор – другой контакт. Тот кто выполнит задачу и будет дальнейшим владельцем БП.

Уверен, многие так или иначе задавались тем же вопросом.
Я потратил на это день, но вроде бы решил задачу.

Сделал WorkflowAction под названием "WorkflowTransfer". Как всегда большую часть скриптов взял у самих же Террасофт (из действия wa_OpenWindow).
Как работает:
1) Открывается окно wnd_SelectData с датасетом ds_Owner, выбирается новый ответственный
2) посылается notify обратно на WorkflowItem
3) Меняется (Edit() - присвоение - Post()) ответственный в датасете элемента БП (ItemDataset)
4) элемент закрывается с результатом Отменено, но уже на нового ответственного
5) новый ответственный в разделе процессов нажимает "Выполнить шаг"
6) проверяется соответствие ответственного по элементу текущему пользователю - если да, процесс продолжается, если нет - опять выбор нового ответственного.
workflowtransfer.rar

У меня, на версии 3.4.1 XRM в одной (пока) конкретной ситуации работает.
Считаю, что решение в стадии BETA и буду благодарен за фидбек и участие в тесте

Нравится

Поделиться

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

Весь секрет, на самом деле, в том, чтобы

3) Меняется (Edit() - присвоение - Post()) ответственный в датасете элемента БП (ItemDataset)

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

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

Добрый день!

БД Оракл, Террасофт 3.3.2.266

После поднятия бекапа (используя скрипты https://community.terrasoft.ua/blogs/4524) пытаюсь добавить нового пользователя. Он подозрительно быстро создается. Создание происходит без ошибок. Когда пользователь пытается логиниться, то получаем ошибку открытия источника данных ORA-00942: table or view does not exist. В отличие от других пользователей у вновь созданного нет прав ни на какие объекты. Почему нормально не отрабатывает процедура создания пользователя и как восстановить ее работоспособность?

Нравится

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

По указанию техподдержки выполнил скрипт scr_ResaveTables (13 часов выполнения, это немыслимо). После этого пользователи стали создаваться правильно с необходимыми им правами. В принципе вопрос снят, но к поведению скрипта восстановления из бекапа есть еще вопросы, поэтому отпишусь в указанной выше теме.

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

Раздел [Журнал изменений БД] доступен только для пользователя с правами системного администратора, если же Вам необходимо отображать данный раздел для всех пользователей, то Вам необходимо в TSAdmin.exe найти скрипт scr_Main и закомментировать строку, как показано ниже.

//amiToolsDatabaseLog.IsVisible = IsAdmin;

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

Чтобы для конкретной группы пользователей разрешить доступ к журналу изменений, в скрипте scr_Main закомментируйте строку:
//amiToolsDatabaseLog.IsVisible = IsAdmin;

В скрипте scr_Main реализуйте следующий код:
 
function IsUserInGroupExists(UserID, GroupName) {
         var Dataset = GetSingleItemByCode(UserInGroupDatasetUSI);
         ApplyDatasetFilter(Dataset, 'UserID', UserID, true);
         Dataset.Open();
         try {
                   while (!Dataset.IsEOF) {
                            if (Dataset.Values('GroupName') == GroupName) {
                                      return true;
                            }
                            Dataset.GotoNext();
                   }
         } finally {
                   Dataset.Close();
         }
         return false;
}

amiToolsDatabaseLog.IsVisible = IsAdmin || IsUserInGroupExists(Connector.CurrentUser.ID, 'Менеджеры');;

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

Нравится

Поделиться

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

Есть более изящное решение этой задачи.
В scr_Access (по крайней мере, в 3.3.0) есть функция GetIsCurrentUserHas(RecordAdminUnitID), которая определяет вхождение искомого объекта системы (например, группы пользователей) в список объектов системы, с которыми связан текущий пользователь системы.
Входящий параметр - ID объекта системы (группы пользователей) из tbl_AdminUnit. Функция возвращает TRUE или FALSE.
Таким образом, вхождение пользователя в группу можно определить всего двумя строками:

var UserGroup = /* ID группы пользователей из tbl_AdminUnit*/;
var CurrentUserInGroup = GetIsCurrentUserHas(UserGroup);
Показать все комментарии