Добрый день.
Terrasoft XRM 3.3.2.304. Столкнулся с такой ситуацией.
В гриде детали необходимо программно скрывать и вытаскивать колонки.
делаю так:

Window.ComponentsByName('colYearNumber').IsVisible = true;     

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

нажимаем F5:

Аналогичный эффект достигается при попытке программного назначения ActiveView.
В чем может быть причина и как это победить?
Спасибо

Нравится

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

В SelectQuery поставьте для поля "Всегда выбирать в запросе"

Дмитрий, спасибо огромное.

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

При добавлении новой колонки в GridArea выскакивает сообщение с ошибкой (см. приложенный скриншот) при попытки сохранения сервиса. Сохранить сервис с новой колонкой никак не удаётся.

Нравится

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

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

Здравствуйте, Андрей!
Ага, спасибо, заметил:twisted:

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

Hello colleagues,

I would like to ask some help with fields in editable grid. I have an editable Grid Area Window with two columns (one field is read only and other editable).
When I am using my mouse, everytime I am clicking on that editable field (moving through the records), it focuses on that field: marks whole text if there is any and I can type in it. That's great.
But everytime I am selecting that field using only keyboard (e. g. pressing DOWN key), that field is selected, but not focused, i. e. I have to either press LEFT key and RIGHT key or click with mouse in that field to change value.

What I would like to do is to be able to change field's value instantly after pressing DOWN key (or something like that).

I am using TS 3.4.0 version.

Any help would be very appreciated.

Thank you.

Нравится

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

I don't think that it is possible at all

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

Возник такой вопрос: необходимо определенным пользователям запретить отображать в Гриде дополнительные поля, т.е. если мы, например, в модуле Контакты сделали видимыми поля "Имя", Адрес и Тип, то некоторые пользователи могут видеть только эти поля, некоторые могут добавлять другие. Можно ли это реализовать без написания дополнительных скриптов?
Если есть подобные темы, буду благодарен ссылкам, я почему-то не нашел.

Нравится

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

конечно можно

или Вы хотите, чтобы у всех было стандартное представление грида по умолчанию?

Вы меня немного не поняли. Есть два пользователя: пользователь А и пользователь В.
Пользователю А доступны все поля (также можно добавлять тем способом, который на скриншоте), а пользователю В доступны только три поля, дополнительные он сам добавлять для отображения не должен.

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

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

Подробная информация о настройке прав есть в руководстве администратора в разделе Права доступа http://training.terrasoft.ru/sites/default/files/document/TS_AG_3.3.2.p…

а так, чтобы не видеть совсем? И с правами не устраивает, нужно, чтобы в карточе для всех все поля были доступны.

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

Пример кода для скрытия колонки в гриде:

if (Connector.CurrentUser.ContactID == '{0095C6D9-D7B3-4ADD-8DF6-04B62E8A36D6}'){
	colNumberdgvAll.IsEnbled = false;
}else{
	colNumberdgvAll.IsEnbled = false;
}

где
'{0095C6D9-D7B3-4ADD-8DF6-04B62E8A36D6}' - идентификатор пользователя, которому нужно запретить доступ

colNumberdgvAll - название колонки, которую нужно скрыть из грида:

grid

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

Зависит от количества задач. Повлияет, но не существенно.

Владимир,

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

komgbu, спасибо за совет, приму к сведению.

"komgbu" написал:
Насколько я помню, есть сервис, который определяет принадлежность пользователя к секюрити-группе, используйте его.

Вы правы, такой код есть.

Пример есть вот тут:
http://www.community.terrasoft.ru/forum/topic/6990#comment-29924

Подскажите пожалуйста если нужно запретить не на столики а на данные в столбика. Что бы в строке для пользователя который не ответственный было видно лишь поле Name, а все остальные пустые

Сергей,

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

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

1. Заменить все колонки запроса SQL-колонками, проверять права доступа при получении данных в запросе и выводить только то, на что права есть;

2. Проверять на уровне скриптов и передавать в DisplayValue датасета грида пустое значение;

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

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

Здравствуйте. Создал справочник подобный "Группы контрагентов", добавил таб просмотра и добавления записей по нему в wnd_AccountWorkspace. Нужно чтобы по нажатию кнопки "добавить" открывалась форма поиска записей из справочника.

Выполнение кода:

function btnAddOnClick(Control) {
var Window = Self;
AddGridAreaData(Self, Self, BaseGridArea);
}

function AddGridAreaData(NotifyObject, Window, BaseGridArea, AdditionalAttributes) {
if (!Assigned(NotifyObject)) {
NotifyObject = Window;
}
BaseGridArea.NotifyObject = NotifyObject;
if (!GetCanInsertTableGroup(BaseGridArea.GridDataset)) {
return;
}
CheckAttributes(NotifyObject, 'EditWindowUSI');
var Attributes = GetAddDataAttributes(Window, BaseGridArea);
if (Assigned(AdditionalAttributes)) {
CopyAttributes(AdditionalAttributes, Attributes);
}
if (IsAttributeExists(Window, 'EditWindowDatasetUSI')) {
Attributes('DatasetUSI') = Window.Attributes('EditWindowDatasetUSI');
}
Attributes('WorkspaceDataset') = BaseGridArea.WorkspaceDataset;
ShowEditWindowEx(BaseGridArea.EditWindowUSI, Attributes,
BaseGridArea.AddDataDefaultValues);
}

Приводит к ошибке:

'EditWindowUSI' значение атрибута не определено

Помогите, пожалуйста, разобраться в чем проблема! Заранее спасибо.

Нравится

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

Здравствуйте, Сергей!

При выполнении кода происходит проверка атрибута CheckAttributes(NotifyObject, 'EditWindowUSI'). Скорее всего ошибка появляется из-за того, что система не находит значения атрибута 'EditWindowUSI'. Как правило, данный атрибут прописывается в функции OnPrepare в GridArea.
Например, SetAttribute(Window, 'EditWindowUSI', 'wnd_AccountIndustryEdit').

Terrasoft Support Team

Добрый день. Попробовал решить проблему следующим образом: создал форму на базе шаблона wnd_BaseGridArea, по клику на Добавить выполняется:

function btnAddOnClick(Control) {
AddData(Control);
}

function AddData(Control) {
if (!BaseGridArea.WorkspaceMode) {
var Dataset = Services.GetNewItemByUSI('ds_EnterPoints');
ShowSelectDataWindowSimple(Dataset, 'Name;Description', Self,
false, 'SelectData');
} else {
scr_BaseGridArea.btnAddOnClick(Control);
}
}

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

Таблица содержит стандартные поля: ID, CreatedOn, CreatedByID, ModifiedOn, ModifiedByID, Name, Description. Группа родительской таблицы - Контрагенты. В датасете отмечены: Генерировать запрос на вставку, обновление, удаление и Справочник.

При попытке добавить запись ошибки:

'RecordID' значение атрибута не определено
'AddNewRecordOnPage' значение атрибута не определено

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

Или есть какой-то стардартный механизм добавления записей из справочника в таблицу?

Здравствуйте, Сергей!

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

В случае если Вы реализуете в карточке контрагента функционал подобный детали [Группы], то можем порекомендовать Вам обработчике события OnNotify окна нужной детали вызывать функцию, в которой реализована вставку в таблицу. Например, для детали [Группы] это реализовано в скрипте scr_GroupsGridArea в функциях: function wnd_GroupsGridAreaOnNotify -> function GetSelectGroupResult(Sender, Message)

Terrasoft Support Team

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

The statement has been terminated.
Violation of PRIMARY KEY constraint 'PServiceID'. Cannot insert duplicate key in object 'tbl_Service'.

Как правильно добавлять и сохранять?

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

Окно делал не я. Попробую выяснить. Скрипт делал в Администраторе через RMB клик по папке с модулем -> Новый -> Script. Второй вариант - свойство формы Script выставил в (Nil), и из дизайнера создавал новый обработчик события, при этом мне предлагалось создать новый скрипт для формы.

и каким способом Вы воспользовались?

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

если можна вышлите на суппорт измененые Вами сервисы
так навскидку решыть Вашу проблему не выходит

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

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

The statement has been terminated.
Violation of PRIMARY KEY constraint 'PServiceID'. Cannot insert duplicate key in object 'tbl_Service'.
Помогите, пожалуйста, разобраться. Спасибо.
>>

Скажите пожалуйста, какие файлы мне следует отправить в суппорт?

в идеале ето конешно полный бекап Вашей базы

