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

Программирование - Практика программирования

расширение конфигурации БСП дополнительные реквизиты дополнительные реквизиты на форме

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

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

  1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме?

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

Вот собственно и все, чем хотел поделиться, ставим лайк, если полезно

76

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. qwinter 510 16.07.18 11:22 Сейчас в теме
Работа с дополнительными реквизитами очень сильно разнится в зависимости от версии БСП. Например в последних имя реквизита на форме можно указать (просмотреть) в пользовательском виде. Об этом тоже стоило упомянуть.
PLAstic; gorakh; kadild; bulpi; +4 Ответить
2. papche 280 16.07.18 11:58 Сейчас в теме
(1)можно задать значение реквизита "Имя" в Плане видов характеристик "Дополнительные реквизиты". И соответственно этот параметр я и передаю в приведенные процедуры. Но чтобы задавать имена на формах - не видел/не слышал. Если приведете пример - буду рад
4. Jestery 16.07.18 13:53 Сейчас в теме
(2) Может имеется ввиду вот это. Честно говоря пока не понятно как это можно использовать.
Прикрепленные файлы:
5. fxmike 27 16.07.18 14:18 Сейчас в теме
(4) Как непонятно, все же понятно. В этом поле задается значение реквизита "Имя" для доп свойства. Подразумевается, что оно уникальное в пределах базы данных, система следит за этим. Поиск свойства и обращение к нему удобно вести по этому имени. Можно даже задать его, но только при первоначальном создании доп, потом уже редактировать не дает. Во встроенных функциях также можно использовать обращение по этому имени.
6. Denis S 16.07.18 18:04 Сейчас в теме
(5) Редактировать можно, в группе "Еще" есть команда "Разрешить редактирование реквизитов".
Stref75; fxmike; +2 Ответить
7. kembrik 16.07.18 19:20 Сейчас в теме
(4) Использую частенько, особенно в запросах как параметр, не надо тогда следить за принадлежностью к конкретному набору и городить конструкции с "Где" и коротким заголовком
3. fxmike 27 16.07.18 13:45 Сейчас в теме
Спасибо! Только вчера сидел разбирался с этими непонятными абракадабрами на форме :) А тут очень кстати ваша статья!
it4hr; papche; +2 Ответить
8. PerlAmutor 30 31.08.18 08:11 Сейчас в теме
Когда внедряли ERP по первой "развлекались" с этими доп.реквизитами, чтобы конфигурацию не кочеряжить. Потом началось. То им отчеты нужны, то печатные формы где используются эти реквизиты. Потом они хотят больше бантиков. Потом они должны участвовать в планах обменов... И все в таком духе. Это кошмар.

Если организация решила сэкономить на программисте 1С, то этот вариант ей подойдет до момента пока им не понадобится этот дополнительный реквизит использовать где-то еще.
9. gorakh 17 31.08.18 09:16 Сейчас в теме
(8)Доп реквизиты полезная штука. Положим у нас есть 100 тыс. элементов справочника номенклатуры. в 1000 элементов характерезует какое-то свойство. А всем остальным элементов это свойство не нужно и всегда будет пустым. Вот в этолм случае очень хорошо помогают дополнительные реквизиты. А в отчетах на СКД их использовать очень просто. И в обменах не сложнее чем обычные элементы.
10. kolya_tlt 11 31.08.18 11:22 Сейчас в теме
(8) самое страшное будет когда будет меняться бизнес логика документов в зависимости от реквизитов.
еще сложнее когда начнутся зависимости друг от друга. например в примере автора можно водителя закреплять за определенным авто в определенные дни, и поступит требование чтобы водителя можно было выбрать в зависимости от этой связки.
кстати вроде есть функционал упаковок в программе. зачем было городить доп реквизиты Количество мест и тип упаковки?
11. papche 280 01.09.18 11:26 Сейчас в теме
(10)Собственно, статья не про полезность и необходимость использования доп реквизитов, а про то как решать указанные в топике задачи, если уж вступили на "скользкую дорожку" использования доп реквизитов.
Сама по себе тема необходимости и оптимальности использования дополнительных реквизитов заслуживает целой серии статей и сотен сломанных копий )). Я тут - пас
men1949; Fox-trot; it4hr; +3 Ответить
12. yelloo 4 02.09.18 23:08 Сейчас в теме
Коротко: автор рассказал, что есть такая штука как БСП и какие методы есть в подсистеме доп свойств/реквизитов.
Эта статья для самых ленивых, не способных воспользоваться отладчиком любого справочника с доп. реквизитом.
13. papche 280 03.09.18 13:56 Сейчас в теме
(12) БСП не упоминал, ни прямо, ни косвенно)))
14. men1949 11.10.18 17:42 Сейчас в теме
Спасибо! Когда "дело дошло до тела", потребовалось разместить доп. реквизиты на форме в нужном порядке и в нужных местах, вспомнил об этой статье. Помогло сберечь уйму времени)))
Оставьте свое сообщение