Подмена объекта для работы расширения

Не очень люблю писать процедуры расширения с типом «изменение и контроль». Поэтому всячески пытаюсь избежать этого.

Вот и в этот раз я выкрутился. Нужно было изменить процедуру модуля ВариантыОтчетовКлиент. В ней была ошибка, т.к. форма была без объекта, не знаю почему 1С не исправили, код типовой:

Процедура ОформитьПользователейВариантаОтчета(Форма, СбрасыватьПризнакИспользования = Истина) Экспорт 
	
	Элементы = Форма.Элементы;
	Объект = Форма.Объект;
	
	ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента();
	ЦветНеактивныхЗначений = ПараметрыКлиента.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет;
	
	Если Не СбрасыватьПризнакИспользования Тогда 
		
		Элементы.ПользователиВарианта.ЦветТекста = ?(Объект.ТолькоДляАвтора, ЦветНеактивныхЗначений, Новый Цвет);
		Возврат;
		
	КонецЕсли;
	
	КоличествоПомеченных = 0;
	
	Для Каждого Строка Из Форма.ПользователиВарианта Цикл 
		
		КоличествоПомеченных = КоличествоПомеченных + Булево(Строка.Пометка);
		
	КонецЦикла;
	
	Объект.ТолькоДляАвтора = (КоличествоПомеченных = 0);
	Форма.Доступен = ?(Объект.ТолькоДляАвтора, "ТолькоДляАвтора", "УказаннымПользователям");
	
	Элементы.ПользователиВарианта.ЦветТекста = ?(Форма.Объект.ТолькоДляАвтора, ЦветНеактивныхЗначений, Новый Цвет);
	
КонецПроцедуры

Процедура обрабатывала выбор пользователя при добавлении пользователя, которому доступен сохраняемый вариант отчета.

Я сделал подмену объекта:

&Вместо("ОформитьПользователейВариантаОтчета")
Процедура дор_ОформитьПользователейВариантаОтчета(Форма, СбрасыватьПризнакИспользования)
	Попытка
		ТекОбъект = Форма.Объект;
		ПродолжитьВызов(Форма, СбрасыватьПризнакИспользования);
	Исключение  
		//Если есть ошибка, то скопируем код из обработки, поправленный
		ТекФорма = Новый Структура();
		ТекФорма.Вставить("Элементы", Форма.Элементы);
		ТекФорма.Вставить("ТолькоДляАвтора", Форма.ВариантТолькоДляАвтора);
		ТекФорма.Вставить("ПользователиВарианта", Форма.ПользователиВарианта);
		ТекФорма.Вставить("Доступен", Форма.Доступен);
		ТекФорма.Вставить("Объект", ТекФорма);
		ПродолжитьВызов(ТекФорма, СбрасыватьПризнакИспользования);          
		Форма.ВариантТолькоДляАвтора= ТекФорма.ТолькоДляАвтора;
		Форма.Доступен = ТекФорма.Доступен;
	КонецПопытки;
КонецПроцедуры

Такой подменой удалось обмануть расширение, в которую передаю не форму, а структуру. Обратите внимание на обратную передачу значения полей формы «Доступен» и «ВариантТолькоДляАвтора«.

Я такой метод использовал уже ранее, например вместо выборки можно подсунуть коду таблицу значений, чтобы при необходимости менять поля выборки.

Среда: УНФ 1.6.25.152

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *