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

function CopyRight(RecordID, NewRecordID) {

//      debugger;

        var Dataset = Services.GetNewItemByUSI('ds_Cashflow');
        ApplyDatasetIDFilter(Dataset, NewRecordID, true);
        Dataset.Open();
        Dataset.GotoFirst();
                                                         
               
var DoumentsRightsDataset = Services.GetNewItemByUSI('ds_CashflowRight');
                ApplyDatasetFilter(DoumentsRightsDataset, 'RecordID', Dataset.Values('ID'), true);
               
                DoumentsRightsDataset.Open();
                DoumentsRightsDataset.GotoFirst();
                while(!DoumentsRightsDataset.IsEOF)
                {
                        DoumentsRightsDataset.Delete();
                }
               
                DoumentsRightsDataset.Close();
                                           
                var CanRead = true;
                var CanWrite = true;
                var CanDelete = true;
                var CanChangeAccess = true;
                                                           
ProcessGiveRecordRightsToContact(Dataset, Connector.CurrentUser.ContactID, CanRead, CanWrite, CanDelete, CanChangeAccess);                                                         
                                                           
        Dataset.Close();  
          }

Предполагаю, что удаление прав может быть лишним. Надеюсь на помощь профессионалов.

Нравится

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

Здравствуйте, Дмитрий!

Ниже замечания по реализованной Вами функции.

1. Вам не нужен датасет ds_Cashflow. Вы же в функцию уже передаете ID записи, откуда хотите копировать права (RecordID), и ID записи, куда хотите копировать (NewRecordID).
2. Перед открытием датасета ds_CashflowRight для установки фильтра используйте переменную RecordID:
ApplyDatasetFilter(CashflowRightDataset, 'RecordID', RecordID, true);
3. Вам нужен ещё один экземпляр датасета ds_CashflowRight, куда Вы будете добавлять нужные записи. Например, назовем его NewCashflowRightDataset.
var NewCashflowRightDataset = Services.GetNewItemByUSI('ds_CashflowRight');
4. Удалять записи из CashflowRightsDataset, действительно, не нужно.
5. В цикле while нужно реализовать такой код:
NewCashflowRightDataset.Append();
NewCashflowRightDataset('ID') = Connector.GenGUID();
NewCashflowRightDataset('RecordID') = NewRecordID;
NewCashflowRightDataset('CanRead') = DocumentRightsDataset('CanRead');
NewCashflowRightDataset('CanWrite') = DocumentRightsDataset('CanWrite');
NewCashflowRightDataset('CanDelete') = DocumentRightsDataset('CanDelete');
NewCashflowRightDataset('CanChangeAccess') = DocumentRightsDataset('CanChangeAccess');
NewCashflowRightDataset.Post();
DocumentRightsDataset.GotoNext();
6. То, что ниже while не нужно. После цикла нужно закрыть оба датасета.

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

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

Копирование прав работает, но есть маленький нюанс:

Не подскажете как исправить? :)

Нужно в код, где Вы копируете права добавить ещё такую строчку:

NewCashflowRightDataset('AdminUnitID') = DocumentRightsDataset('AdminUnitID');

Cпасибо! Все работает.

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

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

Реализовал след. образом:

function CopyRight(RecordID, NewRecordID) {
 
//debugger;
 
 
	var CashflowRightDataset = Services.GetNewItemByUSI('ds_CashflowRight');
	ApplyDatasetFilter(CashflowRightDataset, 'RecordID', RecordID, true);
	var NewCashflowRightDataset = Services.GetNewItemByUSI('ds_CashflowRight');
	ApplyDatasetFilter(NewCashflowRightDataset, 'RecordID', NewRecordID, true);           
	NewCashflowRightDataset.Open();
	NewCashflowRightDataset.GotoFirst();
	//Чистим датасет от прав по умолчанию
                while(!NewCashflowRightDataset.IsEOF)
                {
                        NewCashflowRightDataset.Delete();
                }
    NewCashflowRightDataset.Close();
    NewCashflowRightDataset.Open();
	CashflowRightDataset.Open();
	CashflowRightDataset.GotoFirst();
	while(!CashflowRightDataset.IsEOF)
	{
		NewCashflowRightDataset.Append();
		NewCashflowRightDataset('ID') = Connector.GenGUID();
		NewCashflowRightDataset('RecordID') = NewRecordID;
		NewCashflowRightDataset('CanRead') = CashflowRightDataset('CanRead');
		NewCashflowRightDataset('CanWrite') = CashflowRightDataset('CanWrite');
		NewCashflowRightDataset('CanDelete') = CashflowRightDataset('CanDelete');
		NewCashflowRightDataset('CanChangeAccess') = CashflowRightDataset('CanChangeAccess');
		NewCashflowRightDataset('AdminUnitID') = CashflowRightDataset('AdminUnitID');
		NewCashflowRightDataset.Post();
		CashflowRightDataset.GotoNext();
	}
	CashflowRightDataset.Close();
	NewCashflowRightDataset.Close();
}

