Добрый день!

Нужно выполнить авторизацию из стороннего приложения, но этому препятствует технология CORS. Каким образом можно ее обойти?

Возникают такие ошибки:

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

Нравится

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

Нужно в IIS разрешить доступ с другого домена, как описано тут.

 

 

Добавил раздел CORS в секцию <system.webServer> файла web.config сайта как описано в инструкции, после чего сайт перестал работать - выходит ошибка сервера:

Кто нибудь сталкивался с этим? Как решить эту проблему?

 

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

Вернул. Сделал как описано тут. Но ошибка осталась или поменялась, вот такая выходит:

policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Такое сообщение и его причины обсуждаются тут.

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

Всем доброго времени суток. Версия 7.11.

На детали с редактируемым реестром можно добавлять кнопки (см. скриншот)

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

Добавил туда две дополнительных кнопки:

// Настройка действия [Открыть].
                        {
                            "className": "Terrasoft.Button",
                            "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "tag": "card",
                            "markerValue": "card",
                            "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
                        },
                        // Настройка действия [Открыть внешнюю ссылку].
                        {
                            "className": "Terrasoft.Button",
                            "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                            "click": {
								"bindTo": "openDoc"
							},
                            //"tag": "open",
                            //"markerValue": "open",
                            "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
                        },

С открытием - всё хорошо, поправил обработчик в функции editRecord. А где происходит перехват тега? Нужен полностью свой обработчик.

Вариант с "click" (в примере кода) - не сработал.

Нравится

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

Обычно обработчик этих кнопок указывается в настройке грида:

и в Conf.GridUtilities содержится метод. Туда в 1 параметр приходит тег

Данила, спасибо, помогло.

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

Доброго времени! 



У меня интересная задача)

Необходимо сменить ответственного у нескольких записей продаж.



Задача:

1. Поставить фильтр (допустим выдало 100 записей)

2. Нажать "Выбрать все" (показано что выбрано 100)

3. Снять 1 галочку (показано что выбрано 99)

4. Нажать "Изменить ответственного"



Методы:

var selectedRows = this.getSelectedItems();

var selectedRows = this.get("SelectedRows");



Возвращают Id только отображенных записей (29)!



Как получить ожидаемые 99 Id записей?

Нравится

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

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

Когда загружается реестр посылается один запрос (который оптимизирован и загружает не все записи, а 30 – если у вас 100000 записей то не будет накладки по производительности). Когда вы нажимаете «Выбирать все», то не произойдет загрузки всех записей(оптимизация описанная выше), а отправится отдельный запрос который просто вернет количество и обновит название кнопки (при дебаге в network это видно). Чтобы добиться требуемого результата нужно самостоятельно посылать запрос.

Тоже столкнулся с такой проблемой. Самое простое решение, которое я нашел - это использовать функцию, возвращающую запрос на получение записей для экспорта:

                    var esq = this.getExportToExcelEsq();

                    esq.rowCount = -1;

                    esq.getEntityCollection(function (response) {...}, this);

Можно посмотреть, как она работает и заменить её своей. Результатом запроса будут все выделенные записи (99 в Вашем случае).

 

Поправка: в 7.12.2 функция, возвращающая запрос, переехала, теперь так:

var esq = this.getGridDataInitializedEsq(true);

esq.rowCount = -1;

...

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

Добрый день.

Где-то в темах проскакивало взаимодействие php и odata. Решил сделать свой запрос на добавление контакта, запросы кросс-доменные, пример . Авторизация проходит(code=0), но данные в bpm не добавляются. в iis 500 ошибка.





<?php
$url = "http://localhost:8001/ServiceModel/AuthService.svc/Login";
$requestData["UserName"] = "User";
$requestData["UserPassword"] = "Password";
$jcres = json_encode($requestData);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $jcres);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($jcres))
);
$result = curl_exec($ch);
echo $result;
curl_close($ch);

//Запрос odata
$urlGetCardInfo = "http://localhost:8001/0/ServiceModel/EntityDataService.svc/ContactCollection";
$requestDataService["Name"] = "123";
$jcres = json_encode($requestDataService);
$ch = curl_init($urlGetCardInfo);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
$file = "cookie.txt";
$lines = file( $file );
$str =  $lines[6];
$prefix = "BPMCSRF";
$index = strpos($str, $prefix) + strlen($prefix);
$token = trim(substr($str, $index));
echo $token;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json;odata=verbose',
      'BPMCSRF:' .  $token,
        'Content-Length: ' . strlen($jcres))
);
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
curl_close($ch);

echo $jcres;

echo "
";
echo var_dump($result);
?>

 

Куки:

# Netscape HTTP Cookie File

# http://curl.haxx.se/docs/http-cookies.html

# This file was generated by libcurl! Edit at your own risk.

#HttpOnly_localhost    FALSE    /    FALSE    0    BPMLOADER    fnmuevt2z4bpsxmyookyy3g3

#HttpOnly_localhost    FALSE    /    FALSE    0    .ASPXAUTH    BCF0752E4949BD3D6EC56072B957CB5C1B9517D2F7C19B9C3F70E0BBA6ED4BD46FE55B0E90853EF5E88CD83EE9AA689C5595517AA5B7F7DF913873919C440E5ED7607A04F4C0C14D61216682067F860D1EC6DC3872811FFAF710CA7F8FC8A8B0C0F77A146D40447FBEE6629EC37546E4C7B08DAFFC8EA37F2F5D7AF522D1816B16A968A0BAAC80738D874AEE3C2A0A9730B7C7155430F3B033C6A934F56AF04FF659C62C191822CC743FEA070757841FF4C73B7FC67EFA5CE4C4B430CFA8E798B085E84BAD37C56D80FFBB9244AC5ED83DCF8052F30D442637EB668DD93B2A4C591382EC09F3A0CE8CB18C56BD327745A983E70A9D3F911439AE4173AF04849AA84713883CEB089AB5D9F89A324ADA0FC02CDA670B07FBCD0B10670FD9F6ADC8D58B7DB2E9A27CD49FE0DCB9E21AEDAD76EA95134024BACE86C9BDFAEB2A30FDC177927BFFF25A16AC80A3B37084D0D4067DBAFD992CB95E14BEC365E5CB26BA82CB393B

localhost    FALSE    /    FALSE    0    BPMCSRF    Ao/SdrXnBoquQZZ39643ue

#HttpOnly_localhost    FALSE    /    FALSE    1526629837    UserName    83|117|112|101|114|118|105|115|111|114 

Нравится

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

Добрый день, Евгений!

Вы пробовали создать такой-же контакт используя Fiddler? Тут есть инструкция: https://academy.terrasoft.ru/documents/technic-sdk/7-12/vypolnenie-zaprosov-po-protokolu-odata-s-pomoshchyu-fiddler-0

Также, хочу обратить внимание что если на сайте ключена Csrf-защита то куки стоит формировать следующим образом: Но это явно не причина ошибки, так как в результате бы вернулся статус код 403.

 

Через Fiddler

отправляю post http://localhost:8001/0/ServiceModel/EntityDataService.svc/ContactColle…

Accept: application/atom+xml

Content-Type: application/atom+xml;type=entry

Cookie: BPMCSRF=fBo.TKVbav4GK31oDrDQTu; BPMLOADER=c3wb3plqvydzx1rgfsy5mgst; .ASPXAUTH=CEE35EFBF41088EA3F2835F9509497C89CF69A9E856192FCC0C9CF74DD91D9A5D5AAF37048F2326F4AFC1C9FE051CE91DF622A5345F143761E4D6B42668043C96506AAED141C4FA97802D4992C3DF49F134750F147D6320D2899561B45FC468F66D531151A067788195CED937DD3192FAA0B3A804F01BBDBEA0C0BDFECB36277C3FABC5CE02474B1B5C21317D3FD2ED64F946504935FD19D09598CB65640AE332309D198200160CF53715714FB16DAD11B4B8FAB76204FCAA1A99B1F77D99E1AD804197342D8D3F7B8604BE9BCFC559029ED353C877190547E03C8F51AA780665361BF5EBE144A7A0E1E0911507B2027E71F7BE3D452AF4AEF6A74B2777546230FBB1236F088074EB2C7345157666D71E0D437489538D4F4D4CBFF82B36721B105CE2A96458E01AF0A9E010579B42532DF808B9EA0C9B3272C83283E74BF037C02029FBF65C2A84F3B25275F48F3DDA4C868C4EE;

BPMCSRF: fBo.TKVbav4GK31oDrDQTu;

Host: localhost:8001

Content-Length: 597

 

Тело 

<?xml version="1.0" encoding="utf-8"?>

<entry xmlns="http://www.w3.org/2005/Atom">

    <content type="application/xml">

        <properties xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">

            <Title xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">Title</Title>

            <Notes xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">mail@mail.ru</Notes>

            <OwnerId xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">410006E1-CA4E-4502-A9EC-E54D922D2C00</OwnerId>

        </properties>

    </content>

</entry>

 

Возвращает 403 ошибку, пользователю прав доступа на операции к Odata и объекту Contact для доступа к внешним сервисам дал.

В чем может быть проблема еще?

Кстати проверил через Fiddler запрос, который указан в первичном тексте вопроса на php

POST http://localhost:8001/0/ServiceModel/EntityDataService.svc/ContactColle… HTTP/1.1

Content-Type: application/json;odata=verbose

Cookie: BPMCSRF=uUgOi6S8fuXqmug7vK2Ixe; BPMLOADER=lbe4eo5r33xib5qzd4ilx0bo; .ASPXAUTH=9630392393DE5EA7C5C41399383A5C111A47ABD6DCE480276852590B03DBD938B354ACB488248FB6B2DE737C412A6CAD487A526C576BCAEA8D48B4751FB045606900009B81DCBACC54C4802571A4AF339B05F101E2993A6AD6D93708FC79FCDACAB6F7411105FC0E2A2D9AB123968243E02990824FC08B401999FFF8F5A7A1240AB69D56771E64F9495EEAB17F094FAB101016326A99081644034ABA4C64F797E974EC2D833037F7282F04E46D6FA8F04FFC85BFD9030D39916F99F082C122CEFE53EFF585FD40E913474A949B9E38601E86C0C4C921541B4082B0E9732B8645F73E508304ABFBC92D7BB581858040760374F25368001F2DEF1CE2458A0B4DC81352952FBBAEE05F59E4C9D330198361B929FF0A4D5392D4956CB7F46CD6B97D3D909A92A37D3FCA07AAD00396BB38F911BAA1DEEA23E53395A7C6D88009B148F468F2D237EF132055A71C8ABD923EA22460A916B38F17DE2DDB202622EEF54424D06F7B;

BPMCSRF: uUgOi6S8fuXqmug7vK2Ixe

Host: localhost:8001

Content-Length: 16

{"Name": "1233"}

Запись создается удачно. Почему тогда через php не работает? есть пример post на php для odata ?

Получилось.

$url_1 = "http://localhost:8001/0/ServiceModel/EntityDataService.svc/ContactCollection/";

$requestDataService["Name"] = "123";
$jcres = json_encode($requestDataService);
$ch5 = curl_init($url_1);
curl_setopt($ch5, CURLOPT_COOKIEFILE, 'cookie.txt');

//curl_setopt($ch5, CURLOPT_HTTPHEADER, array(
//    'Accept: application/json;odata=verbose'));

curl_setopt($ch5, CURLOPT_COOKIEJAR,'cookie.txt');
curl_setopt($ch5, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch5, CURLOPT_POSTFIELDS, $jcres);
curl_setopt($ch5, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch5, CURLOPT_HEADER   ,FALSE);
curl_setopt($ch5, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json;odata=verbose',
        'BPMCSRF: ' .$token,
        'Content-Length: ' . strlen($jcres))
);

$result5 = curl_exec($ch5);
curl_close($ch5);
Показать все комментарии

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



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





1. В BaseCommunicationDetail существует биндинг поля enabled на метод getCommunicationEnabled, но метод getCommunicationEnabled не вызывается.

2. Сможем ли мы в теории посмотреть в таком методе на параметр новизны записи?

Нравится

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

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

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

Этот метод достаточно сложно переопределить, так как он находится в BaseComunicationViewModel.

Проще переопределить метод getCommunicationItemViewConfig в BaseCommunicationDetail в котором модифицировать поле enabled у редактируемого поля.

А чтобы определить новый это объект создается или нет, можно в этой же детали добавить атрибут или переменную булеовго типа и переопределить метод addItem, в котором переменную (например, isNewItem) менять на true, тогда в getCommunicationItemViewConfig смотря на эту переменную вы определите дальнейшее поведение.

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

Всем доброго времени суток. Версия 7.11.

Вопрос - возможно ли в элементе "Вопрос пользователю" бизнес-процесса вывести в тексте рабочую ссылку? Попытка задать ссылку в формуле с помощью html-тегов:

"<a href='ya.ru' target='_blank'>Яндекс</a>"

пока привела только к такому результату:

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

Ещё лучше было бы вывести ссылку в тексте, например "Перейти на Яндекс?" А вообще изначальная идея - формировать ссылку на заданную запись в самой же системе, "Что делать с " + [#Продукт#] + "?"

Нравится

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

Денис, здравствуйте!

К сожалению, заголовок Вопроса пользователю не поддерживает html форматирование. Вы можете указать необходимую ссылку в подсказке пользователю. Тогда нажав на значок (i) пользователю откроется всплывающая подсказка с рабочей ссылкой.

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

Или же можно по аналогии сформировать ссылку на запись, примерный вид ссылки будет следующим:

"<a href = https://yourwebsite.bpmonline.com/0/Nui/ViewModule.aspx#CardModuleV2/Pr…"+[#Читать данные 1.Первый элемент результирующей коллекции.Id#].ToString()+">LinkBody</a>"

Но для корректной работы такой ссылке в подсказке необходимо проставить признак Компилируемый в процессе.

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

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

Заранее благодарен.

Станислав

Нравится

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

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

В схеме ContactCareerPageInAccount есть цепочка методов:

1) save - всё идёт от сохранения

2) getContactCareerCollection - выборка из детали

3) onGetSelectResult - дальнейшая обработка с вопросом пользователю

4) getSelectedButton - обработка ответа пользователя

5) onAnswerNo - здесь Current ставится в false

Сергей, подскажите, пожалуйста, немного детальнее.

Если я правильно понял - мне нужно:

1. Создать "Замещающий клиентский модуль".

2. В качестве родительского объекта выбрать "Страница редактирования карьеры контакта в контрагенте".

3. Скопировать весь код из "ContactCareerPageInAccount"

4. Изменить функцию "onAnswerNo", чтобы значение "Current" не менялось.

5. Сохранить все

После проделывания этой операции ничего не меняется. Пробовал варианты:

а) удалял строчку update.setParameterValue('Current', true);

б) менял строчку update.setParameterValue('Current', false); на update.setParameterValue('Current', true);

в) удалял полностью функцию "onAnswerNo"

г) в функции "getSelectedButton" вместо вызова функции "onAnswerNo" вызывал "onAnswerYes"

Реакции ноль. Подскажите, пожалуйста, что я делаю не так.

Заранее благодарен.

Копировать весь код из схемы ContactCareerPageInAccount не надо, достаточно поместить методы, которые будут замещены. В каком пакете у вас замещающая схема и какие там связи с другими пакетами? Ощущение, что система не видит эту схему. Ну и чистить кэш после любых изменений с клиентскими модулями.

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

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

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

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

Добрый день

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

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

Кто создаёт - Все сотрудники компании, кому дано право - системные администраторы.

Сотрудники находятся в разных орг. ролях (согласно региональному делению) но присутствуют в орг роли Все сотрудники компании.

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

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

И какой бп построить, чтобы отнять это право на существующие записи

Нравится

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

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

 

Чтобы забрать права у "Ответственного" Вам необходимо очистить поле "Ответственный" в замещающем объекте: https://prnt.sc/j3olvl



Для изменения прав на существующие записи можете воспользоваться приложением с Маркетплейс: Мастер настройки прав доступа

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

Добрый день!



Вроде, хотелось сделать совершенно стандартную вещь, но не пошло по стандарту:



необходимо в объекте Contact отлавливать изменение поля MobilePhone на сигнал ContactSaving.



Для этого по сигналу написали скрипт:



    var newMobilePhone = Entity.GetTypedColumnValue("MobilePhone");

    var oldMobilePhone = Entity.GetTypedOldColumnValue("MobilePhone");


    throw new Exception(newMobilePhone + " " + oldMobilePhone);

    return true;



Однако обе переменных newMobilePhone и oldMobilePhone  всегда принимают старое одинаковое значение.



Как получить актуальное новое значение этого поля?

Нравится

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

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

Все работает верно, поскольку Вы используете сигнал ContactSaving, то старое и новое значение это одно и тоже значение, поскольку транзакция еще не прошла. 

Если же использовать сигнал ContactSaved, то новое и старое значения будут разными.

 

В пакете Base вижу такой код на событие ContactSaving:



IsCurrentUserPhoroChanged = (Entity.GetTypedColumnValue<Guid>("PhotoId") !=

    Entity.GetTypedOldColumnValue<Guid>("PhotoId") && Entity.GetTypedColumnValue<Guid>("Id") ==

UserConnection.CurrentUser.ContactId);



И во многих других местах на Saving происходит проверка изменения поля как раз таким способом

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

