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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

79

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. qwinter 515 16.07.18 11:22 Сейчас в теме
Работа с дополнительными реквизитами очень сильно разнится в зависимости от версии БСП. Например в последних имя реквизита на форме можно указать (просмотреть) в пользовательском виде. Об этом тоже стоило упомянуть.
PLAstic; gorakh; kadild; bulpi; +4 Ответить
2. papche 295 16.07.18 11:58 Сейчас в теме
(1)можно задать значение реквизита "Имя" в Плане видов характеристик "Дополнительные реквизиты". И соответственно этот параметр я и передаю в приведенные процедуры. Но чтобы задавать имена на формах - не видел/не слышал. Если приведете пример - буду рад
4. Jestery 16.07.18 13:53 Сейчас в теме
(2) Может имеется ввиду вот это. Честно говоря пока не понятно как это можно использовать.
Прикрепленные файлы:
5. fxmike 30 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 30 16.07.18 13:45 Сейчас в теме
Спасибо! Только вчера сидел разбирался с этими непонятными абракадабрами на форме :) А тут очень кстати ваша статья!
it4hr; papche; +2 Ответить
8. PerlAmutor 33 31.08.18 08:11 Сейчас в теме
Когда внедряли ERP по первой "развлекались" с этими доп.реквизитами, чтобы конфигурацию не кочеряжить. Потом началось. То им отчеты нужны, то печатные формы где используются эти реквизиты. Потом они хотят больше бантиков. Потом они должны участвовать в планах обменов... И все в таком духе. Это кошмар.

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

&НаСервере
Процедура СвойстваВыполнитьДополнительнуюИнициализацию();
	пп_Сервер.ПереместитьДополнительныйРеквизит(ЭтаФорма,"СерийныеНомера_ЗаданиеНаПеревозку", "пп_ГруппаДопРеквизиты", Истина);
	пп_Сервер.ПереместитьДополнительныйРеквизит(ЭтаФорма,"Комплектовщик_ЗаданиеНаПеревозку", "пп_ГруппаДопРеквизиты", Истина);
КонецПроцедуры

&НаСервере
Процедура УстановитьДоступностьЭлементовФормы(Доступность)
	Элементы.МаршрутДобавитьРаспоряжение.Доступность = Доступность;
	
	ПолеСерийныеНомера = пп_Сервер.ПолучитьПолеДополнительногоРеквизитаНаФорме(ЭтаФорма, "СерийныеНомера_ЗаданиеНаПеревозку");
	Элементы[ПолеСерийныеНомера.ИмяРеквизитаЗначение].Доступность = Истина;
	
	ПолеКомплектовщик = пп_Сервер.ПолучитьПолеДополнительногоРеквизитаНаФорме(ЭтаФорма, "Комплектовщик_ЗаданиеНаПеревозку");
	Элементы[ПолеКомплектовщик.ИмяРеквизитаЗначение].Доступность = Доступность;
	
	Элементы.Маршрут.Доступность = Доступность;
КонецПроцедуры

&НаКлиенте
Процедура пп_ПриОткрытииПосле(Отказ)
	//СвойстваВыполнитьОтложеннуюИнициализацию();
	//УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	СвойстваВыполнитьДополнительнуюИнициализацию();
	Если ПризнакЗаданиеНаОтборНапечатано Тогда
	
		//ТолькоПросмотр = Истина;	
		УстановитьДоступностьЭлементовФормы(Ложь);
		Состояние("Сформирована печатная форма ""Задания на отбор"", редактирование ограничено");
	
	КонецЕсли; 
КонецПроцедуры
Показать
17. user820037 06.11.18 13:11 Сейчас в теме
(16) Разобрался. Очень, очень помогла Ваша публикация.
20. user594726_artyem.romanenkov 06.12.18 14:36 Сейчас в теме
(16) Помогите разобраться - что делаю не так?

&НаКлиенте
Процедура ДТ_ПриОткрытииПосле(Отказ)
	
	Если Строка(Объект.ВидДокумента) = "Акт выполненных работ" Тогда
		МожноМенятьАкт = ПроверитьИзменениеАкта();	
	КонецЕсли;
	
	ДопРеквизитНаФорме = ПолучитьПолеДополнительногоРеквизитаНаФорме(ЭтаФорма, "Номер заказа в SAP");
	
	Если МожноМенятьАкт Тогда
		Элементы.ДопРеквизитНаФорме.Доступность = Истина;
	Иначе 	
		Элементы.ДопРеквизитНаФорме.Доступность = Ложь;
	КонецЕсли;	
		
КонецПроцедуры

&НаСервере
Функция ПолучитьПолеДополнительногоРеквизитаНаФорме(Форма, ИмяРеквизита) Экспорт 
	
	Список = Форма.Свойства_ОписаниеДополнительныхРеквизитов;
	
	Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Наименование", ИмяРеквизита);
	
	Если ЗначениеЗаполнено(Свойство) Тогда
	    НайденныеСтроки = Список.НайтиСтроки(Новый Структура("Свойство", Свойство));
		Если НайденныеСтроки.Количество() > 0 Тогда
			Возврат НайденныеСтроки[0];		
		КонецЕсли; 		
	КонецЕсли;
	
КонецФункции
Показать
18. manb 07.11.18 10:28 Сейчас в теме
Статья очень помогла. Спасибо))
19. user895773 21.11.18 13:09 Сейчас в теме
Вот как раз сижу разбираюсь.
УТ(11.3.4.47)
Мне надо, чтобы поле доп. реквизита имело вид "ПолеНадписи"
В расширении в процедуре формы
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Вызываю:
УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект,,Истина); \\Параметр ПоляНадписей = Истина
Но поле все равно имеет вид "ПолеВвода", да еще в список значений попадают лишние значения.

Что то делаю не так или это ошибка в конфигурации?
PS: Попытался в УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме
Исправить
Если ПоляНадписей Тогда
Элемент.Вид = ВидПоляФормы.ПолеВвода;
На
Если ПоляНадписей Тогда
Элемент.Вид = ВидПоляФормы.ПолеНадписи;

Заработало ....
Оставьте свое сообщение