Вопрос:
Как запретить доступ сотруднику на просмотр детали Журнал изменений в разделах?

Решение:
Нужно внести изменения в функцию DoShowChangesLogDetail скрипта scr_BaseWorkspace, и дописать проверку на то, что является ли текущий пользователь администратором

if (!Connector.CurrentUser.IsAdmin) {
            return false;
}

Данный скрипт реализует следующее: пользователям не будет отображаться деталь [Журнал изминений], только администратору будет доступна данная деталь.

function DoShowChangesLogDetail(CustomGridTable) {
      if (!Connector.CurrentUser.IsAdmin) {
            return false;
      }
      if (Assigned(CustomGridTable)) {
            BaseWorkspace.GridTable = CustomGridTable;
            return true;
      }
      var ShowChangesLogDetail = false;
      try {
          try {
            BaseWorkspace.GridTable =
                        BaseWorkspace.GridDataset.SelectQuery.Items(0).FromTable;
            ShowChangesLogDetail = BaseWorkspace.GridTable.IsTrackChanges;
            } catch(e) {
            }
      } finally {
            return ShowChangesLogDetail;
      }
}

P.S После того как опубликовал нашел тему Татьяны Адамчук
Как сделать доступным "Журнал изменений БД" для конкретной группы пользователей
http://www.community.terrasoft.ru/blogs/2718
Предлагаю также ознакомиться с альтернативным решением

Нравится

Поделиться

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

Начиная с версии 3.4.0 управлять отображением полей в реестре записей детали [Журнал изменений] можно установив настройку «Отображать в реестре».

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

  1. Перейти в меню [Файл] - [Настройки] - [Журнал изменений БД];
  2. Выбрать таблицы и поля таблиц по которым необходимо отслеживать изменения. Для того, чтобы поля отображались в реестре записей детали [Журнал изменений], следует установить признак «Отображать в реестре» :
    a13

Нравится

Поделиться

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

Добрый день.

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

Ознакомился с логикой работы журнала: https://community.terrasoft.ua/forum/topic/2345
Создание триггеров я еще могу изменить,
однако есть вопросы по работе приложения:
Цытата п.2:
"При сохранении такой таблицы создается специальная таблица tbl_MyTableLog, в которой создаются все поля основной таблицы..."

А если Мне нужно другую структуру. Создание таблицы tbl_MyTableLog делается в конфигурации или на уровне ядра?. Как это обойти?

Нравится

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

Здравствуйте Руслан,
Создание таблицы tbl_XXXLog происходит средствами ядра при установке галочки
1
и последующего сохранении таблицы, по сути отрабатывает хранимая процедура tsp_TableTrigger которая по сути пересоздает триггера и таблицы логирования

Подобная тема обсуждалась в http://www.community.terrasoft.ru/forum/topic/5602

Также опишите более подробно Вашу задачу.
Простым решением будет редактирование триггеров таблицы, таким образом что бы Вы писали изменения в выделенную таблицу необходимые строки после чего подменить сервис tbl_XXXLog на вашу таблицу. Но тут возникнут проблеммы если таблицу пересохранить.

Спасибо Алексей.

Все дело в том что средствами ядра практически создается копия логгируемой таблицы. Так?

У меня задача использовать свои поля, с другими названиями, которые будут содержать другие данные.
Триггеры же мне дадут возможность управлять данными. но не механизмом создания таблиц.
Можно конечно создать структуру таблицы tbl_XXXLog как мне нужно, но ведь она при первом же изменении чек боксов - пересохраниться.

Руслан, в частном случае вы можете решить задачу написав исключения в хранимых процедурах tsp_CreateDeleteTrigger,tsp_CreateUpdateTrigger так что бы в случае этой таблицы таблица tbl_XXXLog не пересоздавалась, это можно сделать дописав в тело хранимых процедур проверки вида :

  if (@Table = 'tbl_Account')
  begin
    return
  end
Показать все комментарии

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

Terrasoft CRM, версия 3.3.2.240.

Делаю настройку журнала изменений для раздела. В списке настройки поставила галочки всем полям.
В детали отобразились все поля кроме 2х полей типа enm, хотя галочки у них стоят.

Подскажите, пожалуйста, есть ли возможность отслеживать эти поля?

Нравится

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

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

А может дело вообще в чем-то другом...

Светлана, не смогла воспроизвести описанную Вами проблему на версии 3.3.2.240
Проверьте, установлен ли для полей, по которым не отслеживаются изменения, признак "Отслеживать изменения" в сервисе таблицы:
1

Наталия, да, галочки для этих полей стоят.
Заметила, что у вас в таблице тип стоит Enum. У меня стоял "уникальный идентификатор", а в датасет уже было указано, что это enum.

Сделала как у вас:
enum

И поля в детали появились, но только айдишники

fields

Светлана, с действиями, которые необходимо выполнить для того, чтобы вместо идентификаторов отображались соответствующие им названия, Вы можете ознакомиться в теме http://www.community.terrasoft.ua/forum/topic/3957#comment-18062
Ключевая идея заключается в том, что в таблице журнала изменений по разделу (например, tbl_CampaignLog) для поля типа перечисление необходимо вручную указать нужное перечисление.

Посмотрела эту тему, там рекомендуется внести изменения в scr_DatabaseLogUtils, но т.к у меня более новая версия, то у меня уже эти изменения внесены.

Плюс заметила, что если в таблице ставить тип полю еnum, поля начинают отображать айдишники не только в журнале изменений, а еще и в самом гриде раздела.

Светлана, по итогам личной переписки, мы временно снимаем данные вопрос.
В случае если у вас возникнут дополнительные вопросы, обращайтесь в тех. поддержку компании Террасофт по e-mail support@tscrm.com

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

Привет всем.

Наблюдаю у заказчика странное поведение ЖИ.
Делаю изменение в наблюдаемом объекте, перехожу в ЖИ и не наблюдаю логирования сделанных изменений. Чтобы увидеть обновления журнала приходится либо обновлять основной грид вручную, либо задействовать фильтр по категориям "Разделы" или "Справочники".
Такое поведение предусмотрено? Если предусмотрено, то на какое событие в каком сервисе можно повесить обновление датасета журнала?
Спасибо.

Версия клиента 3.2.0.60.

Нравится

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

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

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

Примеры прикреплены к сообщению.

Спасибо, Татьяна! Попробую.

Татьяна, функции вроде amiAccountsOnExecute для DatabaseLog в скрипте scr_Main нет.

Не хочется использовать таймер — всё-таки обновление требуется производить именно при переходе к разделу, что может происходить как раз в день, так и каждые 10 секунд.

"Працюк Сергей" написал:Татьяна, функции вроде amiAccountsOnExecute для DatabaseLog в скрипте scr_Main нет.
Не хочется использовать таймер — всё-таки обновление требуется производить именно при переходе к разделу, что может происходить как раз в день, так и каждые 10 секунд.

amiAccountsOnExecute "привязан" ко всем кнопкам разделов, достаточно в этой функции сравнить значение переменной WorkspaceUSI с нужным разделом и обновить его.
--------------------------------------------
Лабитек
Центр разработки приложений

Я должен в функцию, обслуживающую "Контрагенты" добавить обновление "Журнала Изменений"?

Да, потому что эта функция вызывается для любой кнопки в меню разделов.
Напишите debugger в начале функции - и в отладчике увидите, что какой бы раздел Вы не выбрали, всегда попадаете в этот обработчик. А дальше, в конце обработчика добавляете что-то такое:

    if (WorkspaceUSI == 'код раздела')
    {
        var CurrentWorkspaceWindow = wndWorkspace.Window;
        if (!CurrentWorkspaceWindow) {
            return;            
        }
        var BaseWorkspaceScript = CurrentWorkspaceWindow.ScriptControl.CodeObject.scr_BaseWorkspace;
        if (!BaseWorkspaceScript) {
            return;
        }
        BaseWorkspaceScript.RefreshWorkspace();
    }

--------------------------------------------
Лабитек
Центр разработки приложений

Спасибо за решение, Валерий! Я правильно понимаю, что у меня нет возможности создать свою функцию для DatabaseLog и привязать её к событию кнопки меню разделов?

Если не секрет, с чем связано такое положение вещей? Как это выглядит в новых версиях?

Можно создать и свой обработчик для кнопки, но лучше обойтись минимальными корректировками существующего.
То, что обработчик один на все кнопки, связано с тем, что логика работы при выборе раздела одинакова, и нет смысла делать на каждую кнопку свою функцию.
В разных версиях Террасофт текст функции выглядит по-разному, но по-прежнему один на все кнопки :)
--------------------------------------------
Лабитек
Центр разработки приложений

Всё, понял. Посмотрел в wnd_Main привязку к amiAccountsOnExecute и до меня дошло. Никакого исключительного отношения к "Контрагентам" эта функция не имеет, она действительно общая для всех пунктов меню, а имя ей присвоено автоматически и его просто никто не стал исправлять.

Думаю, это не только меня собьёт с толку.

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

В детали к договору "Журнал изменений" новое поле перечисления отображается как идентификатор перечисления.
Не могу разобраться как ему присвоить имя из перечисления?
Уверен это какая-то мелочь. Может кто знает?

Нравится

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

а в датасете у вас поле правильно создано?

Вы, наверное, с типом поля ошиблись.

Да нет, не ошибся, поле - перечисление...
И в реестре договоров в колонке этого поля отображается Name.
А вот в Журнале изменений отображается ID.
Может его нужно ещё где-то в датасете Журанала добавить?

А в таблице для этого поля перечисление указано?

"Глова Сергей" написал:А в таблице для этого поля перечисление указано?

Да, думаю без таблицы не работало бы -
"Швец Александр" написал:в реестре договоров в колонке этого поля отображается Name.

Может баг в журнале? счас проверю на своей базе:wink:

ООО "Лайнсервис"
www.ls-crm.ru

Попробовал включить логирование поля Пол в Контактах (перечисление, попавшееся на глаза первым) - так оно у меня в закладке Журнал изменений вообще не отображается никак:sad:, хотя другие поля - показывает. Версия 3.3.1.47
Опыт пока не удался

ООО "Лайнсервис"
www.ls-crm.ru

"Швец Александр" написал:Да, думаю без таблицы не работало бы

Почему не работало. Оно бы работало и симптомы были как-раз такие как у Вас.

"Александр Кудряшов" написал:Попробовал включить логирование поля Пол в Контактах (перечисление, попавшееся на глаза первым) - так оно у меня в закладке Журнал изменений вообще не отображается никакSad, хотя другие поля - показывает. Версия 3.3.1.47
Опыт пока не удался

Спасибо за попытку, забыл написать
версия 3.3.1.36 + FB.

Кстати мне стало интересно - это фича такая, что значения перечислений (мой пост выше, про Пол Контакта) не показываются в Журнале? У кого-нибудь есть работающая данная возможность на свежих версиях?

ООО "Лайнсервис"
www.ls-crm.ru

"Александр Кудряшов" написал:Кстати мне стало интересно - это фича такая, что значения перечислений (мой пост выше, про Пол Контакта) не показываются в Журнале? У кого-нибудь есть работающая данная возможность на свежих версиях?

Только что проверил у себя на 3.3.1 - фича присутствует :)

--
www.it-sfera.com.ua

Для того что бы перечисление нормально показывалось в Журнале изменений, необходимо что бы в таблице это поле было с типом Перечисление и было правильно указано для него перечисление. Это точно работало на 3.2.1 MS SQL.

"Раловец Ольга" написал:а в датасете у вас поле правильно создано?

датасет здесь не причем. Журнал изменений строится по сервису таблицы.

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

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

"Агутин Алексей" написал:Для того что бы перечисление нормально показывалось в Журнале изменений, необходимо что бы в таблице это поле было с типом Перечисление и было правильно указано для него перечисление. Это точно работало на 3.2.1 MS SQL.

Может и работало, но на указаных конфигурациях, к сожалению, не работает (включая выше изложенные условия+галочка "отслеживать изменения").

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

Ну-ну :)

:) как раз в Контактах для поля Пол это и работает у меня . На новых версиях не проверял

поле "Пол" у меня тоже не отоюбражается в 3.3.1.47, но при его изменении запись появляется в журнале

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

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

"Александр Кудряшов" написал:"Пол" в данной ситуации просто пример, естессно

Проверил на своей 3.3.1.36+FB
Журнал изменений поле "Пол" тоже не отображает...

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

Сейчас логирование полей типа перечисление не поддерживается.

Это связано с тем, что логирование ведется с помощью триггеров, где нету доступа к сервисам конфигурации. Поэтому нельзя получить отображаемое значение такого поля (нельзя получить с помощью запроса в триггере).

Вот и разобрались:smile:

ООО "Лайнсервис"
www.ls-crm.ru

"Александр Кравчук" написал:Это связано с тем, что логирование ведется с помощью триггеров

Не совсем понятно почему. Значение в поле изменилось с 'ID1' на 'ID2'. Триггер добавил запись в таблицу логирования (ну или что он там делает). Сейчас, я так понимаю это делается. А отобразить - это уже совсем другое дело и к триггеру отношения не имеет.

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

--
www.it-sfera.com.ua

"Швец Александр" написал:В детали к договору "Журнал изменений" новое поле перечисления отображается как идентификатор перечисления.

по крайней мере этот способ логирования объясняет, почему появляются GUID вместо названий
А "пол" видимо просто выключили как-то в базовой версии из логирования, чтобы GUID не лезли. Как уже говорилось - перечислений не так уж и много в системе...:smile:

ООО "Лайнсервис"
www.ls-crm.ru

