Получение данных из другой формы в 1с

1. Новичок1с 4 30.06.20 22:03 Сейчас в теме
Доброго вечера.
Мне необходимо из основной формы получить форму настроек.
Я делаю по аналогии с работающим отчётом.
В модуле основной формы- (форма настроек открывается)
такой код:

//**************************************************************************************************************
&НаКлиенте

Процедура ОткрытьНастройки(Команда)
	ПараметрыОткрытия = Новый Структура("СтруктураОтчета",ПолучитьСтруктуруОтчета());

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

КонецПроцедуры  // ОткрытьНастройки()

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

//**************************************************************************************************************

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
		
	УстановитьЗначенияРеквизитов(Параметры);
	
			
КонецПроцедуры  //ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

//**************************************************************************************************************

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

	
КонецПроцедуры  //УстановитьЗначенияРеквизитов(Параметры)
//**************************************************************************************************************
Показать



В модуле формы настроек

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

КонецПроцедуры //ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//**************************************************************************************************************
Показать




Я прошу помощи в объяснении рабочего кода. Что необходимо писать в процедуре УстановитьЗначенияРеквизитов??

И у меня на данный момент не работает :(
только открывается форма настрое

В отладчике- СтруктураОтчета- нужные, но пустые поля.
По теме из базы знаний
Найденные решения
13. Новичок1с 4 04.07.20 14:17 Сейчас в теме
Получилось :)
Благодарю Всех за помощь и за советы

Взяла другой отчёт и по шаблону сделала
На основной форме

&НаКлиенте
Процедура ОткрытьНастройки(Команда)
	//https://www.about1c.ru/v83/language-reference/other/procedure-fill-property-values

	//Источник = Новый Структура("Наименование,Код", "Стул деревянный", 1);
	//Получатель = Новый Структура("Наименование,Код");
	//ЗаполнитьЗначенияСвойств(Получатель, Источник);

	Парам = ПолучитьСтруктуруРеквизитов();
	ЗаполнитьЗначенияСвойств(Парам, Объект);

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

	Возврат СтруктураРеквизитов;
КонецФункции   //ПолучитьСтруктуруРеквизитов()
//**************************************************************************************************************

Показать


на форме настроек

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

Процедура НастройкиОтчета(Настройки) Экспорт
	
	// Пустой модуль что бы не ругалась система
	НовыеНастройки = Настройки;
	Настройки      = НовыеНастройки;
	
КонецПроцедуры
//**************************************************************************************************************

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
		
	ЭтаФорма.Параметры.Свойство("ДатаНач",Объект.ДатаНач);
	ЭтаФорма.Параметры.Свойство("ДатаКон",Объект.ДатаКон);
	ЭтаФорма.Параметры.Свойство("ЛицевойСчёт",Объект.ЛицевойСчёт);
	ЭтаФорма.Параметры.Свойство("Представитель",Объект.Представитель);
	ЭтаФорма.Параметры.Свойство("МинСумма",Объект.МинСумма);
	ЭтаФорма.Параметры.Свойство("МаксСумма",Объект.МаксСумма);
	
КонецПроцедуры  //ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)

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

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

Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. vadim.semyonov.rzn 01.07.20 11:07 Сейчас в теме
(1)
Форма.ОткрытьМодально()
возвращает значение, которое Вам нужно обработать. Вы вызываете функцию как процедуру. В приведенном коде "ЗаполнитьЗначенияСвойств(Объект,Форма)" вызывается сразу за открытием формы, не дожидаясь заполнения полей в ней. А вообще, уходите от модальности, воспользуйтесь описанием оповещения о закрытии формы настроек (в которой при закрытии возвращайте заполненные значения как структуру).
5. SlavaKron 01.07.20 12:20 Сейчас в теме
(4) ОткрытьМодально() - это синхронный вызов, то есть выполнение кода после этой строчки останавливается пока форма не будет закрыта, поэтому ЗаполнитьЗначенияСвойств(Объект,Форма) отработает корректно. В остальном согласен, лучше использовать оповещение о закрытии.
10. independ 1527 01.07.20 17:34 Сейчас в теме
(1) Можно проще используя ВладелецФормы
В основной форме открываем форму настроек
    ОткрытьФорму("ВнешняяОбработка.Тест.Форма.ФормаНастроек",,ЭтаФорма);

В форме настроек обращаемся к реквизитам основной формы через ВладелецФормы
 ВладелецФормы.Отчет.ВариантМакета              = Параметры.ВариантМакета;  //Из  рабочего образца
  ВладелецФормы.ДатаНач                             = Параметры.ДатаНач;
   ВладелецФормы.ДатаКон                             = Параметры.ДатаКон;
 


     ВладелецФормы.Объект.Задолженность.Очистить();
    НоваяСтрока             =  ВладелецФормы.Объект.Задолженность.Добавить();
    НоваяСтрока.ЛС             =  ВладелецФормы.Объект.ЛицевойСчёт;
    НоваяСтрока.Помещение     =  ВладелецФормы.Объект.ЛицевойСчёт.Помещение;
Новичок1с; +1 Ответить
11. user5300 1021 02.07.20 08:35 Сейчас в теме
(1)
Вот здесь вручную пропиши параметры
&НаКлиенте
Функция ПолучитьСтруктуруОтчета()
    
    СтруктураОтчета = Новый Структура;
    СтруктураОтчета.Вставить("ДатаНач"   ДатаНач);
    СтруктураОтчета.Вставить("ДатаКон"   ДатаКон);
    СтруктураОтчета.Вставить("МинСумма"   МинСумма);
    СтруктураОтчета.Вставить("МаксСумма"  МаксСумма );
    СтруктураОтчета.Вставить("ЛицевойСчёт"   ЛицевойСчёт);
    СтруктураОтчета.Вставить("Представитель"   Представитель);
    
    
    ///ЗаполнитьЗначенияСвойств(СтруктураОтчета,Объект);
    
    Возврат СтруктураОтчета;
    
КонецФункции //ПолучитьСтруктуруОтчета()
Показать
Новичок1с; +1 Ответить
12. Новичок1с 4 04.07.20 09:12 Сейчас в теме
(11)
ПолучитьСтруктуруОтчета


///ЗаполнитьЗначенияСвойств(СтруктураОтчета,Объект);
Закоментировала эту строчку, не получается ничего.. :(

сейчас продолжу отладчиком смотреть и буду сравнивать с рабочим отчётом
2. alex-l19041 8 01.07.20 10:03 Сейчас в теме
в ПолучитьСтруктуруОтчета() СтруктураОтчета заполняется данными ?
3. Новичок1с 4 01.07.20 10:58 Сейчас в теме
(2)
Нет, все поля пустые :(
Я добавила ещё этот код в основную форму, а то до него ругался при открытии.

Процедура УстановитьЗначенияРеквизитов(Параметры)
		Если Параметры.Свойство("ДатаНач") Тогда
		Объект.ДатаНач          = Параметры.ДатаНач;
	КонецЕсли; //Параметры.Свойство("ДатаНач") Тогда

6. user5300 1021 01.07.20 13:12 Сейчас в теме
(3) а если сначала заполнить форму а потом открыть ?

Процедура ОткрытьНастройки(Команда)
    ПараметрыОткрытия = Новый Структура("СтруктураОтчета",ПолучитьСтруктуруОтчета());

    Форма  = ПолучитьФорму("ВнешняяОбработка.Тест.Форма.ФормаНастроек",ПараметрыОткрытия,ЭтаФорма);
    ЗаполнитьЗначенияСвойств(Объект,Форма); ///ВОт так
     Форма.ОткрытьМодально();
     
    

КонецПроцедуры  // ОткрытьНастройки()

Показать
9. Новичок1с 4 01.07.20 16:33 Сейчас в теме
(6)
Попробовала 2 Ваших предложенных варианта, к сожалению не получается
7. user5300 1021 01.07.20 13:15 Сейчас в теме
Или так ;
ЭлементыОтбора = Новый Структура("СтруктураОтчета",ПолучитьСтруктуруОтчета());
ПараметрыОткрытия = Новый Структура("ЗначенияЗаполнения", ЭлементыОтбора);
ОткрытьФорму("ВнешняяОбработка.Тест.Форма.ФормаНастроек", ПараметрыФормы);

8. Новичок1с 4 01.07.20 15:58 Сейчас в теме
(7)
Пробую различные варианты, что-то не получается.
Я не могу понять, в какую форму необходимо вписать эту процедуру
Я на форме настроек хочу поменять ЛС и затем на основной форме очистить ТЧ и добавить строчку с нужным ЛС

&НаСервере
Процедура ЛСПриИзмененииНаСервере()
	Объект.Задолженность.Очистить();
	НоваяСтрока 			= Объект.Задолженность.Добавить();
	НоваяСтрока.ЛС 			= Объект.ЛицевойСчёт;
	НоваяСтрока.Помещение 	= Объект.ЛицевойСчёт.Помещение;
	
КонецПроцедуры  //ЛСПриИзмененииНаСервере()
Показать
13. Новичок1с 4 04.07.20 14:17 Сейчас в теме
Получилось :)
Благодарю Всех за помощь и за советы

Взяла другой отчёт и по шаблону сделала
На основной форме

&НаКлиенте
Процедура ОткрытьНастройки(Команда)
	//https://www.about1c.ru/v83/language-reference/other/procedure-fill-property-values

	//Источник = Новый Структура("Наименование,Код", "Стул деревянный", 1);
	//Получатель = Новый Структура("Наименование,Код");
	//ЗаполнитьЗначенияСвойств(Получатель, Источник);

	Парам = ПолучитьСтруктуруРеквизитов();
	ЗаполнитьЗначенияСвойств(Парам, Объект);

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

	Возврат СтруктураРеквизитов;
КонецФункции   //ПолучитьСтруктуруРеквизитов()
//**************************************************************************************************************

Показать


на форме настроек

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

Процедура НастройкиОтчета(Настройки) Экспорт
	
	// Пустой модуль что бы не ругалась система
	НовыеНастройки = Настройки;
	Настройки      = НовыеНастройки;
	
КонецПроцедуры
//**************************************************************************************************************

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
		
	ЭтаФорма.Параметры.Свойство("ДатаНач",Объект.ДатаНач);
	ЭтаФорма.Параметры.Свойство("ДатаКон",Объект.ДатаКон);
	ЭтаФорма.Параметры.Свойство("ЛицевойСчёт",Объект.ЛицевойСчёт);
	ЭтаФорма.Параметры.Свойство("Представитель",Объект.Представитель);
	ЭтаФорма.Параметры.Свойство("МинСумма",Объект.МинСумма);
	ЭтаФорма.Параметры.Свойство("МаксСумма",Объект.МаксСумма);
	
КонецПроцедуры  //ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)

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

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

Показать
14. Новичок1с 4 06.07.20 08:32 Сейчас в теме
Единственный минус

При открытии обработки вначале необходимо открыть форму настроек (хотя настройки сохраняются при закрытии). Без этого открытия формы настроек не получается заполнять данные
Оставьте свое сообщение

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