Здравствуйте, Дмитрий!

В Вашем коде есть ошибка.

Чтобы удалить все записи нужно после NewCashflowRightDataset.Delete(); выполнить NewCashflowRightDataset.GotoNext().

И ещё после цикла, где идет удаление закрывать не нужно. Эта строка лишняя:
NewCashflowRightDataset.Close();

Спасибо, сейчас подправлю :)

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

Добрый день!
У меня странная проблема. Я пользуюсь учеткой Supervisor, с сервера все отлично заходит. Но с другой машины заходить под этой же учеткой не хочет: выводит предупреждение "Ошибка открытия конфигурации.'Лицензия для модуля 'XXXX' не найдена'". Модули в тексте всегда меняются. Подобное наблюдал, когда лицензия истекает. Настройки к базе указаны верно, коннект есть. Лицензия на супервизора - конкурентная. Версия клиента та же, что и на сервере (бинарники те же).

Нравится

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

Добрый день,

первое, что необходимо выполнить в этом случае - перезаказать лицензии.

Спасибо за столько скорый ответ!
Но проблема, похоже, не в лицензиях.
Если в настройках конфигурации подключения к БД (даже с компьютера, с которого происходит успешное подключение) добавить к имени сервера (указать) номер порта, то он также будет успешно проходить тест на подключение к БД и так же будет при запуске приложения выводить предупреждение "Ошибка открытия конфигурации.'Лицензия для модуля 'XXXX' не найдена'"; а если порт убрать - то все становится ОК (естественно, справедливо это только для локальной машины, ибо с удаленной необходимо указывать порт, в противном случае - не может открыть соединение с SQL Server). Видимо лицензии чувствительны к имени сервера, где расположена база.
Проблему пока еще не решил.

"Евгений Дудка" написал:Видимо лицензии чувствительны к имени сервера, где расположена база

В этом и смысл сервера сессий для конкурентных лицензий. Смотрите что там прописано.
Настройка в менеджере лицензий во вкладке [Конкурентные и специальные] есть кнопка [Сервер сессии].

"Александр Кудряшов" написал:
В этом и смысл сервера сессий для конкурентных лицензий. Смотрите что там прописано.

Настройка в менеджере лицензий во вкладке [Конкурентные и специальные] есть кнопка [Сервер сессии].

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

Мне тогда надо перезаказать лицензии, но с произведенной настройкой в "Сервере сессий"?

Да, совершенно верно.

Огромное Вам спасибо!
Сделал согласно Вашим рекомендациям и посту #1 http://www.community.terrasoft.ru/forum/topic/8336 и с перезаказанными лицензиями все заработало.

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

Прошу помочь с проблемой. Может быть кто-то сталкивался. На одной клиентской машине при запуске клиента Террасофт версии 3.3.2.252 появляется ошибка Runtime error 216 at 40005CDE (на других компах ошибок нет). Т.е. щелкаем на ярлык для запуска ПО - окно авторизации не появляется, появляется сразу сообщение об ошибке. При нажатии на ОК в ошибки, окно ошибки закрывается и далее ничего не происходит.
Пробовали переустановить клиентскую часть. При удалении клиента опять появилась эта же ошибка. Пробовали установить клиента заново (поверх старого, не до конца удаленного), при установке - на этапе Регистрации файлов опять появляется ошибка Runtime error 216 at 40005CDE. Скриншот прилагаю.
ОС компьютера: Windows 7 Корпоративная SP1.

Нравится

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

Добрый день Татьяна!!!

