Про пользовательские поля и скрипт

Решил вынести "в массы" обсуждение решения такой задачи:
Есть некоторая переменная, из которой в скрипте (не используем визуальную форму) значение надо записать в одно из двух полей (например) документа. Причем поля оба пользовательские, для одного типа документа - поле А, для другого поле Б.
Имеется ID документа, соответственно известен ID его типа. Знаем названия обоих полей. Далее надо определить, для этого типа какое поле используется согласно настройками в Пользовательских полях, поле А или Б и изменить значение нужного поля.
Вот в выяснении, используется ли данное поле для этого типа документа, и загвоздка:smile:
Хочется сделать данный механизм гибким, то есть не привязанным к определенным ID типов внутри кода.

Ситуацию, что для данного типа используются оба поля - не рассматриваем. Писать значение сразу в два поля (потом все равно в карточке что надо покажут:smile:)- не хочется по причине "неаккуратности" и внесения мусора в таблицу.

На данный момент штудирую скрипты модуля Common\UserFields.
Возможно, такая задачка уже кем-то решалась, и решение довольно таки простое?

Нравится

3 комментария

В принципе до состояния "черновика" задачу решил, "сырое" выкладываю на всякий случай, может кому пригодится

// функция возвращает есть ли для данного типа (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;
}

Дальше можно сделать функции универсальными - для любого набора UserFields (тут uf_Documents), для любого датасета критериев (тут ds_DocumentType)... но это уже не так интересно, тему можно считать закрытой:wink:

Действительно, Александр, Вы пришли к правильному решению, получив датасет со списком пользовательских типов, а затем проверяя, отображается ли такое поле в конкретном типе документа.

решение не оптимальное по быстродействию и ресурсам - много "лишних" экземпляров датасетов и цикл... если усовершенствую то добавлю вариант "покрасивее"

Показать все комментарии