Дополнительные реквизиты формы (простой вариант взаимодействия)

14.11.20

Разработка - Работа с интерфейсом

Упрощаем взаимодействия с дополнительными реквизитами на форме с помощью фиксированного соответствия.

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

Вариант, предложенный в статье выше, нельзя использовать с процедурами-событиями формы, в которых процедуры с контекстом "&НаСервере" не используются. Чтобы обойти эту проблему предлагаю следующее решение.

Немного теории:

В современных решениях, построенных на БСП, у дополнительного реквизита есть служебное имя, которое расположено внизу формы в группе "Для разработчиков". Оно состоит из наименования элемента без пробелов и лишних символов и уникального идентификатора с разделителем "_". Служебное имя создается при первой записи элемента.

Левая часть имени до разделителя как раз и будет использоваться для управления дополнительными реквизитами на форме. При необходимости это имя можно изменить через подменю "еще" - "разрешить редактирование реквизитов".

Реализация:

После создания дополнительных реквизитов типовым механизмом в дорабатываемой форме создаём фиксированное соответствие и заполняем его.  "Ключ" - это служебное имя реквизита, а "значение" - имя реквизита на форме. Так же дополняем соответствие "обратным" соответствием имён.


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

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

КонецПроцедуры

Теперь, чтобы обратиться к элементу формы достаточно обратиться к фиксированному соответствию по ключу для получения имени реквизита. Точно так же мы всегда можем понять какой элемент обрабатывается.


// Вариант 1
&НаКлиенте
Процедура ПриОткрытии(Отказ)

	ЭлементДополнительногоРеквизита = Элементы.Найти(ИмяДополнительногоРеквизитаНаКлиенте("Контрагент"));
	ЭлементДополнительногоРеквизита.Подсказка = "Это контрагент";

КонецПроцедуры

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

//Получение имени дополнительного реквизита из соответствия на сервере

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

// Еще варианты обращения к элементам и реквизитам по имени дополнительного реквизита

// Вариант 2.

// Получаем значение дополнительного реквизита
ЗначениеДополнительногоРеквизита = ЭтаФорма[ЭтаФорма.СоответствиеИменДополнительныхРеквизитов[НРег("Контрагент")]] 

// Получаем элемент формы дополнительного реквизита
ЭлементДополнительногоРеквизита = Элементы[ЭтаФорма.СоответствиеИменДополнительныхРеквизитов[НРег("Контрагент")]]

// Получаем имя элемента дополнительного реквизита формы

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

КонецПроцедуры

// Вариант 3

ИмяДополнительногоРеквизита = ЭтаФорма.СоответствиеИменДополнительныхРеквизитов.Получить(НРег("Контрагент"));

Создание ключей в соответствии осуществляется в нижнем регистре с помощью метода "НРег" - это сделано для удобства поиска значений ключей. Для соответствия ключ "Контрагент" и "контрАгент" - это разные ключи.

Замечания

При использовании данного решения обязательно необходимо, чтобы при создании дополнительных реквизитов был единый подход к формированию служебных имен дополнительных реквизитов. В части примера ниже - служебное имя формируется с дополнительным разделителем "_". - это надо учитывать. Имена до разделителя должны быть уникальными в рамках одного объекта, использующего дополнительные реквизиты.

Другие публикации:

Предварительный просмотр PDF с помощью PDF.js на WebKit

Дополнительные реквизиты соответствие БСП

См. также

БСП (Библиотека стандартных подсистем) Программист Платные (руб)

Синтакс-помощник БСП - cправочник по библиотекам стандартных подсистем и электронных документов. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП и БЭД.

1800 руб.

21.11.2024    3907    16    15    

19

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55437    17    23    

43

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    63827    44    59    

82

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    19719    28    6    

44

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    21833    mrXoxot    44    

128

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    17957    1225    elcoan    53    

125
Оставьте свое сообщение