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

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

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

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

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

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

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

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

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

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

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

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

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

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

fixin

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

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

комментариев 7

  1. rzd:

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

    Очень сомнительное высказывание

    • в практике фрилансера «Изменение и контроль» — зло
      Будет часто слетать при обновлениях, клиент будет нервничать.

      • rzd:

        При обновлении надо следить. Благо при подключении внешних редакторов это делается в 99% случаях практически автоматически. Гораздо хуже когда разъедется вместо — если будет синтакс ошибка — это будет меньшее зло

        • Ты путаешь, когда во Вместо пишешь весь код процедуры со своими изменениям и когда во вместо вызываваешь типовой код.
          Я ратую за последнее. опыт подсказывает, что такое использование вместо надежнее и работает дольше.

          • rzd:

            Что значит дольше? Вы обновляете основную конфигурацию не проверив расширения? Вы адекват?

  2. Дмитрий:

    «….И тут вижу некрасивое — 1с передает в таблицу запасов характеристику, но не передает номенклатуру»
    А не получится из Характеристики брать Владельца?

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

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