Столкнулся с проблемой при создании карточки редактирования детали.
Грид в окошке деталей все изображает правильно. После нажатия на "Изменить" карточка заполняется правильно. Все чекбоксы проставлены как следует. Нажимаю на любой чекбокс - программа вылетает. Причину вроде бы нашел - Dataset not in edit or insert mode. Попробовал сделать то, что мне нужно вручную. Поставил точку останова, в окне Immediate стал вводить команды и получил то же самое.
var TSOTDataset = Services.GetNewItemByUSI('ds_TSOTasks');
var Filters = TSOTDataset.SelectQuery.Items(0).Filters;
var Parameters = TSOTDataset.SelectQuery.Parameters;
TSOTDataset.Values('Weak') = 0;
Dataset not in edit or insert mode
TSOTDataset.Values('OP') = 0;
Dataset not in edit or insert mode
TSOTDataset.Values('Season') = 0;
Dataset not in edit or insert mode
TSOTDataset.Values('Relief') = 0;
Dataset not in edit or insert mode
TSOTDataset.Values('Diary') = 0;
Dataset not in edit or insert mode
TSOTDataset.State = 2
Попробовал поменять TSOTDataset.State, она вроде связана с edit or insert mode
Но ничего не получилось. Напрашивается мысль, что не сделал какую-то установку. Но есть одна деталь. До того, как добавил в карточку LookupDataControl, связанный с tbi_Department, редактирование работало. Как из этой ситуации выбраться?
Добрый день!
TSOTDataset.State - не редактируемое свойство. Для того чтобы перевести датасет в редактируемое состояние нужно вызвать метод его объекта: Dataset.Edit() - это состояние соответствуею системной константе dstEdit. Перед этим он должен быть открыт: Dataset.Open() - dstBrowse.
Все возможные состояния перечислены в scr_SysEnums:
По ошибке, которая возникают у Вас могут понадобится сервисы детали и радела.
Нужно проверить как инициализируется деталь в wnd_ContactWorkspaceScript, и что в скрипте грида детали. Для примера посмотрите, пожалуйста, как организована деталь "Отрасль контрагента".
Попробовал сделать как в "Отрасль контрагента". Та же ошибка, что и раньше - Terrasoft has stopped working. Close the program. services.zip
В прикрепленном файле сервисы, сделал совсем просто - 1 поле, и фильтры в запросе упростил. Но все-равно та же ошибка. Похоже, что в dlDataOnDatasetBeforePost и dlDataOnDatasetAfterPost программа не попадает.
Полезным оказался нескольким пользователям функционал радеатирования записи детали по, скажем, контрагенту, из его карточки редактирования. Реализация не сложная, много времни не заберет ;)
Покажу на примере карточки контрагента, и Детали[Платежные реквизиты].
Предположим, в карточке контрагента нужно иметь выбрать одну из записей датели с платежными реквизитами.
Начнем с сервисов раздела контрагенты:
Запускаем Terrasoft Administrator, неходим и открываем в нем сервис Accounts\General\Main Grid\tbl_Account
Добавляем в него новое поле типа GUID, AccountINNID
Добавляем связь по вторичному ключу для этого поля (Relation)
Сохраняем сервис tbl_Account с обновлением структуры таблицы в БД.
Находим и открываем сервис Accounts\General\Main Grid\sq_Account, добавьте в него выборку поля AccountINNID
После того как в выборку будет добавленно поле AccountINNID в Select, привязываем к ней через Join таблицу tbl_AccountBillingInfo
Настраиваем привязку по полям tbl_AccountBillingInfo.ID = tbl_Account.AccountINNID
Затем добавляем в Select выборку поля INN из таблицы tbl_AccountBillingInfo и задаем ему псевдоним (Alias) = AccountINN
Теперь можно добавить поле AccountINNID справочного типа LookupDataField в Датасет Accounts\General\Main Grid\ds_Account, связав его с датасетом ds_AccountBillingInfo, и указав поле для отображения AccountINN
Открываем сервис карточки редактирования контрагента, wnd_AccountEdit, добавьте в него поле типа LookupDataControl связав его с полем AccountINNID датасета
Для этого же поля, перейдя на закладку События задаем обработчик события OnPrepareSelectWindow:
В тело обработчика вставляем код:
function edtAccountINNOnPrepareSelectWindow(LookupDataControl, SelectWindow){
var LookupDataset = LookupDataControl.DataField.LookupDataset;
ApplyDatasetFilter(LookupDataset,'AccountID', dlData.Dataset('ID'),true);
var DefaultValues = GetNewDictionary();
DefaultValues.Add('AccountID', dlData.Dataset('ID'));
DefaultValues.Add('INN',null);
SelectWindow.Attributes('DefaultValues')= DefaultValues;
LookupDataset.Attributes('EditWindowUSI')='wnd_AccountBillingInfoEdit';
}
При необходимости вывести поле Account INN в реестр контрагентов, включите его в сервисе wnd_AccountGridArea
После того как все вышеописанное будет проделано, сохранено и перезагружено клиентское приложение, в карточке контрагента, появится lookup контрол, позволяющий выбирать, устанавливать, управлять платежными реквизитами контрагента прямо из его карточки редактирования.
В случае необходимости сделать поле INN обязательным для всех типов реквизитов, отвяжите его в настройках пользовательских полей от всех типов записей: Файл :: Настройки :: Пользовательские поля:
И добавьте его вручную на форму редактирования платежных реквизитов в сервисе Accounts\Details\Billing Information\wnd_AccountBillingInfoEdit как строковое.