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

14.11.20

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

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

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

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

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

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

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

Реализация:

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


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

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

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

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


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

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

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

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

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

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

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

// Вариант 2.

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

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

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

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

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

// Вариант 3

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

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

Замечания

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

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

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

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

См. также

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

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

6000 руб.

16.01.2015    62986    44    59    

82

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

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

2400 руб.

29.06.2020    18855    26    6    

41

Работа с интерфейсом Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Редактор графов в 1С - внешний отчет, который формирует графы на основе таблицы значений, используя рисунки табличного документа. Есть возможность добавления, редактирования объектов графа и выгрузки результата в таблицу значений.

1500 руб.

06.10.2020    10224    7    7    

10

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

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

20.08.2024    16805    mrXoxot    43    

121

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    11914    162    acces969    31    

124

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    5751    kalyaka    6    

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