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С, ведущий консультант
Санкт-Петербург
Полный день

Руководитель проектов 1С
Санкт-Петербург
Полный день

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

Консультант 1 С
Краснодар
зарплата от 50 000 руб. до 150 000 руб.
Полный день

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