Как ДанныеФормыСтруктура преобразовать в обычную структуру
При открытии документа в проц. ПриСозданииНаСервере() открываемая форма имеет свойство Параметры вида ДанныеФормаСтруктура. Мне нужно преобразовать этот объект в обычную структуру для последующей обработки.. и я застрял на этом шаге. Что пробовал:
1// выполнение команды вида ДанныеФормыВЗначение(ЭтаФорма.Параметры, Тип("Структура")) приводит к тому, что программа просто вылетает на этой команде.
2// хотел просто перебрать все параметры, и вручную скопировать их в новую структуру, но оказалось, что перебор колекции вида ДанныеФормыСтруктура не поддерживатся, т.е. нельзя выполнить даже простой цикл вида Для Каждого Параметр ИЗ Параметры....
1// выполнение команды вида ДанныеФормыВЗначение(ЭтаФорма.Параметры, Тип("Структура")) приводит к тому, что программа просто вылетает на этой команде.
2// хотел просто перебрать все параметры, и вручную скопировать их в новую структуру, но оказалось, что перебор колекции вида ДанныеФормыСтруктура не поддерживатся, т.е. нельзя выполнить даже простой цикл вида Для Каждого Параметр ИЗ Параметры....
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Можно, если дфс - это структура объекта документа или справочника.
В примерах ниже получаем только поля дфс, соответствующие реквизитам, но можно и всё остальное получить аналогичным образом
Способ1:
Можно сначала получить объект при помощи ДанныеФормыВЗначение, а затем
Для каждого Реквизит из об.Метаданные().Реквизиты Цикл
резСтруктура.Вставить(Реквизит.Имя, об[Реквизит.Имя]);
КонецЦикла;
Способ2:
Непосредственно из данныеформыструктура
МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗнч(дфс.Ссылка));
резСтруктура.Вставить("Ссылка", дфс.Ссылка);
Для каждого Реквизит из МетаданныеТипа.Реквизиты Цикл
резСтруктура.Вставить(Реквизит.Имя, дфс[Реквизит.Имя]);
КонецЦикла;
В примерах ниже получаем только поля дфс, соответствующие реквизитам, но можно и всё остальное получить аналогичным образом
Способ1:
Можно сначала получить объект при помощи ДанныеФормыВЗначение, а затем
Для каждого Реквизит из об.Метаданные().Реквизиты Цикл
резСтруктура.Вставить(Реквизит.Имя, об[Реквизит.Имя]);
КонецЦикла;
Способ2:
Непосредственно из данныеформыструктура
МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗнч(дфс.Ссылка));
резСтруктура.Вставить("Ссылка", дфс.Ссылка);
Для каждого Реквизит из МетаданныеТипа.Реквизиты Цикл
резСтруктура.Вставить(Реквизит.Имя, дфс[Реквизит.Имя]);
КонецЦикла;
ДанныеФормыСтруктура можно сериализовать, достаточно поместить их в Структуру и сериализовать эту структуру:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
Структура = Новый Структура("Параметры", Параметры);
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Структура);
Текст = ЗаписьXML.Закрыть();
Как результат, можно получить структуру полей данных формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СтруктураПараметров = ПолучитьСтруктуруДанныхФормы(Параметры);
ЗаполнитьЗначенияСвойств(СтруктураПараметров, Параметры);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьСтруктуруДанныхФормы(ДанныеФормы)
Массив = Новый Массив;
Массив.Добавить(ДанныеФормы);
Запись = Новый ЗаписьFastInfoset;
Запись.УстановитьДвоичныеДанные();
СериализаторXDTO.ЗаписатьXML(Запись, Массив);
Чтение = Новый ЧтениеFastInfoset;
Чтение.УстановитьДвоичныеДанные(Запись.Закрыть());
Результат = Новый Структура;
Пока Чтение.Прочитать() Цикл
Если Чтение.Имя = "field" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяПоля = Чтение.ЗначениеАтрибута("nameRu");
Если ИмяПоля = Неопределено Тогда
ИмяПоля = Чтение.ЗначениеАтрибута("name");
КонецЕсли;
Если ИмяПоля <> Неопределено Тогда
Результат.Вставить(ИмяПоля);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Результат
КонецФункции
Показать
(11) Для универсальности можно сразу добавить заполнение структуры значениями из данных формы и сделать общую функцию:
Функция ДанныеФормыВСтруктуру(ДанныеФормы) Экспорт
...
ЗаполнитьЗначенияСвойств(Результат, ДанныеФормы);
Возврат Результат;
КонецФункции
(13) Сразу не увидел, но пришёл к похожему выводу
Мне потребовалось передавать Элемент.ТекущиеДанные
Чтобы не было вылета, чуть-чуть подправил, у меня получилось так:
Мне потребовалось передавать Элемент.ТекущиеДанные
Чтобы не было вылета, чуть-чуть подправил, у меня получилось так:
Если ИмяПоля <> Неопределено
И ИмяПоля <> "СтандартнаяКартинкаСтроки"
И ИмяПоля <> "СтрокаДинамическогоСписка.ГруппировкаСтроки" Тогда
Результат.Вставить(ИмяПоля, ДанныеФормы[ИмяПоля]);
КонецЕсли;
Много воды утекло в топике. Но если сильно хочется...
Добавь в модуль менеджера код, и тогда параметры с типом "структура" будут доступны (Параметры.ПараметрыСтруктура).
Можно и на подписку нужные объекты повесить (или все), но не рекомендую... гонять туда-сюда еще одну структуру.
П.С. Работать не будет, если вызываешь конкретную форму (обработчик не сработает).
Добавь в модуль менеджера код, и тогда параметры с типом "структура" будут доступны (Параметры.ПараметрыСтруктура).
Можно и на подписку нужные объекты повесить (или все), но не рекомендую... гонять туда-сюда еще одну структуру.
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
Если ВидФормы = "ФормаОбъекта" Тогда
//В этом обработчике Параметры - это структура.
//1. Скопируем
ПараметрыСтруктура = ОбщегоНазначения.СкопироватьРекурсивно(Параметры);
//2. Добавим нашу структуру к параметрам
Параметры.Вставить("ПараметрыСтруктура", ПараметрыСтруктура);
//3. Нужно еще форму определить
ВыбраннаяФорма = Метаданные.Справочники.Справочник.ОсновнаяФормаОбъекта;
//4.
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
ПоказатьП.С. Работать не будет, если вызываешь конкретную форму (обработчик не сработает).
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот