Записать данные с УФ в РС

1. user719210 19.06.17 03:39 Сейчас в теме
Добрый день.
Программно создаю реквизит и элемент формы, после ввода значений хочу, записать введенные данные в регистр сведений, не пойму как это сделать.
При нажатии на кнопку открывается ПВХ, там ввожу наименование и при закрытии формы передаю на форму справочника. На форме справочника создается реквизит с указанным в пвх наименованием.
Код формы элемента справочника
&НаКлиенте
Процедура ДобавитьРеквизит(Команда)
	Закрытие = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
	ОткрытьФорму("ПланВидовХарактеристик.СвойстваКошельков.Форма.ФормаЭлемента",,ЭтаФорма,,,,Закрытие);
КонецПроцедуры

&НаСервере
Процедура ОписаниеЗакрытия(Результат,Параметры) экспорт 
	НовыеРеквизиты = Новый Массив;
	НовыйРеквизит = Новый РеквизитФормы(Результат.Имя,Новый ОписаниеТипов (Результат.Тип),,,Истина);
	НовыеРеквизиты.Добавить(НовыйРеквизит);
	ИзменитьРеквизиты (НовыеРеквизиты);	
	
	Элемент = Элементы.Добавить(Результат.Имя,Тип("ПолеФормы"),ЭтаФорма); 
	Элемент.Вид = ВидПоляФормы	.ПолеВвода; 
	Элемент.ПутьКДанным = Результат.Имя; 
	
	МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствКошельков.СоздатьМенеджерЗаписи();
	МенеджерЗаписи.Кошелек = Объект.Ссылка;
	МенеджерЗаписи.ВидСвойства = Результат.Имя;
	МенеджерЗаписи.Значение = Объект.НовыеРеквизиты;
	МенеджерЗаписи.Записать();	
КонецПроцедуры
Показать


Код формы элемента ПВХ
 &НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	ВыбранноеЗначение = Новый Структура;
	ВыбранноеЗначение.Вставить("Имя",Объект.Наименование);
	ВыбранноеЗначение.Вставить("Тип",Объект.ТипЗначения);
	ОповеститьОВыборе(ВыбранноеЗначение);
КонецПроцедуры


	МенеджерЗаписи.ВидСвойства = Результат.Имя;
	МенеджерЗаписи.Значение = Объект.НовыеРеквизиты;

Вот эти 2 строки ничего не записывают
ВидСвойства тип "ПВХСсылка", а вот у "Значение" почему-то неопределено.
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. alex-l19041 8 19.06.17 10:17 Сейчас в теме
(1)
Элемент.ПутьКДанным = Результат.Имя;
- объясните смысл этой строки
+
5. user719210 19.06.17 10:23 Сейчас в теме
(4) Ой, не исправил, много раз все менял, скопировал не то
Элемент.ПутьКДанным = НовыйРеквизит.Имя;
+
2. user719210 19.06.17 04:16 Сейчас в теме
Вид свойства исправил, в ПВХ передавал наименование, а не ссылку
 ВыбранноеЗначение.Вставить("Имя",Объект.Ссылка);

а как вот теперь значение поля ввода внести в РС?
+
3. user719210 19.06.17 09:54 Сейчас в теме
Как вообще вытащить значение с поля ввода из программно созданного реквизита?
+
6. user719210 19.06.17 10:54 Сейчас в теме
Сейчас уже решил делать по-другому. Создал не программно реквизит формы, решил в него передавать значения, а оттуда уже в РС, но все равно ничего не изменилось
&НаКлиенте
Процедура ДобавитьРеквизит(Команда)
	Закрытие = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
	ОткрытьФорму("ПланВидовХарактеристик.СвойстваКошельков.Форма.ФормаЭлемента",,ЭтаФорма,,,,Закрытие);
КонецПроцедуры

&НаСервере
Процедура ОписаниеЗакрытия(Результат,Параметры) экспорт 
	Если ТипЗнч(Результат) = Тип("Структура") Тогда
		НовыеРеквизиты = Новый Массив;
		НовыйРеквизит = Новый РеквизитФормы(Результат.Имя,Результат.Тип,,,Истина);
		НовыеРеквизиты.Добавить(НовыйРеквизит);
		ИзменитьРеквизиты (НовыеРеквизиты);	
		Элемент = Элементы.Добавить(Результат.Имя,Тип("ПолеФормы"),ЭтаФорма); 
		Элемент.Вид = ВидПоляФормы.ПолеВвода; 
		Элемент.ПутьКДанным = НовыйРеквизит.Имя; 	
		РеквизитДляРС = Новый Структура;
		РеквизитДляРС.Вставить("Имя", Результат.Имя);
	КонецЕсли;
