Добавление записей в GridArea, вызов справочника

Здравствуйте. Создал справочник подобный "Группы контрагентов", добавил таб просмотра и добавления записей по нему в 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();
}
Показать все комментарии