Здравствуйте!
Я пытаюсь программными средствами читать справочник типов средств связи. Как работает код, проверял отладкой.
function GetIsPhone(Dataset, FieldName) {
if (IsEmptyGUID(Dataset.ValAsGUID(FieldName))) return;
var CommunicationTypeID = Dataset.ValAsGUID(FieldName);
var CommTypeDataset = Dataset.DataFields(FieldName).LookupDataset;
if (CommTypeDataset.IsActive) CommTypeDataset.Close();
ApplyDatasetFilter(CommTypeDataset, 'ID', CommunicationTypeID, true);
CommTypeDataset.Open();
var IsPhone = CommTypeDataset.ValAsBool('IsPhone');
CommTypeDataset.Close();
ApplyDatasetFilter(CommTypeDataset, 'ID', CommunicationTypeID, false);
return IsPhone;
}
FieldName ='Communication2TypeID'
CommunicationTypeID соответствует мобильному телефону, но в результате работы этого кода в некоторых случаях получаю IsPhone=false, хотя в справочнике поле isPhone = true. Проверка CommTypeDataset.Values('IsPhone') показывает NULL. Запрос sq_CommunicationType в оболочке администратора работает нормально.
Нравится
var CommTypeDataset = Dataset.DataFields(FieldName).LookupDataset;
здесь предложил бы использовать новый экземпляр датасета
var CommTypeDataset = Services.GetNewItemByUSI('ds_CommunicationType');
Как по мне, можно было бы вообще обойтись:
var IsPhone = GetDatasetFieldValueByID('ds_CommunicationType', CommunicationTypeID, 'IsPhone');
А функцию можно сократить до:
function GetIsPhone(Dataset, FieldName) { if (IsEmptyValue(Dataset) || IsEmptyValue(FieldName)) { return; } var CommunicationTypeID = Dataset(FieldName); if (IsEmptyGUID(CommunicationTypeID)) { return; } var IsPhone = GetDatasetFieldValueByID('ds_CommunicationType', CommunicationTypeID, 'IsPhone'); return IsPhone; }
Спасибо! Уместное замечание, не мешало бы пересмотреть и остальной код с учетом этого.