КонецПроцедуры      

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
		РеквизитДляРС.Вставить ("Тип",ЭтаФорма.НовыйРеквизит);   
		ЗаписьВРегистр();		
КонецПроцедуры

&НаСервере
Процедура ЗаписьВРегистр()
		МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствКошельков.СоздатьМенеджерЗаписи();
		МенеджерЗаписи.Кошелек = Объект.Ссылка;
		МенеджерЗаписи.ВидСвойства = РеквизитДляРС.Имя;
		МенеджерЗаписи.Значение = РеквизитДляРС.Тип;
		МенеджерЗаписи.Записать(); 
КонецПроцедуры
Показать


Почти все работает, но есть один конкретный вопрос - Как мне достать значение программно созданного реквизита? Пробовал по разному и через объект. и через элементы. и через этаформа.новыйреквизит, но везде не находит его
+
7. alex-l19041 8 19.06.17 11:29 Сейчас в теме
(6) предлагаю для поля ввода программно созданного реквизита создать обработчик события ПриИзменении. И отладчиком проверять куда сохраняется значение...
+
8. user719210 19.06.17 11:37 Сейчас в теме
(7) А как для него создать обработчик события?
+
9. user719210 19.06.17 11:41 Сейчас в теме
я вот например пробовал сделать так

МенеджерЗаписи.Значение = ЭтаФорма.Цвет;

И создавал в ПВХ запись "Цвет", тогда в отладчике я нормально вижу значение, которое ввожу в поле ввода. А как вот сделать, чтобы брало значение параметра независимо от его имени? не могу же написать ЭтаФорма.Новыйреквизит, а как тогда, я вообще не пойму.
Внутри процедуры ОписаниеЗакрытия я могу получить только имя реквизита через результат.имя
+
10. user719210 20.06.17 09:55 Сейчас в теме
Вроде бы проблему решил, сделал по-другому чуть чуть, при нажатии кнопки сразу открывается форма РС, заполняю ее, записываю, дальше запросом вытаскиваю значения из РС и на основе их создаю реквизит и элемент формы, заполняю их данными с РС.
Код формы элемента справочника:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	СозданиеРеквизита();
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРеквизит(Команда)
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("Кошелек", Объект.Ссылка);
	Закрытие = Новый ОписаниеОповещения ("ОписаниеЗакрытия", ЭтаФорма);
	ОткрытьФорму("РегистрСведений.ЗначенияСвойствКошельков.ФормаЗаписи",ПараметрыОткрытия,,,,,Закрытие);
КонецПроцедуры

&НаКлиенте
Процедура ОписаниеЗакрытия(Результат,Параметры) Экспорт 
	Если ТипЗнч(Результат) = Тип("Структура") Тогда
		СозданиеРеквизита();	
	КонецЕсли;
КонецПроцедуры      

