Здравствуйте, подскажите, как получить ссылку на интересуемый датасет (в частности, на датасет ds_Invoice)?
Нравится
Добрый день!
Можно создать экземпляр датасета:
var DS = Services.GetNewItemByUSI('ds_Invoices');
есть также функция фильтрация датасета, ApplyDataSetFilter, посмотрите примеры в конфигурации воспользовавшись глобальным поиском alt+shift+S
Мне в чате подсказали, что это можно сделать так:
var ContractDataset = Services.GetNewItemByUSI('ds_Invoice');
Однако, при передаче первым параметром СontractDataset в функцию ApplyDatasetFilter() Террасофт ругается на именно на первый параметр.
Общая задача: отфильтровать выборку значений поля
Листинг обработчика поля
function edtContractIDOnPrepareSelectWindow(LookupDataControl) {//обработчик поля "Договор" var OrderDataset = dlData.Dataset; var InvoiceID = GetFieldValueFromDisabledField(OrderDataset, 'InvoiceID'); var ContractDataset = Services.GetNewItemByUSI('ds_Invoice'); ContractDataset.DisableEvents(); var IsEnabled = (!IsEmptyValue(InvoiceID)); ApplyDatasetFilter(ContractDataset, 'InvoiceID', InvoiceID, IsEnabled); ContractDataset.Open(); ContractDataset.Close(); }
:
"Борисов Михаил Евгеньевич" написал:var Dataset = Services.GetSingleItemByUSI('ds_Invoice');
Не помогло, всё равно - ошибка
Оно ругается, поскольку в sq_Invoice нет фильтра InvoiceID. Вы вообще что хотите получить, отфильтровать договор по значению счёта?
Тогда нужно так:
function edtContractOnPrepareSelectWindow(LookupDataControl) { var Dataset = dlData.Dataset; var InvoiceID = GetFieldValueFromDisabledField(Dataset, 'InvoiceID'); var LookupDataset = LookupDataControl.DataField.LookupDataset; var IsEnabled = (!IsEmptyValue(InvoiceID)); ApplyDatasetFilter(LookupDataset, 'InvoiceID', InvoiceID, IsEnabled); }
А ссылка на ds_Invoice тут не нужна.
Александр, соглашусь, я уже тут подзапутался и действительно, мой скрипт неправильный.
Я пробовал, как Вы говорите. В sq_Contract не было необходимого параметра, поэтому я сначала добавил соответствующие изменения сначала в tbl_Contract (новое поле "Связанный счет"), потом в ds_Contract, а потом добавил параметр InvoiceID в sq_Contract
Однако, работа скрипта типа того, что вы мне написали (в названии "ID" после edtContract пропущено) фильтрует абсолютно все записи.
И связано это с тем, что при создании договора новое поле "InvoiceID" ("Связанный счет") не инициализируется. От счета можно перейти к связанному договору, а обратно - нет. Получается мне сначала нужно реализовать эту обратную связь, чтобы при заполнении в счёте поля "Договор" в самом договоре инициализровалось поле связанный счет? Тогда подскажите как это сделать?
Сначала объясните, что вообще хотите сделать. Добавлять новое поле, если оно не используется, не нужно.
Как у вас связаны между собой договор и счёт, какие договора хотите получить, зная счёт?
В заявке есть поле "Счет" и есть поле "Договор". В свою очередь у счета тоже есть поле "Договор" (то есть, договор связанный с этим, конкретным счетом). Мне нужно, чтобы в заявке, при заполнении поля "Договор" осуществлялась выборка только тех договоров, которые связаны с выбранным счетом.
А смысл тогда вообще фильтровать, если со счётом может быть связан только один договор? Выбор из одного варианта?
Может, лучше просто при выборе счёта автоматически записывать в поле "договор" заявки договор из счёта?
Я не уточнил, нужно дать возможность добавить новый или оставить поле пустым.
Вариант фильтрации устраивает, но он не работает
В таком случае, можно так:
function edtContractIDOnPrepareSelectWindow(LookupDataControl) { var Dataset = dlData.Dataset; var InvoiceID = GetFieldValueFromDisabledField(Dataset, 'InvoiceID'); var ContractID = GetDatasetFieldValueByID('ds_Invoice', InvoiceID, 'ContractID');//вместо кучи кода с Services.GetNewItemByUSI var LookupDataset = LookupDataControl.DataField.LookupDataset; var IsEnabled = (!IsEmptyValue(ContractID)); ApplyDatasetFilter(LookupDataset, 'ID', ContractID, IsEnabled); }
Благодарю, всё получилось!
Займусь разбором написанного Вами кода по SDK.