Каталог решений - Заполнение дополнительных реквизитов при программном открытии формы из другой формы

Заполнение дополнительных реквизитов при программном открытии формы из другой формы

Заполнение дополнительных реквизитов при программном открытии формы из другой формы

В наличии

Дополнительные реквизиты в типовых конфигурациях хранятся у объектов в табличной части ДополнительныеРеквизиты.
Но на форме ее нет. Так что же заполнять при программном заполнении формы для открытия?
И откуда берется нечто вида «ДополнительныйРеквизитЗначение_ 2C506AEDx453Ax11E8x8130x0050569C309C_ 03D89E6Fx64A2x11E8xBDFBx0022642B037A»?

Категория:

Описание

Дополнительные реквизиты в типовых конфигурациях хранятся у объектов в табличной части ДополнительныеРеквизиты.

Например, есть документ Отпуск. У него есть дополнительный реквизит "Не по графику", тип булево.

Если мы попробуем заполнить программно табличную часть ДополнительныеРеквизиты на форме, т.е. ДанныеФормыКоллекция ДополнительныеРеквизиты Объекта полученной формы ФормаСозданияДокумента (где значение РеквизитыДокумента25.НеПоГрафику = Истина):

&НаСервере
Функция ПолучитьРеквизитыОтпуск25(ИмяДокумента, УИД) Экспорт
  ...
  РеквизитыДокумента25 = Новый Структура;
  РеквизитыДокумента25.Вставить("НеПоГрафику", ТекДокументТам.ФлагОтпускНеПоГрафику);
  РеквизитыДокумента25.Вставить("НеПоГрафикуСвойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Не по графику"));

.....
&НаКлиенте
Процедура ЗагрузитьДокумент25(Команда = Неопределено)
  ...
  РеквизитыДокумента25 = ПолучитьРеквизитыОтпуск25(ТекДокумент.ТипДокументаТам, ТекДокумент.УИД);
  ...

  Если РеквизитыДокумента25 <> Неопределено Тогда
				
    Если РеквизитыДокумента25.НеПоГрафику Тогда
      ПараметрыОтбораСтрок = Новый Структура;
      ПараметрыОтбораСтрок.Вставить("Свойство", РеквизитыДокумента25.НеПоГрафикуСвойство);
      ОтобранныеСтроки = ФормаСозданияДокумента.Объект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбораСтрок);
      Если ОтобранныеСтроки.Количество() > 0 Тогда
        Для каждого Стр Из ОтобранныеСтроки Цикл
          Стр.Значение = РеквизитыДокумента25.НеПоГрафику;
        КонецЦикла;
      Иначе
        Стр = ФормаСозданияДокумента.Объект.ДополнительныеРеквизиты.Добавить();
        Стр.Свойство = РеквизитыДокумента25.НеПоГрафикуСвойство;
        Стр.Значение = РеквизитыДокумента25.НеПоГрафику;
      КонецЕсли;
    КонецЕсли;
  ...
  КонецЕсли;

то при открытии этой формы дополнительный реквизит не будет заполнен.

При изучении состава формы в отладчике находим таинственный реквизит формы ДополнительныйРеквизитЗначение_2C506AEDx453Ax11E8x8130x0050569C309C_03D89E6Fx64A2x11E8xBDFBx0022642B037A.

Начинаем копать код ПриСозданииНаСервере формы и узнаем, что в этот момент, при серверном создании формы, такие синтетические имена и образуются. Есть такая серверная процедура общего модуля УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(УправляемаяФорма) для этих целей.

Но повторно в нее не залезешь, форма уже получена 🙁 С клиента на сервер уже управляемую форму не передашь.

Остается переписать ее в свою процедуру (ФормаОбъект — Объект формы передаем по значению, чтобы не выдавались ругательные сообщения о попытке поменять этот Объект):

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

КонецФункции

Попутно узнаем о еще одном интересном реквизите формы — Свойства_НаборыДополнительныхРеквизитовОбъекта.
И организовываем, например, такой вызов нашей новой процедуры:

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

  Если РеквизитыДокумента25 <> Неопределено Тогда
    ...
    //СписокДопРеквизитов - состав: в значении: СтруктураДопРеквизитов, в представлении: имя доп.свойства как в Предприятии
    //СтруктураДопРеквизитов: 
    //ДопРеквизитНаименование - имя доп.свойства как в Предприятии
    //ДопРеквизитИмяВФорме - имя на форме, типа ДополнительныйРеквизитЗначение_2C506AEDx453Ax11E8x8130x0050569C309C_03D89E6Fx64A2x11E8xBDFBx0022642B037A
    //ДопРеквизитЗначение - Булево значение
			
    Свойства_НаборыДополнительныхРеквизитовОбъекта = ФормаСозданияДокумента.Свойства_НаборыДополнительныхРеквизитовОбъекта;
    СписокДопРеквизитов = ПолучитьСписокДопРеквизитовДляФормы(ФормаСозданияДокумента.Объект, Свойства_НаборыДополнительныхРеквизитовОбъекта);
				
    Для каждого СтрДопРекв Из СписокДопРеквизитов Цикл
      СтруктураДопРеквизитов = СтрДопРекв.Значение;
      Если СтрДопРекв.Представление = "Не по графику" Тогда
        ФормаСозданияДокумента[СтруктураДопРеквизитов.ДопРеквизитИмяВФорме] = СтруктураДопРеквизитов.ДопРеквизитЗначение; //РеквизитыДокумента25.НеПоГрафику;
      КонецЕсли; 
    КонецЦикла;
    ...
  КонецЕсли; 

 

И для полноты статьи, текст используемой типовой функции ЗначенияСвойств() общего модуля УправлениеСвойствамиСлужебный (галочки "сервер","внешнее соединение"; галочки "вызов сервера" нет, поэтому ее вызвать с клиента нельзя):

 

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

 

has been added to your cart:
Оформление заказа