Еще один пример спускания контекста внутрь черного ящика. УНФ 1.6

Мне понадобилось в некоторых печатных формах делать замены в названии характеристик.

Где делать замены, я нашел — эта функция вызывалась из всех интересных мне отчетов:

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

Вот тут я и вспомнил свою методику спуска контекста вниз по стеку, о которой писал ранее.

Я завел параметр сеанса и процедуры по его установке:

//Модуль ТР_Сервер

Функция ПолучитьЭтоПечатнаяФормаКлиенту() Экспорт
	УстановитьПривилегированныйРежим(Истина);
	Попытка      
		Возврат ПараметрыСеанса.ТР_ЭтоПечатнаяФормаКлиенту; 
	Исключение
	КонецПопытки;
	Возврат ложь; 
КонецФункции

Процедура УстановитьЭтоПечатнаяФормаКлиенту(Значение) Экспорт
	УстановитьПривилегированныйРежим(Истина);
	ПараметрыСеанса.ТР_ЭтоПечатнаяФормаКлиенту = Значение; 
КонецПроцедуры

Далее я написал определение, нужно ли менять представление характеристики в зависимости от печатной формы (внутренней, для склада, или внешней, для клиента) для модуля ПечатьДокументов:

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

&НаСервере
Функция ИменаПечатныхФормКлиента(Знач Имя) Экспорт
	Имя = СокрЛП(ВРЕГ(Строка(Имя)));
	Возврат 
	Найти(Имя, "СЧЕТ") <> 0
	ИЛИ Найти(Имя, "КОММЕРЧ")<> 0
	ИЛИ Найти(Имя, "ЗАКАЗ") <> 0 И Найти(Имя, "КЛИЕНТ") <> 0
	ИЛИ Найти(Имя, "ЗАКАЗ") <> 0 И Найти(Имя, "ПОКУПАТЕЛ") <> 0
	;
КонецФункции

Ну и теперь, обладая данными о том, с какой формой работаю, можно принимать решение, делать замены или нет:

&Вместо("ПредставлениеНоменклатурыДляПечати")
Функция ТР_ПредставлениеНоменклатурыДляПечати(ПредставлениеНоменклатуры, ПредставлениеХарактеристики, ПредставлениеСерииНоменклатуры, ПредставлениеПартии, ПредставлениеКодаТНВЭД, НеобходимоВыделитьКакСоставНабора)
	
	//Осипов 2022-05-16 убираем нюансы из печатных форм клиенту 
	//Новое представление нужно, т.к. если сюда передается ссылка, мы не можем ее менять
	НовоеПредставлениеХарактеристики = ПредставлениеХарактеристики;
	Если ТР_Сервер.ПолучитьЭтоПечатнаяФормаКлиенту() Тогда
		ПозУбрать = Найти(ВРЕГ(ПредставлениеХарактеристики), "- ХХ.СС.");
		Если ПозУбрать = 0 Тогда
			ПозУбрать = Найти(ВРЕГ(ПредставлениеХарактеристики), "- ХХ.НН.");
		КонецЕсли;
		Если ПозУбрать = 0 Тогда
			ПозУбрать = Найти(ВРЕГ(ПредставлениеХарактеристики), "- ММ КК");
		КонецЕсли;
		Если ПозУбрать <> 0 Тогда
			НовоеПредставлениеХарактеристики = Лев(ПредставлениеХарактеристики, ПозУбрать - 1);
		КонецЕсли;
	КонецЕсли;
	
	Результат = ПродолжитьВызов(ПредставлениеНоменклатуры, НовоеПредставлениеХарактеристики, ПредставлениеСерииНоменклатуры, ПредставлениеПартии, ПредставлениеКодаТНВЭД, НеобходимоВыделитьКакСоставНабора);
	Возврат Результат;
КонецФункции

Среда: 1.6.26.172. Объем: 1.5 час.

fixin

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

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

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

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