Решил вынести "в массы" обсуждение решения такой задачи:
Есть некоторая переменная, из которой в скрипте (не используем визуальную форму) значение надо записать в одно из двух полей (например) документа. Причем поля оба пользовательские, для одного типа документа - поле А, для другого поле Б.
Имеется ID документа, соответственно известен ID его типа. Знаем названия обоих полей. Далее надо определить, для этого типа какое поле используется согласно настройками в Пользовательских полях, поле А или Б и изменить значение нужного поля.
Вот в выяснении, используется ли данное поле для этого типа документа, и загвоздка![]()
Хочется сделать данный механизм гибким, то есть не привязанным к определенным ID типов внутри кода.
Ситуацию, что для данного типа используются оба поля - не рассматриваем. Писать значение сразу в два поля (потом все равно в карточке что надо покажут
)- не хочется по причине "неаккуратности" и внесения мусора в таблицу.
На данный момент штудирую скрипты модуля Common\UserFields.
Возможно, такая задачка уже кем-то решалась, и решение довольно таки простое?
Нравится
В принципе до состояния "черновика" задачу решил, "сырое" выкладываю на всякий случай, может кому пригодится
[javascript]
// функция возвращает есть ли для данного типа (DocumentTypeID) поле с названием FieldName
function ExistFieldForDocumentType(DocumentTypeID, FieldName){
var TypeDataset = GetDocumentTypesDatasetForUserField(FieldName);
TypeDataset.GotoFirst();
var Result = false;
while (!TypeDataset.IsEOF){
if (TypeDataset.Values('KeyValue') == DocumentTypeID){
Result = true;
}
TypeDataset.GotoNext();
}
TypeDataset.Close();
return Result;
}
// возвращает открытый memory dataset со списком ID типов, для которых используется данное поле
function GetDocumentTypesDatasetForUserField(ItemName){
var SelectedUserFields = Services.GetNewItemByUSI('uf_Documents');
var dsUserFieldsTypes = Services.GetNewItemByUSI('mds_UserFieldsTypes');
var TypeDBDataset = Services.GetNewItemByUSI('ds_DocumentType');
dsUserFieldsTypes.Attributes('TypeDBDataset') =
TypeDBDataset;
dsUserFieldsTypes.Attributes('SelectedItem') =
SelectedUserFields.Items.ItemsByName(ItemName);
dsUserFieldsTypes.Attributes('UserFields') =
SelectedUserFields;
dsUserFieldsTypes.Open();
return dsUserFieldsTypes;
}
[/javascript]
Дальше можно сделать функции универсальными - для любого набора UserFields (тут uf_Documents), для любого датасета критериев (тут ds_DocumentType)... но это уже не так интересно, тему можно считать закрытой:wink:
Действительно, Александр, Вы пришли к правильному решению, получив датасет со списком пользовательских типов, а затем проверяя, отображается ли такое поле в конкретном типе документа.
решение не оптимальное по быстродействию и ресурсам - много "лишних" экземпляров датасетов и цикл... если усовершенствую то добавлю вариант "покрасивее"