Собственно задача с которой всё началось до безобразия проста: отправка произвольных печатных форм по e-mail. Вполне логичным в этом случае кажется использование встроенного универсального инструментария для получения печатных форм, сохранения их в виде файлов в temp-директории и последующей отправкой. Но не все так просто...
В типовых конфигурациях от 1С существует довольно мощный механизм внешних печатных форм. Зиждется он на внутреннем стандарте, подробно описанном на дисках ИТС в разделе «Система стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8»
Однако, если функция внешней обработки формирования печатных форм, созданной с соблюдением стандарта, возвращает сформированный табличный документ, то для встроенных печатных форм работает экспортная процедура модуля объекта Печать() которая не только формирует табличный документ (вызывая ту или иную неэкспортную функцию с нестандартизированным именем), но и сразу же открывает его окно (либо отсылает его на принтер). Нам же ни окно, ни, тем более, распечатанные бумажки не нужны. Нужно-то всего ничего: объект типа табличный документ… Что прикажете делать? Лопатить модули всех объектов, дописывая ключевое Экспорт и где-то хранить имена функций для каждого из объектов? Дублировать встроенные печатные формы внешними? Сомнительное удовольствие.
Но всё же выход есть. Кроется он в экспортной процедуре НапечататьДокумент(), вызываемой как для встроенных так и для внешних печатных форм.
Вот как выглядит девственно-нетронутое тело этой процедуры:
Если ПечДокумент = Неопределено тогда
Возврат;
КонецЕсли;
// Получить необходимое количество копий
Если КоличествоЭкземпляров > 0 Тогда
ПечДокумент.КоличествоЭкземпляров = КоличествоЭкземпляров;
КонецЕсли;
Вживим сюда небольшой имплант:
Если ПечДокумент = Неопределено тогда
Возврат;
КонецЕсли;
//+++++
Если КоличествоЭкземпляров = -1 Тогда
// Вызов процедуры печати из внешнего объекта
КоличествоЭкземпляров = ПечДокумент;
Возврат;
КонецЕсли;
//-----
// Получить необходимое количество копий
Если КоличествоЭкземпляров > 0 Тогда
ПечДокумент.КоличествоЭкземпляров = КоличествоЭкземпляров;
КонецЕсли;
Теперь, если на вход процедуры вторым параметром передать переменную, содержащую значение –1, то после исполнения процедуры эта самая переменная (благодаря тому что переменные передаютя по ссылке) будет содержать требуемый табличный документ. Что, собственно и требовалось.
Таким образом, для получения произвольной имеющейся печатной формы объекта достаточно выполнить примерно такой код:
ТабДок = -1;
УниверсальныеМеханизмы.ПечатьПоДополнительнойКнопке(…, …, …, …, ТабДок);
А уж дальше с содержащимся в ТабДок объектом разработчик волен поступать как сочтет нужным.
PS примеры процедур и функций взяты из типовой БП 1.6.15.5.