Статья является продолжением цикла статей и разработок:
Внешние печатные формы в восьмерке http://infostart.ru/blogs/157
Обработка для тестирования внешних печатных форм в восьмерке http://infostart.ru/projects/833/
Использование встроенного почтового клиента — http://infostart.ru/blogs/161/
Документ с печатью и подписью — http://infostart.ru/blogs/162/
Внешние печатные формы в восьмерке II — http://infostart.ru/blogs/324/
Заполнение табличных частей документов в восьмерке (внешние обработки) http://infostart.ru/blogs/345/
Обработка для тестирования внешних обработок изменения табличных частей http://infostart.ru/projects/1749/
Использование свойств объектов при доработке типовых конфигураций http://infostart.ru/blogs/692/
Попробуем устранить рассмотренное упущение. Код можно добавить в саму конфигурацию или использовать технологию внешних печатных форм //infostart.ru/articles/157/?ref=4246 .
Для начала нам нужно получить табличный документ с подготовленной печатной формой. К сожалению, воспользоваться методом Печать() документа не получится. Если в конфигурации разрешены изменения, то можно добавить ключевое слово Экспорт функциям, которые непосредственно формируют печатные формы. Если такой возможности нет, придется копировать алгоритм формирования печатной формы в свою обработку.
После того, как получен табличный документ, необходимо создать новое письмо и добавить документ в качестве вложения. Самый простой способ – это воспользоваться функцией НаписатьПисьмо() из общего модуля. Например:
ИмяФайла = "Счет #" + Шапка.Номер + " от " + Формат(Шапка.Дата, "ДЛФ=D"); ИмяФайлаПолное = "" + КаталогВременныхФайлов() + ИмяФайла + ".mxl"; ТабДокумент.Записать(ИмяФайлаПолное); СтруктураФайла = Новый Структура; СтруктураФайла.Вставить("ИмяФайла", ИмяФайла + ".mxl"); СтруктураФайла.Вставить("Наименование", ИмяФайла); СтруктураФайла.Вставить("Хранилище", Новый ДвоичныеДанные(ИмяФайлаПолное)); СписокФайловВложений = Новый СписокЗначений; СписокФайловВложений.Добавить(СтруктураФайла); Кому = Новый СписокЗначений; Кому.Добавить(ОпределитьАдресПолучателя(Шапка.Получатель), Шапка.Получатель.НаименованиеПолное); СтруктураНовогоПисьма = Новый Структура; СтруктураНовогоПисьма.Вставить("СписокФайловВложений", СписокФайловВложений); СтруктураНовогоПисьма.Вставить("Тема", ИмяФайла); СтруктураНовогоПисьма.Вставить("Кому", Кому); СтруктураВозврата = НаписатьПисьмо(глТекущийПользователь, СтруктураНовогоПисьма,,,,,,, Ложь); СтруктураВозврата.Форма.Открыть(); Возврат Неопределено;
Недостатком такого способа является то, что пользователь может проконтролировать печатную форму только после того, как письмо создано и записано. Это связано с ограничениями функция НаписатьПисьмо().
Второй способ. В обработке добавить форму, на которой разместить ТабличныйДокумент и кнопку «Отправить». В этом случае, пользователь видит печатную форму и только потом принимает решение об отправке ее в письме. В функции формирования печатной формы пишем:
Форма = ЭтотОбъект.ПолучитьФорму(); ТабДокумент = Форма.ЭлементыФормы.ПолеТабличногоДокумента; // Здесь алгоритм формирования печатной формы Форма.Открыть(); Возврат Неопределено;
В модуле формы пишем:
Процедура КнопкаОтправитьНажатие(Кнопка) ИмяФайла = "Счет #" + СсылкаНаОбъект.Номер + " от " + Формат(СсылкаНаОбъект.Дата, "ДЛФ=D"); ИмяФайлаПолное = "" + КаталогВременныхФайлов() + ИмяФайла + ".mxl"; ЭлементыФормы.ПолеТабличногоДокумента.Записать(ИмяФайлаПолное); СтруктураФайла = Новый Структура; СтруктураФайла.Вставить("ИмяФайла", ИмяФайла + ".mxl"); СтруктураФайла.Вставить("Наименование", ИмяФайла); СтруктураФайла.Вставить("Хранилище", Новый ДвоичныеДанные(ИмяФайлаПолное)); СписокФайловВложений = Новый СписокЗначений; СписокФайловВложений.Добавить(СтруктураФайла); Кому = Новый СписокЗначений; Кому.Добавить(ОпределитьАдресПолучателя(СсылкаНаОбъект.Контрагент), СсылкаНаОбъект.Контрагент.НаименованиеПолное); СтруктураНовогоПисьма = Новый Структура; СтруктураНовогоПисьма.Вставить("СписокФайловВложений", СписокФайловВложений); СтруктураНовогоПисьма.Вставить("Тема", ИмяФайла); СтруктураНовогоПисьма.Вставить("Кому", Кому); СтруктураВозврата = НаписатьПисьмо(глТекущийПользователь, СтруктураНовогоПисьма,,,,,,, Ложь); СтруктураВозврата.Форма.Открыть(); УдалитьФайлы(ИмяФайлаПолное); ЭтаФорма.Закрыть(); КонецПроцедуры
Третий способ. Без использования дополнительной формы.
Как и в первом случае используем функцию НаписатьПисьмо() и обходим ее ограничения.
ИмяФайла = "Счет #" + Шапка.Номер + " от " + Формат(Шапка.Дата, "ДЛФ=D"); ИмяФайлаПолное = "" + КаталогВременныхФайлов() + ИмяФайла + ".mxl"; ТабДокумент.Записать(ИмяФайлаПолное); Кому = Новый СписокЗначений; Кому.Добавить(ОпределитьАдресПолучателя(Шапка.Получатель), Шапка.Получатель.НаименованиеПолное); СтруктураНовогоПисьма = Новый Структура; СтруктураНовогоПисьма.Вставить("Тема", ИмяФайла); СтруктураНовогоПисьма.Вставить("Кому", Кому); СтруктураВозврата = НаписатьПисьмо(глТекущийПользователь, СтруктураНовогоПисьма,,,,,,, Истина); ВложенияПисьма = СтруктураВозврата.Форма.ВложенияПисьмаТЗ; НовоеВложение = ВложенияПисьма.Добавить(); НовоеВложение.ИмяФайла = ИмяФайла + ".mxl"; НовоеВложение.Наименование = ИмяФайла; НовоеВложение.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайлаПолное), Новый СжатиеДанных()); УдалитьФайлы(ИмяФайлаПолное); Возврат Неопределено;
В рассмотренном случае пользователь получает готовое письмо, которое еще не записано. Он может посмотреть печатную форму и принять решение об отправке письма.
Да, как однако все непросто…
http://www.infostart.ru/projects/316/?ref=174
в 7.7 — решается в полпинка.. программить вообще ничего не надо.
Решение для 7.7 смотрим здесь:
[BEST] МАЛЕНЬКИЙ ШЕДЕВР 1.2 Мгновенная отправка по почте ЛЮБОЙ печатной формы БЕЗ ИЗМЕНЕНИЯ КОДА
НУ почему сразу програмить, все достаточно быстро, я при переходе решал проблему, в течении часа ковыряния конфигурации, пришел к следующему , была сделана дополнительная обработка по формированию печатной формы документа, ее сохранению и формированию письма, практически все было сделано с помощью Ctrl+C -> Ctrl+V
Почему не работает следующая конструкция:
Не ставится КОПИЯ.
Подскажите, пожалуйста!