7.7 Запись значения периодического реквизита из контекста формы
Друзья, стоит задача в контексте формы справочника при выборе значения периодического реквизита, спросило о дате на которую значение будет установлено. И все бы ничего но хочется написать универсальную процедуру для всех видов справочников и любого реквизита и вызывать ее из глобального модуля.
Предполагаю в строке формулы реквизита передавать имя реквизита. НО че-то не работает. Может подскажите как реализовать..
Предполагаю в строке формулы реквизита передавать имя реквизита. НО че-то не работает. Может подскажите как реализовать..
Процедура ИзмПер(ИмяР)
Сотр=СоздатьОбъект("Справочник.Сотрудники");
ВыбДата="";
Сотр.НайтиЭлемент(ТекущийЭлемент());
ВыбСделан = ВвестиДату (ВыбДата,"С какой даты?",0);
Если НЕ (ВыбСделан=1) Тогда // отказался вводить, гад
Возврат;
КонецЕсли;
Если СокрЛП(ИмяР)="ОдинРодитель" Тогда
Сотр.ОдинРодитель.Установить(ОдинРодительС,ОдинРодитель);
ИначеЕсли СокрЛП(ИмяР)="Должность" Тогда
Сотр.Должность.Установить(ВыбДата,Должность);
КонецЕсли;
КонецПроцедуры // ИзмПер
ПоказатьПо теме из базы знаний
Найденные решения
(3) смысл Контекст в том, что передается ссылка на объект, т.е. достаточно передать Контекст в процедуру и в ней становятся доступны все реквизиты объекта
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита>
т.ч. вам все равно придется использовать имена реквизитов и здесь или задавать их одинаково для всех используемых в процедуре объектов или проверять по типу переданного контекста и использовать конкретное имя реквизита объекта
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита>
т.ч. вам все равно придется использовать имена реквизитов и здесь или задавать их одинаково для всех используемых в процедуре объектов или проверять по типу переданного контекста и использовать конкретное имя реквизита объекта
(4)
Осталось дождаться, пока это дойдет до автора ветки.
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита>
Абсолютно верно, но объект Периодический прямо таки просится для таких случаев: в ИспользоватьОбъект() передается сам объект (Контекст) и имя изменяемого реквизита хоть строкой, хоть переменной.
Осталось дождаться, пока это дойдет до автора ветки.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Во-первых, в глобальном модуле нет никакого ТекущийЭлемент() - вы не передали в процедуру Контекст.
Во-вторых, вы пытаетесь изменить текущий объект, который на данный момент открыт - следовательно, заблокирован.
В-третьих, вот тут:
вы пытаетесь изменить реквизит с именем "ИмяР", а не с его значением - подстановка в коде не происходит.
Попробуйте передать в процедуре Контекст и сделать изменения через объект Периодический.
НО че-то не работает.
Неудивительно, на это есть как минимум три причины:
Сотр.НайтиЭлемент(ТекущийЭлемент());
Во-первых, в глобальном модуле нет никакого ТекущийЭлемент() - вы не передали в процедуру Контекст.
Во-вторых, вы пытаетесь изменить текущий объект, который на данный момент открыт - следовательно, заблокирован.
В-третьих, вот тут:
Сотр.ИмяР.Установить(ВыбДата,ИмяР);
вы пытаетесь изменить реквизит с именем "ИмяР", а не с его значением - подстановка в коде не происходит.
Попробуйте передать в процедуре Контекст и сделать изменения через объект Периодический.
Изивните, не совсем точно изложил суть. (Был в пылу размышлений )))
Данную процедуру разместил в модуле формы элемента справочника. И она работает
А в идеале хочу кинуть ее в глобальный и вызывать для любого справочника.и для любого реквизита этого справочника. для этого надо сделать чтоб в модуле не было конкретных идентификаторов реквизитов. И вот с этим у меня и затык. Не совсем понимаю ситаксис оператора Контекст.
Данную процедуру разместил в модуле формы элемента справочника. И она работает
А в идеале хочу кинуть ее в глобальный и вызывать для любого справочника.и для любого реквизита этого справочника. для этого надо сделать чтоб в модуле не было конкретных идентификаторов реквизитов. И вот с этим у меня и затык. Не совсем понимаю ситаксис оператора Контекст.
(3) смысл Контекст в том, что передается ссылка на объект, т.е. достаточно передать Контекст в процедуру и в ней становятся доступны все реквизиты объекта
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита>
т.ч. вам все равно придется использовать имена реквизитов и здесь или задавать их одинаково для всех используемых в процедуре объектов или проверять по типу переданного контекста и использовать конкретное имя реквизита объекта
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита>
т.ч. вам все равно придется использовать имена реквизитов и здесь или задавать их одинаково для всех используемых в процедуре объектов или проверять по типу переданного контекста и использовать конкретное имя реквизита объекта
(4)
Осталось дождаться, пока это дойдет до автора ветки.
но 7.7. не умеет обращаться к именам реквизитов через Спр.["ИмяРеквизита"], ей надо именно Спр.<ИмяРеквизита>
Абсолютно верно, но объект Периодический прямо таки просится для таких случаев: в ИспользоватьОбъект() передается сам объект (Контекст) и имя изменяемого реквизита хоть строкой, хоть переменной.
Осталось дождаться, пока это дойдет до автора ветки.
(1) Вот так можно обращаться в общем случае
Функция глЕстьРеквизитВСправочнике(ИмяРеквизита,Знач ВидСправочника) Экспорт
ВСтатус = 0;
Если ПустоеЗначение(ВидСправочника)=0 Тогда
ВидСправочника=?(ТипЗначения(ВидСправочника)=11,ВидСправочника.Вид(),ВидСправочника);
Если ПустоеЗначение(ИмяРеквизита) = 1 Тогда
// пустое значение имени реквизита или вида справочника
ИначеЕсли Метаданные.Справочник(ВидСправочника).Реквизит(ИмяРеквизита).Выбран() = 1 Тогда
// существует реквизит шапки
ВСтатус = 1;
КонецЕсли;
КонецЕсли;
Возврат ВСтатус;
КонецФункции
Функция глПолучитьРеквизитЭлементаСправочника(_Элемент,_ИмяРеквизита,_наДату=0) Экспорт
Если (ТипЗначения(_Элемент)<>11) или (ПустоеЗначение(_Элемент)=1) Тогда
Возврат "";
КонецЕсли;
_ВидСправочника=_Элемент.Вид();
Если глЕстьРеквизитВСправочнике(_ИмяРеквизита,_ВидСправочника)=0 Тогда
Возврат "";
КонецЕсли;
Если Метаданные.Справочник(_ВидСправочника).Реквизит(_ИмяРеквизита).Периодический=1 Тогда
Если _Элемент.ИспользоватьДату()=Дата(0) Тогда
Возврат _Элемент.ПолучитьАтрибут(_ИмяРеквизита).Получить(?(_наДату=0,ТекущаяДата(),_наДату));
Иначе
Возврат _Элемент.ПолучитьАтрибут(_ИмяРеквизита);
КонецЕсли;
КонецЕсли;
Возврат _Элемент.ПолучитьАтрибут(_ИмяРеквизита);
КонецФункции
// ***********************************************************
Функция РеквизитИзСправочника(Знач _Элемент,_ИмяРеквизита,_ПоУмолчанию=0,_наДату=0) Экспорт
Пока 1=1 Цикл
_Реквизит=глПолучитьРеквизитЭлементаСправочника(_Элемент,_ИмяРеквизита,_наДату);
Если ПустоеЗначение(_Реквизит)=0 Тогда
Возврат _Реквизит;
КонецЕсли;
_Элемент=_Элемент.Родитель;
Если ПустоеЗначение(_Элемент)=1 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот