Как ДанныеФормыСтруктура преобразовать в обычную структуру

1. suvolod 28 21.01.14 06:35 Сейчас в теме
При открытии документа в проц. ПриСозданииНаСервере() открываемая форма имеет свойство Параметры вида ДанныеФормаСтруктура. Мне нужно преобразовать этот объект в обычную структуру для последующей обработки.. и я застрял на этом шаге. Что пробовал:

1// выполнение команды вида ДанныеФормыВЗначение(ЭтаФорма.Параметры, Тип("Структура")) приводит к тому, что программа просто вылетает на этой команде.
2// хотел просто перебрать все параметры, и вручную скопировать их в новую структуру, но оказалось, что перебор колекции вида ДанныеФормыСтруктура не поддерживатся, т.е. нельзя выполнить даже простой цикл вида Для Каждого Параметр ИЗ Параметры....
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. lefthander 04.10.16 08:37 Сейчас в теме
(1) suvolod, но если структура (не объект) параметров известна, то можно просто каждый параметр добавить в новую структуру, в том числе и добавить нужные параметры для дальнейшей работы.
ЗЫ вот ведь а на дату то не посмотрел:)
2. kot30688 3 21.01.14 08:01 Сейчас в теме
Доброго времени суток!
А РеквизитФормыВЗначение и обратно не подходит?
3. suvolod 28 21.01.14 10:24 Сейчас в теме
Если имелось ввиду СтруктураПараметров = РеквизитФормыВЗначение("Параметры"), то нет, не проходит. Т.к. параметры - это не реквизит формы..
4. kot30688 3 22.01.14 02:31 Сейчас в теме
Извиняюсь, что-то про параметры не понял в начале. Вам изначально не известно что там за параметры в форме? Если известно, то можно было бы создать свою структуру и заполнить ее значениями из параметров формы.
5. 1prog@bk.ru 11 13.09.16 13:35 Сейчас в теме
Вы решили этот вопрос?
6. max_zhilin 03.10.16 20:29 Сейчас в теме
Нет такого способа, только присваивать элементы коллекции, перебирая их имена (которые надо знать на момент исполнения).
8. mdSerg 15.02.18 10:46 Сейчас в теме
Можно, если дфс - это структура объекта документа или справочника.
В примерах ниже получаем только поля дфс, соответствующие реквизитам, но можно и всё остальное получить аналогичным образом
Способ1:
Можно сначала получить объект при помощи ДанныеФормыВЗначение, а затем
Для каждого Реквизит из об.Метаданные().Реквизиты Цикл
резСтруктура.Вставить(Реквизит.Имя, об[Реквизит.Имя]);
КонецЦикла;
Способ2:
Непосредственно из данныеформыструктура
МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗнч(дфс.Ссылка));
резСтруктура.Вставить("Ссылка", дфс.Ссылка);
Для каждого Реквизит из МетаданныеТипа.Реквизиты Цикл
резСтруктура.Вставить(Реквизит.Имя, дфс[Реквизит.Имя]);
КонецЦикла;
cloove; Andreyyy; Crush; +3 Ответить
9. Dethmontt 13.03.18 17:24 Сейчас в теме
(8)
Можно, если дфс - это структура объекта документа или справочника.

Речь идет о "Параметрах" (ЭтаФорма.Параметры) формы имеющие тип дфс

И будь оно хоть ссылкой, хоть не ссылкой ПЕРЕБРАТЬ эти параметры НЕЛЬЗЯ
10. SlavaKron 07.08.19 17:30 Сейчас в теме
ДанныеФормыСтруктура можно сериализовать, достаточно поместить их в Структуру и сериализовать эту структуру:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
Структура = Новый Структура("Параметры", Параметры);
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Структура);

