Иногда требуется модифицировать встроенные печатные формы. Один из вариантов - выносить их во внешние печатные формы (чтобы конфигурацию не сильно портить). Но сталкиваемся с проблемой: хотя в типовой конфигурации логически выделяется в виде функции печать каждой печатной формы, но идет непосредственно обращение к реквизитам документа. А во внешней печатной форме этих реквизитов нет, есть только ссылка на объект. Приходится менять код формирования печатной формы не только там, где это нужно нам, но и везде. Плюс это вызовет проблему при возможном обновлении этого участка кода у поставщика конфигурации - придется или вникать в изменения после обновления, или заново вносить все наши изменения.
Как вариант решения этой проблемы - завести во внешней обработке, содержащей печатную форму, переменные, аналогичные реквизитам и табличным частям документа. А чтобы не уподобляться мастерам китайского кода, и не писать вещи, такие как: Реквизит1 = Док.Реквизит1 и т.д., можно воспользовать хорошей функцией
ЗаполнитьЗначенияСвойств
. Только переменные в обработке нужно объявлять экспортными. Вот пример кода модуля для внешней печатной формы заказа на производство (текст модуля ПечатьЗаказа() убран из соображений краткости).Перем мВалютаРегламентированногоУчета Экспорт;
Перем //реквизиты док-та
ВремяНапоминания Экспорт,
ДатаИсполнения Экспорт,
Комментарий Экспорт,
НапомнитьОСобытии Экспорт,
Организация Экспорт,
Ответственный Экспорт,
Подразделение Экспорт,
Исполнитель Экспорт,
ОсновнойЗаказНаПроизводство Экспорт,
ДатаЗапуска Экспорт;
Перем
Номер Экспорт, Дата Экспорт, Проведен Экспорт, Ссылка Экспорт;
Перем //табличные части док-та
Продукция Экспорт,
ПараметрыВыпускаПродукции Экспорт,
Материалы Экспорт;
Процедура ЗаполнитьЗначенияРеквизитовИзДокумента()
ЗаполнитьЗначенияСвойств(ЭтотОбъект, СсылкаНаОбъект);
КонецПроцедуры
Функция ПечатьЗаказа()
КонецФункции // ПечатьЗаказа()
Функция Печать() Экспорт
Если Не УправлениеДопПравамиПользователей.РазрешитьПечатьНепроведенныхДокументов(СсылкаНаОбъект.Проведен) Тогда
Предупреждение("Недостаточно полномочий для печати непроведенного документа!");
Возврат Неопределено;
КонецЕсли;
ТабДокумент = ПечатьЗаказа();
Возврат ТабДокумент;
КонецФункции
Такой подход позволяет нетронутыми использовать участки типового кода, внося изменения только там, где это нужно.
необходимо зарегистрироваться для просмотра ссылки