Действительно, если взять и выполнить аналогичный пример для поля Name, то в результате получим сообщение с разными именами:

var newName = Entity.GetTypedColumnValue&lt;string&gt;("Name");
var oldName = Entity.GetTypedOldColumnValue&lt;string&gt;("Name");throw new Exception(newName + " " + oldName );

Решила посмотреть что происходит на самом деле, изменила поле Name и поле MobilePhone и отловила запросы профайлером и получила следующее

изначально происходит изменения имени, 

после изменяется телефон в таблице ContactCommunication, 

и только потом изменяться телефон в контакте. 

И потому, на этапе Saving значения старое и  новое одинаковые, поскольку изменения телефона происходит в рамках процесcа ContactSaved (пакет Base).

с ContactSaved получается еще интереснее...

Во-первых, когда сообщение выдается, то оба номера (старый и новый) идентичны

А во-вторых, теперь это сообщение выдается далеко не на каждое сохранение, то есть, ощущение, что ContactSaved срабатывает не всегда

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

Вы можете перейти в конфигурации в к процессу на объекте Contact пакета Base, и ознакомиться с логикой ContactSaved. 

Поле MobilePhone изменяется не в рамках сохранения контакта, а в рамках метода SynchronizeCommunication(), который вызывается после сохранения контакта.

Ещё довольно странное поведение из-за такой синхронизации. В бизнес-процессе совсем не отлавливается событие изменения поля MobilePhone. 

С другой стороны, количество Communication options с таким типом может быть больше 1, потому непонятно, какое из них синхронизировано с главным полем в карточке, и изменение какого из них отслеживать

 

 

Добрый день, 

Стартовый сигнал действительно не реагирует на изменение в контакте/контрагенте полей Email/Мобильный телефон. Это связано с базовой логикой синхронизации этих полей с деталью средства связи контакта/контрагента. Вы можете ознакомиться с логикой в конфигурации, если открыть процесс элемента Contact и ContactCommunication.

Для решения задачи можно создать дополнительный процесс, который будет срабатывать при добавлении/изменении записи непосредственно в объекте [Средство связи контакта/контрагента].

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

В какой то момент пропали настройки журнала изменений по контакту.

Как можно отследить изменение настроек аудита? Кто, когда?

Нравится

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

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

Обычно такие задачи решаются с помощью самого журнала аудита (не журнала изменений). Но сейчас в системе не логируется изменение настроек журнала изменений (я создала соответствующую идею в беклоге профильной команды). Список логируемых операций можно посмотреть тут: https://academy.terrasoft.ru/documents/studio/7-12/razdel-zhurnal-audita

В качестве обходного решения можно сделать следуюшее:

1. Для анализа текущей ситуации проанализировать логи приложения (там должны быть видны соответсвующие запросы) и сравнить с данными по сессиям пользователей.

2. На будущее реализовать собственный тригер на уровне БД, который будет писать в лог, если кто-то будет менять настройки журнала изменений.

Старун Юлия,

спасибо за развернутый ответ!

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

Настройка - по каким полям ведется логирование в таблицу SysContactLog.

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

        {
          "UId": "736c30a7-c0ec-4fa9-b034-2552b319b633",
          "Name": "Name",
          "CreatedInSchemaUId": "11ab4bcb-9b23-4b6d-9c86-520fae925d75",
          "ModifiedInSchemaUId": "4cbdc6f3-625d-4639-92bf-bb19d4c9d58e",
          "CreatedInPackageId": "66e9e705-64b4-4dda-925e-d1e05a389eb6",
          "DataValueTypeUId": "ddb3a1ee-07e8-4d62-b7a9-d0e618b00fbd",
          "RequirementType": 1,
          "IsTrackChangesInDB": true,
          "IsLocalizable": true
        },

Но вот на уровне базы данных это уже хранится в колонке MetaData таблицы SysSchema в не таком удобном виде. Там следует искать код Е16, чтобы понять, колонка с каким UID логируется:

Таким образом, триггер нужно вешать на таблицу SysSchema на колонку MetaData по тому объекту, который вы хотите отследить. И сохранять весь текст метаданных, а потом уже анализировать его вручную. Наверное, можно даже посмотреть, какой запрос отправляет система в БД при открытии страницы настроек журнала изменений - там наверняка есть встроенные механизмы парсинга этих данных.

В общем я постараюсь повысить приоритет реализации логирования этих изменений через журнал аудита средствами системы :)

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