перекопируйте вручную с рабочей машины полностью папку Terrasoft, установленну в Programm Files на тот компьютер, где у вас не может пройти инсталяция, создайте вручную ярлык для запуска клиента. Исполняемый файл для запуска клиента "TSClient.exe". На него и создаем ярлык. После запуска программы клиента, произойдет регистрация всех библиотек и запустится клиент.

Добрый день!

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

"Алексеева Татьяна" написал:При запуске вообще ничего не происходит

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

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

Здравствуйте! Подскажите пожалуйста, как можно увидеть SQL-запрос при выполнении

ApplySelectQueryFilter(SelectQuery, FilterName, ParamValue, Enabled);

т.е. не данные о запросе, как например

?SelectQuery
{...}
Caption: "sq_RMCGrid"
CoClassGUID: "{2E5AFA6A-F672-4BAA-891C-6E699C6D36E3}"
Columns: {...}
Connector: {...}
Description: ""

а сам запрос, чтобы работать с этим запросом в Microsoft SQL-редакторе.

Спасибо большое!!!

Нравится

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

Подскажите пожалуйста, как возмоно при выполнении

ApplySelectQueryFilter(SelectQuery, FilterName, ParamValue, Enabled);

захватить SQL - запрос.

т.е. не данную информацию: имя запроса и т.д.

?SelectQuery
{...}
Caption: "sq_XXX"
CoClassGUID: "{2E5AFA6A-F672-4BAA-891C-6E699C6D36E3}"
Columns: {...}
Connector: {...}
Description: ""
ID: "{C9814440-69B1-4682-8B37-DFDE4A134EEA}"

а сам запрос со всеми параметрами, чтобы работать с этим запросом уже в SQL_редакторе.

Спасибо!!!

Нравится

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

Добрый день!!!

на платформе Terrasoft 3.X на сколько я помню, написав в тексте кода "debagger" происходила точка останова. И в Админке (в отладчике) можно полностью развернуть весь SQL текст запроса.

"Власов Михаил Викторович" написал:написав в тексте кода "debagger" происходила точка останова

debugger;

либо sql server profiler вам в руки на сервере

Здравствуйте, Марина!

Если Вам нужен запрос с передаваемыми параметрами, тогда отловить его можно в SQL Profiler.

Также есть возможность запустить TSClient с ключом Profiler, как это сделать можно ознакомиться по ссылке.

"Савельева Алла" написал:Если Вам нужен запрос с передаваемыми параметрами, тогда отловить его можно в SQL Profiler.

См. SelectQuery.SQLText (скрин в файле)

А вот сами значения параметров да, в profiler

Здравствуйте Алла, Михаил и Александр. Спасибо вам большое!

Подключила SQL Server Profiler и отловила запрос.

Попробовала так же написав "debagger" в тексте кода, но не нашла SQLText.
Есть ли какие-то различия между версиями? У меня версия 3.2.0.90

На картинке, которую я прикрепила, между двумя красными линиями должен быть SQLText, но у меня нет.

"Марина Карапетян" написал:3.2.0.90

Версия уже "ретро", там возможно все :)
Этот реквизит появился, скорее всего, в 3.3.2

Хорошо Александр. Спасибо.

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

чтобы получить SQL запрос, используйте следующий код:

Connector.DBEngine.GetSelectQuerySQLText(Dataset.SelectQuery)

Спасибо Павел, получилось.

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

Уважаемые форумчане, подскажите пожалуйста...столкнулся с проблемой:
Для копирования прав доступа создал isq_CopyRight
Но выдает следующую ошибку: "Operand type clash: int is incompatible with uniqueidentifier", никак не могу разобраться. Опыта крайне мало, поэтому прошу помощи у профессионалов.

isq_CopyRight

INSERT INTO [dbo].[tbl_CashflowRight] ([ID], [RecordID], [AdminUnitID], [CanRead], [CanWrite], [CanDelete], [CanChangeAccess])
SELECT
        [tbl_CashflowRight].[CanRead] AS [CanRead],
        [tbl_CashflowRight].[CanWrite] AS [CanWrite],
        [tbl_CashflowRight].[CanDelete] AS [CanDelete],
        [tbl_CashflowRight].[CanChangeAccess] AS [CanChangeAccess],
        :OldRecordID AS [NewRecordID],
        :MyAdminUnitID AS [AdminUnitID],
        [tbl_CashflowRight].[ID] AS [ID]
FROM
        [dbo].[tbl_CashflowRight] AS [tbl_CashflowRight]
