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

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

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

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

    Если Объект.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Смета") Тогда

    ВидДокументаСмета = Объект.ВидДокумента;
    ВидДокументаАктДеф = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Акт дефектования");

    НаборЗаписей = РегистрыСведений.НастройкаСвязей.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.СсылкаИз.Установить(ВидДокументаСмета);
    НаборЗаписей.Отбор.СсылкаНа.Установить(ВидДокументаАктДеф);
    НаборЗаписей.Прочитать();

    Если НаборЗаписей.Количество() = 1 Тогда
    НоваяЗапись = НаборЗаписей[0];
    Иначе
    Возврат;
    КонецЕсли;

    Если СокрЛП(ВидРабот) = "Капитальный ремонт" Тогда
    НоваяЗапись.Обязательная = Истина;
    Иначе
    НоваяЗапись.Обязательная = Ложь;
    КонецЕсли;
    НаборЗаписей.Записать(Истина);

    КонецЕсли;
    КонецПроцедуры
```

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

Доп. реквизит расположен на вкладке "Свойства" на форме первым, поэтому вроде таким способом определила его имя:

```1c
    ДопРеквизиты = Элементы.ГруппаСвойства.ПодчиненныеЭлементы.Получить(0);
    ДопРеквизитВидРабот = ДопРеквизиты.ПодчиненныеЭлементы.Получить(0);
    Сообщить(ДопРеквизитВидРабот.Имя);
```

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

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

```1c
    Объект.ДополнительныйРеквизитЗначение_A8E213D4x0433x11E9x8E47x002590D75ACA_90981DC8x08DBx11E9x8E47x002590D75ACA
```
 - не работает))

Если что, я новичок, прошу строго не судить :)
---
попробуйте так

ЭтаФорма["ДополнительныйРеквизитЗначение_A8E213D4x0433x11E9x8E47x002590D75ACA_90981DC8x08DBx11E9x8E47x002590D75ACA"]
---
попробуйте так

ЭтаФорма["ДополнительныйРеквизитЗначение_A8E213D4x0433x11E9x8E47x002590D75ACA_90981DC8x08DBx11E9x8E47x002590D75ACA"]
---
Ураа!!! :))) Спасибо!!!!! Выдает нужно значение!
---
А почему с формы получаете? В нынешних же конфигурациях доп реквизиты хранятся в ТЧ. Если Вы значение заполняете как-то доп реквизита, то он уже будет в табличной части. Ну, не запросом, а циклом её придётся пробежать тогда)
---
Пробовала изначально, есть такая функция в ДО - АвтозаполнениеШаблоновФайловСервер.ПолучитьЗначениеДопРеквизитаОбъекта(Объект, "Вид работ"), но возвращает пустое значение, я так поняла, потому что объект еще не записан
---
потому что объект еще не записанА Вы в качества аргумента функции "Объект" что передаете? Объект или ссылку? Если допреквизиты лежат в ТЧ, то можно просто найти в ТЧ Объект.ДополнительныеРеквизиты (или как-то так - посмотрите в объекте) по виду реквизита, а если они отдельно в регистрах, то на форме создаются реквизиты и при записи объекта пишутся в регистр. Как их получить - это смотреть надо.
---
пробовала и Объект, и Объект.Ссылка передавать - всегда пустое значение выдает.
В справочнике ВнутренниеДокументы есть ТЧ ДополнительныеЗначения, да. Она добавлена в расширение.
Пробую проверить, есть ли там что-то в момент выполнения моей процедуры:

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

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

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

Только не спрашивайте, почему таким кривым методом проверяю, а не с помощью отладчика, у меня на клиент-серверном варианте точки останова не работают))
---
Объект есть даже до записи. Может, Вы передаёте не объект
---
да вроде объект передаю...
---
Хочу добавить, если вдруг кому пригодится, что в теме не совсем правильный код процедуры, после установки/снятия признака обязательности связи, необходимо еще перечитать для объекта обязательные связи, т.к. это происходит в событии ПриСозданииНаСервере, то есть до записи.
В итоге получилось так:

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

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

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

    Если Объект.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Смета") Тогда

    ВидДокументаСмета = Объект.ВидДокумента;
    ВидДокументаАктДеф = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Акт дефектования");

    НаборЗаписей = РегистрыСведений.НастройкаСвязей.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.СсылкаИз.Установить(ВидДокументаСмета);
    НаборЗаписей.Отбор.СсылкаНа.Установить(ВидДокументаАктДеф);
    НаборЗаписей.Прочитать();

    Если НаборЗаписей.Количество() = 1 Тогда
    НоваяЗапись = НаборЗаписей[0];
    Иначе
    Возврат;
    КонецЕсли;

    Если Строка(ЭтаФорма["ДополнительныйРеквизитЗначение_A8E213D4x0433x11E9x8E47x002590D75ACA_90981DC8x08DBx11E9x8E47x002590D75ACA"]) = "Капитальный ремонт" Тогда
    НоваяЗапись.Обязательная = Истина;
    Иначе
    НоваяЗапись.Обязательная = Ложь;
    КонецЕсли;
    НаборЗаписей.Записать(Истина);

    Если ЗначениеЗаполнено(Объект.ВидДокумента) Тогда
    Делопроизводство.ПрочитатьОбязательныеТипыСвязей(ЭтаФорма, ОбязательныеТипыСвязей, Объект.Ссылка, Объект.ВидДокумента);

    Если ТипЗнч(Основание) = Тип("СправочникСсылка.ВнутренниеДокументы") И Не ТипСвязиВыбран Тогда
    МассивТиповСвязей = ПолучитьТипыСвязей(Основание, Объект.ВидДокумента);
    КонецЕсли;

    КонецЕсли;

    Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
    Делопроизводство.ПрочитатьОбязательныеСвязи(Объект.Ссылка,
    ОбязательныеТипыСвязей, ОбязательныеСвязи);
    КонецЕсли;

    КонецЕсли;
    КонецПроцедуры
```

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

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

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

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

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

    СвойствоДляРазработчикаДатаПубликации = ПолучитьСсылкуНаДопРеквизитДатаПубликации(); //ссылка ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения, нужно через функцию найти нужный доп.реквизит

    Для каждого Эл Из Свойства_ОписаниеДополнительныхРеквизитов Цикл

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

    КонецЦикла;

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

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

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

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

    КонецФункции
```
---
Свойства_ОписаниеДополнительныхРеквизитов У меня ругается на "Свойства_ОписаниеДополнительныхРеквизитов" - у Вас конфигурация не 1С БП 3.0 ?
---
я делала на ЗУП 3.1