Решил вынести "в массы" обсуждение решения такой задачи:
Есть некоторая переменная, из которой в скрипте (не используем визуальную форму) значение надо записать в одно из двух полей (например) документа. Причем поля оба пользовательские, для одного типа документа - поле А, для другого поле Б.
Имеется ID документа, соответственно известен ID его типа. Знаем названия обоих полей. Далее надо определить, для этого типа какое поле используется согласно настройками в Пользовательских полях, поле А или Б и изменить значение нужного поля.
Вот в выяснении, используется ли данное поле для этого типа документа, и загвоздка
Хочется сделать данный механизм гибким, то есть не привязанным к определенным ID типов внутри кода.
Ситуацию, что для данного типа используются оба поля - не рассматриваем. Писать значение сразу в два поля (потом все равно в карточке что надо покажут)- не хочется по причине "неаккуратности" и внесения мусора в таблицу.
На данный момент штудирую скрипты модуля Common\UserFields.
Возможно, такая задачка уже кем-то решалась, и решение довольно таки простое?
Нравится
В принципе до состояния "черновика" задачу решил, "сырое" выкладываю на всякий случай, может кому пригодится
// функция возвращает есть ли для данного типа (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:
Действительно, Александр, Вы пришли к правильному решению, получив датасет со списком пользовательских типов, а затем проверяя, отображается ли такое поле в конкретном типе документа.
решение не оптимальное по быстродействию и ресурсам - много "лишних" экземпляров датасетов и цикл... если усовершенствую то добавлю вариант "покрасивее"