Бьём костылями по некрасоте. УНФ3

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

Расширяю функцию СформироватьПФ модуля менеджера обработки ПечатьНакладная, где и формируется эта печатная форма.

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

И тут вижу некрасивое — 1с передает в таблицу запасов характеристику, но не передает номенклатуру.

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

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

	Результат = ПродолжитьВызов(ОписаниеПечатнойФормы, ДанныеОбъектовПечати, ОбъектыПечати, ВключаяУслуги);
	
	Возврат Результат;
КонецФункции 

Добавил нужные поля в макет:

Я ожидал, что все добавленные колонки будут выводиться в макет, но не тут-то было, пришлось расширять и процедуру ЗаполнитьДанныеПечатиПоСтрокеТабличнойЧасти:

&После("ЗаполнитьДанныеПечатиПоСтрокеТабличнойЧасти")
Процедура мл_ЗаполнитьДанныеПечатиПоСтрокеТабличнойЧасти(СтрокаТабличнойЧасти, ДанныеПечати, ПараметрыНоменклатуры, Итоги, ДанныеОбъекта)
	Если СтрокаТабличнойЧасти.Владелец().Колонки.Найти("Вес") <> Неопределено Тогда
		ДанныеПечати.Вставить("Вес", СтрокаТабличнойЧасти.Вес);                                                   
	КонецЕсли;
	Если СтрокаТабличнойЧасти.Владелец().Колонки.Найти("ЦенаЗаКг") <> Неопределено Тогда
		ДанныеПечати.Вставить("ЦенаЗаКг", СтрокаТабличнойЧасти.ЦенаЗаКг);                                                   
	КонецЕсли;
КонецПроцедуры

Получилось нормально:

Ощущение, что код в 1С пишут вредители.

Среда: 3.0.9.105 Объем: 1 час