"Виталий Ковалишин aka samael" написал:Нужно еще дополнительно смотреть в основном сервисе какое именно перечисление используется...

Кому? Триггеру? Логирование получается уже работает. не работает отображение. Даже не так. Не правильно строится датасет, данные которого отображаются в журнале. Разве его тригер строит? Он же не умеет работать с сервисами.

Я не о триггере! Это понятно!
Я о датасете, который строит деталь.

--
www.it-sfera.com.ua

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

Так что можно ожидать эту доработку в будущих версиях.

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

доделываем в базовой коробке?

ООО "Лайнсервис"
www.ls-crm.ru

"Александр Кудряшов" написал:доделываем в базовой коробке?

А как же! :cool:

--
www.it-sfera.com.ua

"Александр Кудряшов" написал:доделываем в базовой коробке?

Доделаю в ядре. Ведь эти сервисы (SelectQuery и Dataset), которые используются для отображения данных из таблиц-логов, автогенерируются в ядре системы при сохранении таблицы.

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

Так там делов то - вместо одного датафилда другой создавать.

"Underscore a.k.a. _" написал:Так там делов то - вместо одного датафилда другой создавать.

Попробую сегодня. Если получится, то вскоре выйдет новый билд.

"Александр Кравчук" написал:Если получится, то вскоре выйдет новый билд

ждем известий:smile:

ООО "Лайнсервис"
www.ls-crm.ru

Реализовано в 3.3.2.

Для более ранних версий это можно реализовать самостоятельно.
При создании сервиса таблицы журнала enum-полю не проставлялся соответствующий enum. Его нужно проставить вручную в администраторе.
Так же, в scr_DatabaseLogUtils в процедуре BuildChangesLogWindow в цикле по полям нужно сделать чтобы enum-поля не пропускались. Например заменить:

if (TableField.SQLName.search(/ID$/ig) > -1) {continue}

на:

if ((TableField.SQLName.search(/ID$/ig) > -1) &&
    (TableField.SQLDataType != sdtEnum)) {
    continue;
}

Подскажите, как решить это же вопрос с названием продукта при логировании продуктов в счетах?

Стоило создать новый топик, это совсем другой вопрос.
У вас продукт при логировании продукта в счете отображается в качестве идентификатора в журнале изменений? Какая версия/сборка?

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

Раздел [Журнал изменений БД] доступен только для пользователя с правами системного администратора, если же Вам необходимо отображать данный раздел для всех пользователей, то Вам необходимо в 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);
Показать все комментарии

Здравствуйте.
Не могли бы вы объяснить, как работает механизм журнала изменений, и как правильно осуществить обращение к этим данным программно.

Нравится

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

Добрый день, Иван!

Работа механизма логирования достаточно сложна. Попытаюсь вкратце описать его работу.
Общие положения:
1. Механизм работает только для тех таблиц, в сервисах которых для таблицы и некоторых полей установлен признак "Отслеживать изменения". Обратите внимание, что признак нужно установить для таблицы и (обязательно) для некоторых полей.
2. При сохранении такой таблицы создается специальная таблица tbl_MyTableLog, в которой создаются все поля основной таблицы, плюс строковые поля для значений справочников. В этой таблице будут храниться старые значения записей. Ссылка на запись осуществляется по полю RecordID. В этой таблице также сохраняются удаленные записи.
3. Просмотр старых значений записи возможен в разделе в детали "Журнал изменений" либо в одноименном разделе. Самая "свежая" запись в спец.таблице не хранится, но отображается в журнале синим цветом (извлекается запросом с union из основной таблицы), чтобы пользователь мог видеть текущее значение записи.
4. Механизм работает для всех трех СУБД (MSSQL, Oracle, Firebird) и реализован на триггерах, поэтому срабатывает даже в случае работы с БД не из клиентского приложения. Запись сохраняется в истории только в случае, если было изменено хотя бы одно логируемое поле. Иначе запись в историю не попадает. В записях истории хранится информация о пользователях, создавших или изменивших запись, а также о дате-времени таких операций.
5. При необходимости обратиться к старым значениям необходимо создать запрос и набор данных для выборки таких значений. Сервис таблицы tbl_MyTableLog создается автоматически, запрос и набор данных создать несложно, отобразить все это в реестре или вывести в отчет - дело техники.
Думаю, на данном этапе информации достаточно.
Для освоения механизма рекомендую начать его исследование с простого примера, например, логировать таблицу какого-нибудь справочника.
Если возникнут вопросы - всегда рад помочь.

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

Да, совершенно верно, при сохранении логируемой таблицы сервисы tbl_MyTableLog и sq_MyTableLog, а также триггеры на основной таблице tbl_MyTable создаются автоматически.

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