WHERE([tbl_CashflowRight].[RecordID] = :OldRecordID AND
        [tbl_CashflowRight].[AdminUnitID] = :MyAdminUnitID)

function CopyRight:

function CopyRight(OldRecordID, NewRecordID) {
        var InsertSelectQuery = GetSingleItemByCode('isq_CopyRight');
        var Columns = InsertSelectQuery.SelectQuery.Columns;
        var ConstColumn = Columns.ItemsByAlias('NewRecordID');
                ConstColumn.ColumnValue = NewRecordID;
        SetParameterValue(InsertSelectQuery.Parameters, 'OldRecordID', OldRecordID);
        SetParameterValue(InsertSelectQuery.Parameters, 'MyAdminUnitID',
        Connector.CurrentUser.ID);
                try {
        InsertSelectQuery.Execute();
        }
        catch(e) {
        CatchException(e);
        }
        }            

Нравится

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

Добрый день Дмитрий!!!

ваш запрос выглядит неверно. Вот правильный запрос на копирования прав:

INSERT INTO [dbo].[tbl_CashflowRight] ([ID], [RecordID], [AdminUnitID], [CanRead], [CanWrite], [CanDelete], [CanChangeAccess]) 
SELECT
        [tbl_CashflowRight].[ID] AS [ID],
        :OldRecordID AS [RecordID],
        :MyAdminUnitID AS [AdminUnitID],
        [tbl_CashflowRight].[CanRead] AS [CanRead],
        [tbl_CashflowRight].[CanWrite] AS [CanWrite],
        [tbl_CashflowRight].[CanDelete] AS [CanDelete],
        [tbl_CashflowRight].[CanChangeAccess] AS [CanChangeAccess]
FROM
        [dbo].[tbl_CashflowRight] AS [tbl_CashflowRight]
WHERE([tbl_CashflowRight].[RecordID] = :OldRecordID AND
        [tbl_CashflowRight].[AdminUnitID] = :MyAdminUnitID)

у вас Дмитрий поля в SELECT местами перепутаны. Порядок должен соответствовать порядку вставляемых полей

Спасибо большое!
Сейчас попробую :smile:

Ошибки не возникло, однако копирование прав не произошло :(
Не подскажете, где я мог еще ошибиться?

Дмитрий в Profiler SQL сервера выполните трассировку и посмотрите какой запрос формирует приложение к серверу. Вручную его исполните и увидите почему у вас непроизошла вставка новых данных.

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

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

Не могу понять как блокируются кнопки редактирования wnd_OfferingInInvoiceGridArea в деталях реестра Счет. Проверял что возвращают базовые функции проверки прав: линцезия true, insert true и т.д. Если запускаю на прямую: "C:\Program Files (x86)\Terrasoft\Bin\TSClient.exe" \wnd=wnd_OfferingInInvoiceGridArea кнопки активны, только окно нерабочее, в него должны параметры прокидываться. Снимал флаги администрирования на tbl_OfferingInInvoice, была пустая группа таблиц проставлял Продукт не помогает.

Ни кто не знает в чем может быть проблема? Может из кода их руками разблокировать?

P.S. версия террасофта 3.4.0.190

Нравится

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

Добрый день Михаил!!!

кнопки на детали "Продукты в счете" становятся Активными после того как будет создан счет, и после того как пользователь выделит Счет, в реестре Счетов. Только после этого кнопки Добавить, Редактировать, Удалить становятся активными

"Власов Михаил Викторович" написал:

Добрый день Михаил!!!

кнопки на детали "Продукты в счете" становятся Активными после того как будет создан счет, и после того как пользователь выделит Счет, в реестре Счетов. Только после этого кнопки Добавить, Редактировать, Удалить становятся активными


Добрый день.

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

Какие изменения выполняли с данной схемой "wnd_OfferingInInvoiceGridArea", какие права установлены в схема таблицы "tbl_OfferingInInvoice". В профилере анализировали SQL запросы какие клиент посылает серверу? и какие ответы получает? данные вопросы анализировали. Так как если деталь создана и проинициализирована верно, кнопки Добавить, Изменить, Удалить блокироваться сами по себе не могут.

Плюс я бы проанализировал саму форму wnd_OfferingInInvoiceGridArea и проверил привязан ли Датасет к dlData, определены ли колонки, плюс в самом Датасете "ds_OfferingInInvoice" галочки "Добавить", "Редактирование", "Удаление", случайно не сняты?

"Борисов Михаил Евгеньевич" написал:конкретный счет

Если финальное состояние счета, может и блокируется умной логикой... уже не припомню сейчас есть ли оно в коробке

Или у вас эта деталь всегда заблокирована?

Александр, да деталь всегда заблокирована, под supervisor разблокирована.

Михаил, на таблице tbl_OfferingInInvoice сняты все галочки администрирования и выставлена группа таблиц Проекты(раньше там было пусто, но и тогда все было заблокировано). Сделал трасировку, не увидел ничего интересного:

exec sp_executesql N'exec [dbo].[tsp_ColumnsRightsEx] @objname = @P1',N'@P1 nvarchar(4000)',N'vw_Offering'
 
exec sp_executesql N'SELECT
	----------------
FROM
	[dbo].[tbl_OfferingInInvoice] AS [tbl_OfferingInInvoice]
LEFT OUTER JOIN
	[dbo].[tbl_Currency] AS [tbl_Currency] ON [tbl_Currency].[ID] = [tbl_OfferingInInvoice].[CurrencyID]
LEFT OUTER JOIN
	[dbo].[tbl_Unit] AS [tbl_Unit] ON [tbl_Unit].[ID] = [tbl_OfferingInInvoice].[UnitID]
LEFT OUTER JOIN
	[dbo].[vw_Offering] AS [tbl_Offering] ON [tbl_Offering].[ID] = [tbl_OfferingInInvoice].[OfferingID]
LEFT OUTER JOIN
	[dbo].[tbl_Tax] AS [tbl_Tax] ON [tbl_Tax].[ID] = [tbl_OfferingInInvoice].[TaxID]
WHERE([tbl_OfferingInInvoice].[InvoiceID] = @P1)
ORDER BY
	5 ASC',N'@P1 uniqueidentifier','68CAC3E8-CF90-4BA1-9757-B4FDBFD97E9B'

одинаково выдает под supervisor и мной.

"Борисов Михаил Евгеньевич" написал:Александр, да деталь всегда заблокирована, под supervisor разблокирована.

Если под Супервизором разблокированы кнопки а под пользователями заблокированы, то здесь только права не дают пользователю совершить действие над записями. Если стоит группа таблиц "Проекты", правда не знаю зачем, то нужно у данного пользователя и выше по иерархии (я не знаю как создавались и настраивались права) смотреть какие права розданы на Группу таблиц "Проекты". Так как если для данной таблице ничего не роздано по правам, то и создаваться, изменяться ничего не будет

Здравствуйте, Михаил!

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

Михаил, описался не проекты, а Продукты. Сами Продукты редактируются на ура, следовательно права раздаются хорошо и на детализацию.

Алла, пару часов ходил по шагам и так и не понял что там происходит, тонны кода.

Мое временное решение(которое имеет все шансы стать постоянным): создал свои кнопки, на которые не распространяется магия и связал их с кодом старых кнопок, все отлично работает, что косвенно указывает на правильно настроенные права на сущности: не дало бы редактировать, создавать записи.

Михаил,

К сожалению, сложно что-либо более конкретное порекоммендовать, не имея информации о том:

1) какое приложение Terrasoft Вы используете (например, Terrasoft CRM, Terrasoft Service Desk, Terrasoft Bank и т.д.);
2) вносились ли какие-либо доработки в Вашу конфигурацию для детали [Продукты];
3) воспроизводится ли подобная ситуация на чистой базе данных, развернутой из backup, который находится в инсталляции Terrasoft.

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

Добрый день, коллеги! Подскажите, пожалуйста, с чем может быть связан периодический простой сервера и клиента при работе в практически любом разделе системы, в том числе и стандартных (Администрирование), как под админом так и под пользователем, при этом помогает только перезагрузка сервера CRM. На трэйсе видно, что сервер никаких запросов не обрабатывает, в то время как клиент, так же, никаких видимых в проц мониторе действий, не выполняет.

Нравится

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

А "простой" то в чем выражается?

В зависаниях клиента, т.е система не отвечает, но при этом ни цп ни оперативка не перегружены

Добрый день Антон!!!

попробуйте переустановить клиента на компьютере, плюс я бы рекомендовал проверить компьютер на вирусы и проанализировать какие процессы помимо клиента террасофт работают на компьютере. Плюс я бы выполнил обновление windows на клиенте. Факторов из-за который windows приложения зависают очень огромные и обширные и зачастую в этом не виноват Вендор разработавший приложение, а в нашем случае это компания Террасофт.

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

Добрый день Антон!!!

если данная проблема наблюдается сразу на нескольких компьютерах, то есть у меня подозрение, что это уже железо сервера начинает страдать или уже страдает. Я бы проверил уже Память на предмет ошибок и диски на предмет BAD секторов и скорости чтения записи. Есть множества разных утилит внешних. Завтра могу у хорошего системного администратора уточнить название данных программных продуктов. Хотя могу ошибаться, так как логически если рассуждать, если начало бы сыпаться железо на сервере, то это было бы явно заметно.

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

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

Уточните, пожалуйста, полное название используемой версии Terrasoft CRM (например, 3.4.1.148).

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

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

Ответьте пожалуйста на следующие вопросы:
* В момент перехода в раздел или открытия карточки редактирования записи, запросы к серверу уходят?
* Сервер отдает результат запроса?
* В какой момент времени приложение перестает отвечать, в момент отправки запроса на сервер, в момент ожидания ответа или в момент обработки данных?

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

Создал простой view

SELECT        '{BA64970A-1B0B-483F-ACE9-E2DAF7A89AF4}' AS ID, 'Да' AS Name
UNION
SELECT        '{36C2640F-B03E-4EA3-96B0-78992A6F86C6}' AS ID, 'Нет' AS Name

в администраторе создал сервис таблицы, создал сервисы Select и Dataset, прикрутил в качестве справочника к нужной таблице. При сохранении записи основной таблицы, поле со значением из такого справочника не сохраняется. Почему?

В качестве справочника не использую перечисление по той причине, что при попытке изменить свойство IsRequired во время выполнения, в версии 3.0 происходит "Разрушительный сбой..."

Нравится

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

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

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

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

не знаю, как там на 3.0, но я бы убрал фигурные скобки из определения представления

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

не знаю, как там на 3.0, но я бы убрал фигурные скобки из определения представления


Согласна, что это может быть возможной причиной.

Проверьте, предположение Дмитрия.

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

не-не-не, господа.
спасибо, что приняли участие в проблеме, но ошибка закралась в сервис Select основной таблицы :)
так что вопрос снимается и тема закрыта.

Добрый день!!!

странно как то, что в Terrasoft 3.X в схеме Таблицы привязанный Вьювер смог сгенерировать Запросы на добавление, обновление, удаление. И система дала их исполнить. На сколько я помню по умолчанию данный функционал отсутствовал. И пришлось бы на уровне SQL сервера создать свои триггеры у Вьювера на создание, обновление, удаление записи.

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

Добрый день, коллеги.
Такой вопрос: есть ли возможность не показывать пользователю в зависимости от его прав доступа колонку "Дата создания" (CreatedOn) в DataGrid-е? В Инструменты -> Администрирование -> Права доступа к полям колонок ID, CreatedOn, CreatedByID, ModifiedOn и ModifiedByID нет. Похоже, если запретить пользователю доступ к ним то он вообще не сможет сохранять и изменять записи в таблице.
У меня только одна мысль - сделать два DataGridView, один с колонкой, другой без и переключать их при открытии реестра. Тогда другой вопрос: можно ли скрыть панельку, на которой перечисляются все DataGridView, чтобы пользователь сам не мог поменять представление.
Версия Terrasoft: TerrasoftCRM 3.3.2

Нравится

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

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

поля ID, CreatedOn, CreatedByID заполняются автоматически в момент создания записи, а поля ModifiedOn, ModifiedByID заполняются в момент изменения записи.

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

Самое простое решение, это сделать представление отдельное для пользователей у которых не будут добавлены эти поля. На событии OnPrepare выполнить необходимую проверку и в результате от проверки отобразить или скрыть необходимое представление.

Пример:

function wnd_AccountsGridAreaOnPrepare(Window) {
	wnd_BaseGridAreaOnPrepare(Window);
	Initialize(Window);
 
	var IsVisibleGV = false;
	if (Ваше условие) {
		IsVisibleGV = true;
	}
	gvMyAccounts.IsVisibel = IsVisibleGV;
	gvAll.IsVisibel = !IsVisibleGV;
}

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

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