1. Katty_K 29.12.18 11:00 Сейчас в теме

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

Доброго времени суток форумчанам!
С наступающим!!

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

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

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

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


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

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

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

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

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

ЭтаФорма["ДополнительныйРеквизитЗначение_A8E213D4x0433x11E9x8E47x002590D75ACA_90981DC8x08DBx11E9x8E47x002590D75ACA"]
Остальные ответы
Избранное Подписка Сортировка: Древо
6. DNN13 10 29.12.18 11:51 Сейчас в теме
(1) попробуйте так

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

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

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



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

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

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

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

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



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

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

Как получить ГУИД рассказано здесь: https://infostart.ru/public/253815/
Только вместо дефисов надо проставить иксы.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист 1С
Москва
Полный день

Консультант-аналитик 1С
Москва
Полный день

Консультант ERP-систем
Москва
Временный (на проект)

Бизнес-аналитик 1С
Москва
зарплата от 90 000 руб. до 150 000 руб.
Полный день