&НаСервере
Процедура СозданиеРеквизита() Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ЗначенияСвойствКошельков.Свойство.Наименование КАК Наименование,
		|	ЗначенияСвойствКошельков.Свойство КАК Свойство,
		|	ЗначенияСвойствКошельков.Значение КАК Значение,
		|	СвойстваКошельков.ТипЗначения КАК ТипЗначения
		|ИЗ
		|	РегистрСведений.ЗначенияСвойствКошельков КАК ЗначенияСвойствКошельков
		|		ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.СвойстваКошельков КАК СвойстваКошельков
		|		ПО ЗначенияСвойствКошельков.Свойство = СвойстваКошельков.Ссылка
		|ГДЕ
		|	ЗначенияСвойствКошельков.Кошелек = &Кошелек";
	Запрос.УстановитьПараметр("Кошелек", Объект.Ссылка);
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	ГлобСвойство = Новый СписокЗначений;
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Если Элементы.Найти(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")) = Неопределено  Тогда
			НовыеРеквизиты = Новый Массив;
			НовыйРеквизит = Новый РеквизитФормы(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),ВыборкаДетальныеЗаписи.ТипЗначения,"",ВыборкаДетальныеЗаписи.Наименование,Истина);
			НовыеРеквизиты.Добавить(НовыйРеквизит);
			ИзменитьРеквизиты (НовыеРеквизиты);
			Элемент = ЭтаФорма.Элементы.Добавить(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),Тип("ПолеФормы")); 
			Элемент.Вид = ВидПоляФормы.ПолеВвода; 
			Элемент.ПутьКДанным = СтрЗаменить(НовыйРеквизит.Имя," ","");
			ЭтаФорма[СрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")] = ВыборкаДетальныеЗаписи.Значение;
		КонецЕсли;		
	КонецЦикла;
КонецПроцедуры
Показать


Код модуля формы записи РС:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Параметры.Свойство("Кошелек") Тогда
		Запись.Кошелек = Параметры.Кошелек;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	СписокПараметров = Новый Структура;
	СписокПараметров.Вставить("Свойство", Запись.Свойство);
	СписокПараметров.Вставить("Значение", Запись.Значение);
	ОповеститьОВыборе(СписокПараметров);
КонецПроцедуры
Показать


Проблема в том, как в элементе формы мне сделать отбор? Например я создал реквизит "цвет" (в ПВХ), создал значения для него "белый" и "черный" (в справочнике Доп.св-ва), а также создал реквизит "тип карты" со значениями "виза" и "мастеркард". На форме создались оба реквизита, а в поле ввода видно все 4 значения для обоих реквизитов(так как просто ссылается).
Как мне ограничить выбор в поле ввода? Примерно так, чтобы из справочника Доп.св-ва брались только те значения, у которых свойство соответствует выбранному реквизиту.
+
11. user719210 20.06.17 12:33 Сейчас в теме
Создал список значений "добавленныеРеквизиты", попытался сделать отбор через СвязьПараметровВыбора, но не получилось
&НаСервере
Процедура СозданиеРеквизита() Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ЗначенияСвойствКошельков.Свойство.Наименование КАК Наименование,
		|	ЗначенияСвойствКошельков.Свойство КАК Свойство,
		|	ЗначенияСвойствКошельков.Значение КАК Значение,
		|	СвойстваКошельков.ТипЗначения КАК ТипЗначения,
		|	ЗначенияСвойствКошельков.Свойство.Ссылка КАК СвойствоСсылка
		|ИЗ
		|	РегистрСведений.ЗначенияСвойствКошельков КАК ЗначенияСвойствКошельков
		|		ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.СвойстваКошельков КАК СвойстваКошельков
		|		ПО ЗначенияСвойствКошельков.Свойство = СвойстваКошельков.Ссылка
		|ГДЕ
		|	ЗначенияСвойствКошельков.Кошелек = &Кошелек";
	Запрос.УстановитьПараметр("Кошелек", Объект.Ссылка);
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		
		Если Элементы.Найти(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")) = Неопределено  Тогда
			НовыеРеквизиты = Новый Массив;
			НовыйРеквизит = Новый РеквизитФормы(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),ВыборкаДетальныеЗаписи.ТипЗначения,"",ВыборкаДетальныеЗаписи.Наименование,Истина);
			НовыеРеквизиты.Добавить(НовыйРеквизит);
			ИзменитьРеквизиты (НовыеРеквизиты);
			
			Элемент = ЭтаФорма.Элементы.Добавить(СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ",""),Тип("ПолеФормы")); 
			Элемент.Вид = ВидПоляФормы.ПолеВвода; 
			Элемент.ПутьКДанным = СтрЗаменить(НовыйРеквизит.Имя," ","");
			ЭтаФорма[СтрЗаменить(ВыборкаДетальныеЗаписи.Наименование," ","")] = ВыборкаДетальныеЗаписи.Значение;
			
			ДобавленныеРеквизиты.Добавить(ВыборкаДетальныеЗаписи.Свойство);  
			СвязьПараметра = Новый СвязьПараметраВыбора("Отбор.Владелец", "ДобавленныеРеквизиты"); 
			МассивПараметров = Новый Массив(); 
			МассивПараметров.Добавить(СвязьПараметра);  
			НовыеСвязи = Новый ФиксированныйМассив(МассивПараметров);  
			Элемент.СвязиПараметровВыбора = НовыеСвязи;			
		КонецЕсли;		
	КонецЦикла;
КонецПроцедуры
Показать


Не получилось, т.к. в ДобавленныеРеквизиты записываются имена всех реквизитов, далее в поле выбора каждого реквизита я вижу характеристики, которые соответствуют всем этим созданным реквизитам. Работает правильно, только если я создаю 1 реквизит, как мне это исправить?
+
12. user719210 21.06.17 06:02 Сейчас в теме
Может быть это можно сделать как-нибудь через установить действие? только вот не пойму как
+
Внимание! Тема сдана в архив

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