ошыбка
"Violation of PRIMARY KEY constraint 'PServiceID'. Cannot insert duplicate key in object 'tbl_Service'."
ето сообщение базы данных
посмотрите в профайлере на каком именно скрипте
падает ошыбка

Вы можете подключиться ко мне через TeamViewer, как это делали раньше?

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

Я задавал эти же вопросы по почте, писал на 'support@tscrm.com'; 'support@terrasoft.ru'; 'E.Guk@tscrm.com'. Скажите пожалуйста, она доставлена?

если у Вас бесплатный сервис то ответ прийдет в течении 5 рабочих дней
попробуйте позвонить на support

Доброго дня!

"Матвеев Сергей" написал:Таблица содержит стандартные поля: ID, CreatedOn, CreatedByID, ModifiedOn, ModifiedByID, Name, Description. Группа родительской таблицы - Контрагенты. В датасете отмечены: Генерировать запрос на вставку, обновление, удаление и Справочник.

При попытке добавить запись ошибки:

'RecordID' значение атрибута не определено
'AddNewRecordOnPage' значение атрибута не определено

Тут дело в том, что после закрытия окно wnd_SelectData шлет сообщение своему NotifyObject, который передавался ей в атрибутах. Если не перекрывать стандартную логику, то будет описанная Вами ошибка. Соответственно, для корректной реализации нужно перекрыть обработчик события OnNotify у окна реестра, куда добавляется запись.
Можно сделать примерно так:

if (Sender.Attributes('IsAccountsGroupSelectData') && Message == MSG_OK) {
	var AccountGroupID = Sender.Attributes('KeyValue'); // Это для одной записи
	var AccountGroupIDsArray = Sender.Attributes('KeyValues'); // Это для нескольких выделенных записей
	// тут уже можно реализовывать логику
	}

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

function AddData(Control) {
    if (!BaseGridArea.WorkspaceMode) {
         var Dataset = Services.GetNewItemByUSI('ds_EnterPoints');
         var SelectData = ShowSelectDataWindowSimple(Dataset, 'Name;Description', Self,
             false, 'SelectData');
         SelectData.Attributes('IsAccountsGroupSelectData') = true; //Это на случай, если используется несколько окон SelectData с разными целями, а сообщения шлют одному окну. Так можно определить какое именно окно прислало сообщение
    } else {
         scr_BaseGridArea.btnAddOnClick(Control);
    }
}

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

"support" написал:В случае если Вы реализуете в карточке контрагента функционал подобный детали [Группы], то можем порекомендовать Вам обработчике события OnNotify окна нужной детали вызывать функцию, в которой реализована вставку в таблицу. Например, для детали [Группы] это реализовано в скрипте scr_GroupsGridArea в функциях: function wnd_GroupsGridAreaOnNotify -> function GetSelectGroupResult(Sender, Message)

Попытался сделать сохранение по аналогии с Группами, возникла проблемма (внутри функции GetSelectGroupResult):

>> Ошибка выполнения метода 'wnd_EnterPointsGridAreaOnNotify'. "GroupsGridArea.GroupDataset.USI" - есть null или не является объектом

и далее ошибка на методе Dataset.Open(); после присвоения var Dataset = GroupsGridArea.GridAreaGroupDataset;

>>Ошибка выполнения метода 'wnd_EnterPointsGridAreaOnNotify'. "undefined" - есть null или не является объектом

Датасет инициализируеться точно так же как в Группах (function InitializeGlobalVariables(), function InitializeDataset())

Подскажите, пожалуйста, в чем ошибка? И как при сохранении записи "привязать" ее к выбранному контрагенту (по полю AccountID)?

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

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

function GetSelectResult(Dataset, // куда вставляем
						 ParentItemID,  // к чему привязываем
						 ParentItemName, //  имя поля связи
						 Sender, // стандартные
						 Message) { // переменные
	var OurID = GetSelectDataResultKeyValue(Sender, Message);//получаем выбраный ID
	if (OurID == null) {
		return;
	}
	Dataset.Append();
	Dataset.Values('ID') = Connector.GenGUID();
	Dataset.Values(ParentItemName) = ParentItemID;
	Dataset.Values('OurFieldName') = OurID;//вставляем в наше поле полученое значения
	Dataset.Post();
}
Показать все комментарии