1. Genet 12.06.19 22:00 Сейчас в теме

7.7 Запись значения периодического реквизита из контекста формы

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

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

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

Осталось дождаться, пока это дойдет до автора ветки.
Остальные ответы
Избранное Подписка Сортировка: Древо
2. Cooler 21 12.06.19 23:06 Сейчас в теме
(1)
НО че-то не работает.
Неудивительно, на это есть как минимум три причины:
Сотр.НайтиЭлемент(ТекущийЭлемент());

Во-первых, в глобальном модуле нет никакого ТекущийЭлемент() - вы не передали в процедуру Контекст.

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

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

вы пытаетесь изменить реквизит с именем "ИмяР", а не с его значением - подстановка в коде не происходит.

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

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

Осталось дождаться, пока это дойдет до автора ветки.
6. Genet 13.06.19 13:07 Сейчас в теме
(5)
Осталось дожда
Уже дошло )) Благодарю Вас друзья за участие. Буду пробовать
8. VladimirB 8 15.06.19 14:08 Сейчас в теме
(4) Да, но может обращаться через ПолучитьАтрибут(_Атрибут);
7. VladimirB 8 15.06.19 14:06 Сейчас в теме
(1)
НаДату=Дата1;
_Атрибут="Должность";
Сотр.ИспользоватьДату(НаДату);
_Должность=Сотр.ПолучитьАтрибут(_Атрибут);

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

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

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

Вакансии

Программист 1С
Бобров
зарплата от 100 000 руб. до 150 000 руб.
Временный (на проект)

Студент (стажер) 1С
Нижний Новгород
зарплата от 25 000 руб.
Полный день

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

Программист 1С
Нижний Новгород
зарплата до 100 000 руб.
Полный день

Программист 1С
Новосибирск
зарплата от 80 000 руб.
Полный день