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

14.11.20

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

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

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

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

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

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

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

Реализация:

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


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

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

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

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


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

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

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

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

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

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

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

// Вариант 2.

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

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

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

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

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

// Вариант 3

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

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

Замечания

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

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

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

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

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

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

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

6000 руб.

16.01.2015    61794    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

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

5000 руб.

14.01.2016    54401    16    21    

42

Управление дашбордами

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

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

2400 руб.

29.06.2020    16696    21    4    

35

Конструктор HTML, CSS и javascript

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

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

2 стартмани

10.04.2023    9611    151    acces969    31    

118

Модель состояния для MVC

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

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

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12080    1    5    

10

Модули общего назначения - готовые полезные функции и процедуры конфигураций на БСП

Универсальные функции БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

25.04.2022    14977    quazare    11    

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