Текст = ЗаписьXML.Закрыть();
Winston2011; japopov; black_doctor; nekit_rdx; dmnblg; +5 Ответить
11. SlavaKron 08.08.19 09:51 Сейчас в теме
Как результат, можно получить структуру полей данных формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)	
	СтруктураПараметров = ПолучитьСтруктуруДанныхФормы(Параметры);
	ЗаполнитьЗначенияСвойств(СтруктураПараметров, Параметры);	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьСтруктуруДанныхФормы(ДанныеФормы)
	Массив = Новый Массив;
	Массив.Добавить(ДанныеФормы);
	Запись = Новый ЗаписьFastInfoset;
	Запись.УстановитьДвоичныеДанные();
	СериализаторXDTO.ЗаписатьXML(Запись, Массив);
	
	Чтение = Новый ЧтениеFastInfoset;
	Чтение.УстановитьДвоичныеДанные(Запись.Закрыть());
	Результат = Новый Структура;
	
	Пока Чтение.Прочитать() Цикл
		Если Чтение.Имя = "field" И Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			ИмяПоля = Чтение.ЗначениеАтрибута("nameRu");
			Если ИмяПоля = Неопределено Тогда
				ИмяПоля = Чтение.ЗначениеАтрибута("name");
			КонецЕсли;
			
			Если ИмяПоля <> Неопределено Тогда
				Результат.Вставить(ИмяПоля);
			КонецЕсли;				
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат
КонецФункции
Показать
Winston2011; independ; Serg243; comptr; LosevI; Ekovichev; shalex5; FilatovRA; Tishu; kalyaka; Aleskey_K; nnn; proonec; Dethmontt; diar01; mszsuz; nekit_rdx; dmnblg; sacred; +19 Ответить
13. kalyaka 1070 12.02.20 12:31 Сейчас в теме
(11) Для универсальности можно сразу добавить заполнение структуры значениями из данных формы и сделать общую функцию:
Функция ДанныеФормыВСтруктуру(ДанныеФормы) Экспорт
    ...
    ЗаполнитьЗначенияСвойств(Результат, ДанныеФормы);
    Возврат Результат;
КонецФункции
Serg243; GetNight; +2 Ответить
15. GetNight 46 04.08.21 13:43 Сейчас в теме
(13) Сразу не увидел, но пришёл к похожему выводу

Мне потребовалось передавать Элемент.ТекущиеДанные
Чтобы не было вылета, чуть-чуть подправил, у меня получилось так:
Если ИмяПоля <> Неопределено
      И ИмяПоля <> "СтандартнаяКартинкаСтроки"
      И ИмяПоля <> "СтрокаДинамическогоСписка.ГруппировкаСтроки" Тогда
	Результат.Вставить(ИмяПоля, ДанныеФормы[ИмяПоля]);
КонецЕсли;
14. Niki_Pro 13.02.20 13:18 Сейчас в теме
(11)
Ваш метод хорош, но если будут в ДанныеФормыВЗначение два свойства с одинаковыми именами, но с разными типам, то в структуру попадет что-то одно.

Такая ситуация может быть, когда есть реквизиты и табличные части например. И имена у них пересекаются.
12. SlavaKron 08.08.19 10:01 Сейчас в теме
Еще интересный факт — сериализованный основной реквизит формы также содержит информацию о всех реквизитах управляемой формы.
romankoav; +1 Ответить
16. reset2 17 23.10.22 00:01 Сейчас в теме
Много воды утекло в топике. Но если сильно хочется...
Добавь в модуль менеджера код, и тогда параметры с типом "структура" будут доступны (Параметры.ПараметрыСтруктура).
Можно и на подписку нужные объекты повесить (или все), но не рекомендую... гонять туда-сюда еще одну структуру.

Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	
	Если ВидФормы = "ФормаОбъекта" Тогда
		//В этом обработчике Параметры - это структура.
		//1. Скопируем
		ПараметрыСтруктура = ОбщегоНазначения.СкопироватьРекурсивно(Параметры);
		
		//2. Добавим нашу структуру к параметрам
		Параметры.Вставить("ПараметрыСтруктура", ПараметрыСтруктура);
		
		//3. Нужно еще форму определить
		ВыбраннаяФорма = Метаданные.Справочники.Справочник.ОсновнаяФормаОбъекта;
		
		//4. 
		СтандартнаяОбработка = Ложь;
		
	КонецЕсли;
	
КонецПроцедуры
Показать


П.С. Работать не будет, если вызываешь конкретную форму (обработчик не сработает).
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот