Друзья, стоит задача в контексте формы справочника при выборе значения периодического реквизита, спросило о дате на которую значение будет установлено. И все бы ничего но хочется написать универсальную процедуру для всех видов справочников и любого реквизита и вызывать ее из глобального модуля.
Предполагаю в строке формулы реквизита передавать имя реквизита. НО че-то не работает. Может подскажите как реализовать..

```1c
    Процедура ИзмПер(ИмяР)
    Сотр=СоздатьОбъект("Справочник.Сотрудники");
    ВыбДата=";
    Сотр.НайтиЭлемент(ТекущийЭлемент());
    ВыбСделан = ВвестиДату (ВыбДата,"С какой даты?",0);
    Если НЕ (ВыбСделан=1) Тогда // отказался вводить, гад
    Возврат;
    КонецЕсли;
    Если СокрЛП(ИмяР)="ОдинРодитель" Тогда
    Сотр.ОдинРодитель.Установить(ОдинРодительС,ОдинРодитель);
    ИначеЕсли СокрЛП(ИмяР)="Должность" Тогда
    Сотр.Должность.Установить(ВыбДата,Должность);
    КонецЕсли;
    КонецПроцедуры // ИзмПер
```
---
смысл Контекст в том, что передается ссылка на объект, т.е. достаточно передать Контекст в процедуру и в ней становятся доступны все реквизиты объекта
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита>

т.ч. вам все равно придется использовать имена реквизитов и здесь или задавать их одинаково для всех используемых в процедуре объектов или проверять по типу переданного контекста и использовать конкретное имя реквизита объекта
---
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита> Абсолютно верно, но объект Периодический прямо таки просится для таких случаев: в ИспользоватьОбъект() передается сам объект (Контекст) и имя изменяемого реквизита хоть строкой, хоть переменной.

Осталось дождаться, пока это дойдет до автора ветки.
---
НО че-то не работает. Неудивительно, на это есть как минимум три причины:
Сотр.НайтиЭлемент(ТекущийЭлемент());
Во-первых, в глобальном модуле нет никакого ТекущийЭлемент() - вы не передали в процедуру Контекст.

Во-вторых, вы пытаетесь изменить текущий объект, который на данный момент открыт - следовательно, заблокирован.

В-третьих, вот тут:
Сотр.ИмяР.Установить(ВыбДата,ИмяР);
вы пытаетесь изменить реквизит с именем "ИмяР", а не с его значением - подстановка в коде не происходит.

Попробуйте передать в процедуре Контекст и сделать изменения через объект Периодический.
---
Изивните, не совсем точно изложил суть. (Был в пылу размышлений )))
Данную процедуру разместил в модуле формы элемента справочника. И она работает
А в идеале хочу кинуть ее в глобальный и вызывать для любого справочника.и для любого реквизита этого справочника. для этого надо сделать чтоб в модуле не было конкретных идентификаторов реквизитов. И вот с этим у меня и затык. Не совсем понимаю ситаксис оператора Контекст.
---
смысл Контекст в том, что передается ссылка на объект, т.е. достаточно передать Контекст в процедуру и в ней становятся доступны все реквизиты объекта
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита>

т.ч. вам все равно придется использовать имена реквизитов и здесь или задавать их одинаково для всех используемых в процедуре объектов или проверять по типу переданного контекста и использовать конкретное имя реквизита объекта
---
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита> Абсолютно верно, но объект Периодический прямо таки просится для таких случаев: в ИспользоватьОбъект() передается сам объект (Контекст) и имя изменяемого реквизита хоть строкой, хоть переменной.

Осталось дождаться, пока это дойдет до автора ветки.
---
Осталось дожда Уже дошло )) Благодарю Вас друзья за участие. Буду пробовать
---
Да, но может обращаться через ПолучитьАтрибут(_Атрибут);
---
```1c
    НаДату=Дата1;
    _Атрибут="Должность";
    Сотр.ИспользоватьДату(НаДату);
    _Должность=Сотр.ПолучитьАтрибут(_Атрибут);

    НаДату=Дата2;
    _Атрибут="Оклад";
    Сотр.ИспользоватьДату(НаДату);
    Сотр.УстановитьАтрибут(_Атрибут,НовыйОклад);
```
---
Вот так можно обращаться в общем случае

```1c
    Функция глЕстьРеквизитВСправочнике(ИмяРеквизита,Знач ВидСправочника) Экспорт
    ВСтатус = 0;
    Если ПустоеЗначение(ВидСправочника)=0 Тогда
    ВидСправочника=?(ТипЗначения(ВидСправочника)=11,ВидСправочника.Вид(),ВидСправочника);
    Если ПустоеЗначение(ИмяРеквизита) = 1 Тогда
    // пустое значение имени реквизита или вида справочника
    ИначеЕсли Метаданные.Справочник(ВидСправочника).Реквизит(ИмяРеквизита).Выбран() = 1 Тогда
    // существует реквизит шапки
    ВСтатус = 1;
    КонецЕсли;
    КонецЕсли;
    Возврат ВСтатус;
    КонецФункции

    Функция глПолучитьРеквизитЭлементаСправочника(_Элемент,_ИмяРеквизита,_наДату=0) Экспорт
    Если (ТипЗначения(_Элемент)<>11) или (ПустоеЗначение(_Элемент)=1) Тогда
    Возврат ";
    КонецЕсли;
    _ВидСправочника=_Элемент.Вид();
    Если глЕстьРеквизитВСправочнике(_ИмяРеквизита,_ВидСправочника)=0 Тогда
    Возврат ";
    КонецЕсли;
    Если Метаданные.Справочник(_ВидСправочника).Реквизит(_ИмяРеквизита).Периодический=1 Тогда
    Если _Элемент.ИспользоватьДату()=Дата(0) Тогда
    Возврат _Элемент.ПолучитьАтрибут(_ИмяРеквизита).Получить(?(_наДату=0,ТекущаяДата(),_наДату));
    Иначе
    Возврат _Элемент.ПолучитьАтрибут(_ИмяРеквизита);
    КонецЕсли;
    КонецЕсли;
    Возврат _Элемент.ПолучитьАтрибут(_ИмяРеквизита);
    КонецФункции
    // ***********************************************************
    Функция РеквизитИзСправочника(Знач _Элемент,_ИмяРеквизита,_ПоУмолчанию=0,_наДату=0) Экспорт
    Пока 1=1 Цикл
    _Реквизит=глПолучитьРеквизитЭлементаСправочника(_Элемент,_ИмяРеквизита,_наДату);
    Если ПустоеЗначение(_Реквизит)=0 Тогда
    Возврат _Реквизит;
    КонецЕсли;
    _Элемент=_Элемент.Родитель;
    Если ПустоеЗначение(_Элемент)=1 Тогда
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Возврат 0;
    КонецФункции
```