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

1. blandinko 29.12.18 11:00 Сейчас в теме
Доброго времени суток форумчанам!
С наступающим!!

Есть задача:
в 1С ДО при создании внутреннего документа вида "Смета" (в ДО документы являются элементами справочников) пользователь заполняет дополнительный реквизит "Вид ремонта", который определяет, должна ли быть обязательная связь с видом документа "Акт дефектования". В настройках связей нет возможности указать условие обязательности связи между видами документов, поэтому чтобы реализовать эту задачу, было создано расширение, содержащее форму внутреннего документа, и в ней процедуру на событие формы ПередЗаписью (Перед основным событием):

&НаКлиенте
Процедура СМЗ_ПередЗаписьюПеред(Отказ, ПараметрыЗаписи)
    //Получить значение доп. реквизита формы "Вид работ"
    СМЗ_УстановкаОбязСвязиСметыСАктомДеф(ВидРабот);
КонецПроцедуры

&НаСервере
Процедура СМЗ_УстановкаОбязСвязиСметыСАктомДеф(ВидРабот)

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


Проблема в том, что я не понимаю, как получить значение дополнительного реквизита из реквизита формы (так как документ еще не записан), учитывая, что дополнительные реквизиты на форме размещаются динамически при создании определенного вида документа.

Доп. реквизит расположен на вкладке "Свойства" на форме первым, поэтому вроде таким способом определила его имя:
ДопРеквизиты = Элементы.ГруппаСвойства.ПодчиненныеЭлементы.Получить(0);
ДопРеквизитВидРабот = ДопРеквизиты.ПодчиненныеЭлементы.Получить(0);
Сообщить(ДопРеквизитВидРабот.Имя);

Имя элемента доп.реквизита:
"ДополнительныйРеквизитЗначение_A8E213D4x0433x11E9x8E47x0025­90D75ACA_90981DC8x08DBx11E9x8E47x002590D75ACA"

Как мне теперь получить/передать/использовать его значение в процедуре на сервере?
Объект.ДополнительныйРеквизитЗначение_A8E213D4x0433x11E9x8E47x002590D75ACA_90981DC8x08DBx11E9x8E47x002590D75ACA
- не работает))

Если что, я новичок, прошу строго не судить :)
По теме из базы знаний
Найденные решения
6. Dmitrij-2 47 29.12.18 11:51 Сейчас в теме
(1) попробуйте так

ЭтаФорма["ДополнительныйРеквизитЗначение_A8E213D4x0433x11E9x8E47x002590D75ACA_90981DC8x08DBx11E9x8E47x002590D75ACA"]
user1965444; WhiteTee; kabantus; blandinko; +4 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. Dmitrij-2 47 29.12.18 11:51 Сейчас в теме
(1) попробуйте так

ЭтаФорма["ДополнительныйРеквизитЗначение_A8E213D4x0433x11E9x8E47x002590D75ACA_90981DC8x08DBx11E9x8E47x002590D75ACA"]
user1965444; WhiteTee; kabantus; blandinko; +4 Ответить
8. blandinko 29.12.18 12:11 Сейчас в теме
(6) Ураа!!! :))) Спасибо!!!!! Выдает нужно значение!
2. Kovekh 29.12.18 11:26 Сейчас в теме
А почему с формы получаете? В нынешних же конфигурациях доп реквизиты хранятся в ТЧ. Если Вы значение заполняете как-то доп реквизита, то он уже будет в табличной части. Ну, не запросом, а циклом её придётся пробежать тогда)
3. blandinko 29.12.18 11:35 Сейчас в теме
(2) Пробовала изначально, есть такая функция в ДО - АвтозаполнениеШаблоновФайловСервер.ПолучитьЗначениеДопРеквизитаОбъекта(Объект, "Вид работ"), но возвращает пустое значение, я так поняла, потому что объект еще не записан
4. starik-2005 3051 29.12.18 11:41 Сейчас в теме
(3)
потому что объект еще не записан
А Вы в качества аргумента функции "Объект" что передаете? Объект или ссылку? Если допреквизиты лежат в ТЧ, то можно просто найти в ТЧ Объект.ДополнительныеРеквизиты (или как-то так - посмотрите в объекте) по виду реквизита, а если они отдельно в регистрах, то на форме создаются реквизиты и при записи объекта пишутся в регистр. Как их получить - это смотреть надо.
7. blandinko 29.12.18 12:00 Сейчас в теме
(4) пробовала и Объект, и Объект.Ссылка передавать - всегда пустое значение выдает.
В справочнике ВнутренниеДокументы есть ТЧ ДополнительныеЗначения, да. Она добавлена в расширение.
Пробую проверить, есть ли там что-то в момент выполнения моей процедуры:

&НаКлиенте
Процедура СМЗ_ПередЗаписьюПеред(Отказ, ПараметрыЗаписи)
    СМЗ_УстановкаОбязСвязиСметыСАктомДеф();
КонецПроцедуры

&НаСервере
Процедура СМЗ_УстановкаОбязСвязиСметыСАктомДеф()
	Для Каждого ДопРеквизит Из Объект.ДополнительныеРеквизиты Цикл
		Сообщить(1);
	КонецЦикла;
КонецПроцедуры;
Показать



Ничего не выдает...

Только не спрашивайте, почему таким кривым методом проверяю, а не с помощью отладчика, у меня на клиент-серверном варианте точки останова не работают))
5. Kovekh 29.12.18 11:45 Сейчас в теме
(3)
Объект есть даже до записи. Может, Вы передаёте не объект
9. blandinko 29.12.18 13:22 Сейчас в теме
(5) да вроде объект передаю...
10. blandinko 29.12.18 13:34 Сейчас в теме
Хочу добавить, если вдруг кому пригодится, что в теме не совсем правильный код процедуры, после установки/снятия признака обязательности связи, необходимо еще перечитать для объекта обязательные связи, т.к. это происходит в событии ПриСозданииНаСервере, то есть до записи.
В итоге получилось так:

&НаКлиенте
Процедура СМЗ_ПередЗаписьюПеред(Отказ, ПараметрыЗаписи)
		СМЗ_УстановкаОбязСвязиСметыСАктомДеф();

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

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



Имя дополнительного реквизита на форме складывается следующим образом:

"ДополнительныйРеквизитЗначение_" + ГУИД объекта, содержащего доп. реквизит + "_" + ГУИД самого доп. реквизита

Как получить ГУИД рассказано здесь: https://infostart.ru/public/253815/
Только вместо дефисов надо проставить иксы.
mikl79; spmisc; +2 Ответить
11. mikl79 119 02.11.22 08:49 Сейчас в теме
(10)
спасибо очень помогло
только сначала не понял что это такое - ГУИД объекта, содержащего доп. реквизит
потом с помощью обработки из статьи, указанной ниже, определил, что это Справочник.НаборыДополнительныхРеквизитовИСведений
12. Margo462 492 01.09.23 18:22 Сейчас в теме
Я сделала примерно вот так:

Код в модуле формы


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

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

	Если НЕ НазваниеДопРеквизитаНаФорме = Неопределено Тогда
		ДатаПубликации = ЭтаФорма[НазваниеДопРеквизитаНаФорме];  
	КонецЕсли;

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

&НаСервереБезКонтекста
Функция ПолучитьСсылкуНаДопРеквизитДатаПубликации()

	СсылкаНаСвойствоДатаПубликации = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ДатаПубликации");	
    Возврат СсылкаНаСвойствоДатаПубликации;
	
КонецФункции


Показать
13. Blazerize 22.10.23 14:31 Сейчас в теме
(12)
Свойства_ОписаниеДополнительныхРеквизитов
У меня ругается на "Свойства_ОписаниеДополнительныхРеквизитов" - у Вас конфигурация не 1С БП 3.0 ?
14. Margo462 492 22.10.23 15:01 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот