Работаем с дополнительными реквизитами на форме

Пара полезных процедур для работы с дополнительными реквизитами на форме. Далее в статье: 1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме? 2. Как проверить до записи корректность заполнения пользователем дополнительного реквизита? 3. Как заполнить значение дополнительного реквизита по другому событию и обновить данные на форме? 4. Как расположить дополнительный реквизит в указанном месте на форме?

Вот пара задач на размышление:

  1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме?
  2. Как проверить корректность заполнения пользователем дополнительного реквизита, если значение некорректно – уведомить и отказать в записи объекта? Напоминаю, что до записи объекта в ТЧ Дополнительные реквизиты – данных еще нет, а на форме – уже есть.
  3. Как заполнить значение дополнительного реквизита при записи (или по другому событию) и обновить данные на форме?
  4. Как расположить дополнительный реквизит в указанном месте на форме?

Далее привожу решение этих задач — поковыряться с отладчиком пришлось изрядно…

Итак, вот решение:

  1. Для начала смотрим с отладчиком, появились ли Допреквизиты на форме после ПриСозданииНаСервере? Нет. А после ПриОткрытии? Тоже нет. А вот после активизации закладки «Дополнительно»  — появились со страшными именами как на скриншоте. Это было создано типовой процедурой  УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект), которая создала реквизиты на форме
ОписаниеСвойства.ИмяУникальнаяЧасть = 			СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Набор.УникальныйИдентификатор())), "-", "x") + "_" + СтрЗаменить(ВРег(Строка(ОписаниеСвойства.Свойство.УникальныйИдентификатор())), "-", "x");				ОписаниеСвойства.ИмяРеквизитаЗначение =			"ДополнительныйРеквизитЗначение_" + ОписаниеСвойства.ИмяУникальнаяЧасть;

 После чего Система располагает реквизиты на форме

Добавление /изменение реквизитов на форме возможно благодаря следующей интересной конструкции.

Реквизит = Новый РеквизитФормы(ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение, ФорматированнаяСтрока, , ОписаниеСвойства.Наименование, Истина);
            ДобавляемыеРеквизиты.Добавить(Реквизит);

  Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Но это нам сейчас все не нужно, так, для любопытства.
 

А вот чтобы работать с реквизитами нужно научиться получать их имена на форме по имени дополнительного реквизита. На радость разработчикам при работе с допреквизитами на форме Система создает служебный реквизит «Свойства_ОписаниеДополнительныхРеквизитов» который содержит на форме коллекцию данных, где есть все необходимы нам данные, можно найти и по имени, и найти соответствующее свойство ПланаВидаХарактеристик

Далее дело техники. По имени дополнительного реквизита получаем Поле дополнительного реквизита, и делаем с ним что хотим

Функция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт 
	
	Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
	
	Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", ИмяРеквизита);
	
	Если ЗначениеЗаполнено(Свойство) Тогда
	    НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
		Если НайденныеСтроки.Количество() > 0 Тогда
			Возврат НайденныеСтроки[0];		
		КонецЕсли; 		
	КонецЕсли;
	
КонецФункции
  1. Используя функцию из п1 — нужно проверить значение поля дополнительного реквизита на форме     
Функция ПолучитьЗначениеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт
	Перем ЗначениеРеквизита;
	
	ПолеДополнительногоРеквизитаНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита);
	
	Если не ПолеДополнительногоРеквизитаНаФорме = Неопределено Тогда
		Возврат Форма[ПолеДополнительногоРеквизитаНаФорме.ИмяРеквизитаЗначение];
	КонецЕсли;
	
КонецФункции

 3. Используя функцию из п1 — нужно установить значение поля дополнительного реквизита на форме

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

4. Используя функцию из п1 – нужно выполнить волшебную процедуру «Переместить» для коллекции Элементов формы                      

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

В итоге, можно управлять дополнительными реквизитами на форме – почти так же комфортно, как и собственными. И ничего менять в конфигурации – не пришлось – все управление находится в расширении

Вывод: таким образом, не меняя конфигурацию, и используя механизмы дополнительных реквизитов и расширений всех типовых конфигураций, мы управляем расположением реквизитов и программно контролируем их заполнение и содержание.

Проверено на КА 2.4.2.132, но вполне универсально для всех БСП неустановленной версии 

Вам также может понравиться

About the Author: Павел Пчелинцев