gifts2017

Печать универсальная MS Word

Опубликовал Poppy (poppy) в раздел Печать - Универсальные печатные формы

В продолжение темы заполнения шаблонов MS Word данными из 1С (8.1). Обработка оформлена как ВПФ. Она не заточена под конкретную типовую конфигурацию и(или) шаблон документа. Алгоритм заполнения шаблона представляет собой табличный документ. Шаблон документа и алгоритм его заполнения можно хранить в самой обработке, в справочнике «Хранилище дополнительной информации» или в файлах.

Аналогичные универсальные решения:

Печать любой формы сделанной пользователем через MS Word

Универсальный механизм печати из типовых конфигураций 1С 8.1 печатных документов на базе макетов сделанных в MS Word

Использование шаблонов Word для заполнения типовых договоров

Печать внешних печатных форм в Word

 

Главное преимущество описываемой обработки от ее аналогов заключается в том, что для ее использования не нужно изменять типовую конфигурацию совсем, т.е. можно использовать в базовых версиях. Все остальное - сплошные недостатки. ;-)

 

Для работы обработки необходимо иметь шаблон в виде файла *.doc (.dot) и алгоритм его заполнения. В комплекте с обработкой идет простейший шаблон и алгоритм. Шаблон и алгоритм можно хранить в самой обработке, в справочнике «Хранилище дополнительной информации», если он имеется в конфигурации, или в файлах.

 Справочник

Алгоритм заполнения шаблона представляет собой таблицу моксель. В первом столбце которой, указываются имена параметров, во втором – код на языке 1С, для их заполнения. Имя параметра можно не указывать. В этом случае, будет просто выполнен код.

Алгоритм

Контекст, доступный из кода:

- Переменная Результат. Это переменная, куда необходимо записать значение текущего параметра. Изначально ее значение равно Неопределено;

- Структура ЛокальныеПеременные. Структура необходима для передачи каких-либо значений между алгоритмами заполнения разных параметров. При первом обращении к переменной необходимо выполнить код ЛокальныеПеременные.Вставить("ИмяПеременной ", ЗначениеПеременной); В дальнейшем можно обращаться проще: ЛокальныеПеременные.Перем1 = ЛокальныеПеременные.Перем2;

- Реквизит СсылкаНаОбъект;

- Переменная Word. СОМ объект;

- Переменная ИcпользоватьПоиск, типа булево. От значения этой переменной зависит каким образом будет передано значение параметра в Word. Истина – все вхождения имени параметра будут заменены на значение переменой Результат. В остальных случаях, значение переменной Результат будет присвоено Variable Word'а с именем параметра. По-умолчанию – Ложь

- Функция ЗначениеСвойства(<Объект>, <НаименованиеСвойства>), возвращает значение свойства с наименованием <НаименованиеСвойства> объекта по ссылке <Объект>.

 

Добавление параметра в MS Word 2003 – Меню\Вставка\Поле, Поля=DocVariable, Новое имя = имя параметра.

Добавление параметра 

Обработка поддерживает следующие дополнительные параметры:

- «Шаблон» типа строка. В этом параметре хранится имя элемента справочника «Хранилище дополнительной информации» с шаблоном Word или имя файла. Если значение не задано, то используется макет «Шаблон» самой обработки;

- «Алгоритм» типа строка. В этом параметре хранится имя элемента справочника «Хранилище дополнительной информации» с алгоритмом в таблице Моксель или имя файла. Если значение не задано, то используется макет «Алгоритм» самой обработки;

- «ИcпользоватьПоиск» типа булево. От значения этого параметра зависит каким образом будет передаваться информация в Word. Истина – все вхождения имен параметров будут заменены на их значения. В остальных случаях, будет использоваться механизм Variable Word'аДополнительные параметры..

 

 

Для подключения обработки имеется форма. Для работы формы требуется справочник "ВнешниеОбработки".

Форма подключения обработки 

В качестве примера использовались обработки:

ЗУП, внеш печ форма трудового договора (через Word)

Печать договора с покупателем в MS WORD из 1с

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ПечатьWord.epf
.epf 19,16Kb
28.10.09
878
.epf 19,16Kb 878 Скачать
Пример 19029.rar
.rar 12,44Kb
28.10.09
186
.rar 12,44Kb 186 Скачать
Пример 22106.rar
.rar 13,47Kb
28.10.09
229
.rar 13,47Kb 229 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Валерыч (Valerich) 26.10.09 17:12
плюс пока авансом, позже посмотрю
2. Alex_Sun (Alex_Sun) 27.10.09 06:22
Давайте будем идти в ногу со временем будет ли работать в офис 2007?
3. halushka (halushka) 27.10.09 07:40
Давайте не будем бежать впереди паровоза :D
2007 офис совсем другая бодяга. Там гораздо проще можно. Душелов выкладывал примерчики. При формировании файла даж офис нафиг не нужен. А для 2003-го самое то. 8)
4. Игорь <...> (I_G_O_R) 27.10.09 07:58
паровозы этож прошлый век :D
5. Pavel Grigoryev (Zen2004) 27.10.09 08:00
Сразу при зпуске :(
{ВнешняяОбработка.ПечатьWord(86,23)}: Переменная не определена (ОбщегоНазначения)
НазначениеСвойства = <<?>>ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(Объект);
{ВнешняяОбработка.ПечатьWord(86,23)}: Переменная не определена (ОбщегоНазначения)
НазначениеСвойства = <<?>>ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(Объект);
6. Poppy (poppy) 27.10.09 10:57
7. ediks (ediks) 27.10.09 12:53
аналогичная ошибка - старая конфига УПП конвертированная с 8.0.
Если обработка претендует на универсальность, то зачем использовать ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке, тем более, что эта же функция уже есть в модуле объекта? Может стоит ее переобозвать типа оПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке и использовать ее?

Или указать совместимость с типовыми конфигурациями 8.1???
8. Pavel Grigoryev (Zen2004) 27.10.09 12:55
У меня самописка с 0 никаких типовых переменных и процессов нету
9. Poppy (poppy) 27.10.09 14:09
(5),(7) Досадная ошибка. Надо убрать "ОбщегоНазначения.".
Исправлю, выложу. Спасибо за сообщение.
10. Poppy (poppy) 27.10.09 14:30
Обработка обновлена. Исправлены выявленные ошибки.
11. ediks (ediks) 27.10.09 15:13
(9) 1) Боюсь, что просто убрать "ОбщегоНазначения." не получится. Я не зря предлагал переименовать функцию, т.к у меня в общем модуле "Общего назначения" уже есть эта функция (модуль глобальный). В результате имеем:

{ВнешняяОбработка.ПечатьWord(29,9)}: Процедура или функция с указанным именем уже определена (ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке)
Функция <<?>>ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(Ссылка) Экспорт

2) Опять же тяжелое наследие 8.0:

{Форма.Форма(168)}: Поле объекта не обнаружено (ВидОбработки)
Форма.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.ПечатнаяФорма;

Форма есть, а вот реквизит отсутствует.

12. Poppy (poppy) 27.10.09 23:39
(11) п.1 так и сделаю. Чуть позже.
п.2 В "Платежных документах" таже ситуация с реквизитом. Уже исправлено. Скачай, проверь.
13. rasswet (rasswet) 28.10.09 10:03
плюсану, хотя пользоваться не буду. но описано подробно. можно понять зачем и для чего. за это и плюс.
14. Aлeкceй (alex4x) 28.10.09 13:36
на полностью самописной конфе будет работать ?
15. ediks (ediks) 28.10.09 14:42
(12) Может я чего-то не понимаю, но ситуация совершенно не изменилась. Более того, вернулась к исходному состоянию:

НазначениеСвойства = ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(Объект);

{Форма.Форма(138)}: Поле объекта не обнаружено (ВидОбработки)
Форма.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.ПечатнаяФорма;


(14) Мне кажется, не будет.
Хранилище = Справочники.ХранилищеДополнительнойИнформации.
Есть такой справочник?

Хочу попробовать обработку, но никак не могу :D
16. ediks (ediks) 28.10.09 14:55
(14) Извините, погорячился насчет справочника ХранилищеДополнительнойИнформации - его наличие ищется по метаданным и его отсутствие не влияет на работу.
А вот наличие Справочники.ВнешниеОбработки требуется при начале выбора объекта.
17. Poppy (poppy) 28.10.09 22:28
(15) Да.

С 14:30 27.10 по 22:00 28.10 на сайте была ранняя версия обработки. Все кто скачал в указанный промежуток времени - скачайте заново.

(16) В текущей версии наличие справочника "ВнешниеОбработки" проверяется при открытии формы. При его отсутствии, форма не открывается.
18. Poppy (poppy) 28.10.09 22:45
(14) Зависит от конфигурации и полноты использования обработки.

1. Для использования основного назначения обработки, твоя конфигурация должна уметь работать с ВПФ http://infostart.ru/public/16952/

2. Если ты хочешь хранить шаблон и (или) алгоритм в файлах, твоя конфигурация должна уметь передавать в ВПФ дополнительные параметры http://infostart.ru/public/17119/

3. Если ты хочешь хранить шаблон и(или) алгоритм внутри базы, у тебя в добавок к п.2 должен быть справочник "ХранилищеДополнительнойИнформации" с реквизитом Хранилище типа ХранилищеЗначения.

4. Чтобы в алгоритмах пользоваться функцией ЗначениеСвойства() в конфигурации должны быть соответствующие объекты метаданных http://infostart.ru/public/57375/

5. Если ты хочешь чтобы обработка сама зарегистрировалась в твоей базе, у тебя ВПФ должны храниться в справочнике "ВнешниеОбработки".
19. sun888 (malikov_pro) 04.02.10 10:01
не заполняет параметры если они расположены в колонтитулах, а хотелось бы :)
20. sun888 (malikov_pro) 04.02.10 15:44
алгоритм и шаблон для Трудового договора,
как заполнить <Период тарифной ставки> не знаю, если кто подскажет - буду благодарен

для склонений использовал dll из
http://infostart.ru/public/14656/
Прикрепленные файлы:
Алгоритм1.mxl
Трудовой Договор.doc
21. Роман Кириллов (poligraff) 22.03.10 09:32
Либо я что-то не так делаю...
У меня в Word 2003 не вставляется поле.
Его предварительно в свойствах документа не надо завести?
22. Евгений Ю. (Ganjubas) 25.05.10 18:32
Есть один неприятный момент, когда выгружаешь в Word 2003:
Если переменная используется в колонтитуле (в моём случае есть только нижний), то она не обновляется автоматически при вызове метода
Док.Fields.Update();
т.е. когда документ уже открылся, то нужные значения в колонтитулах не появляются.
Эту проблему нагуглил в инете и получилось чуть более громоздко, но теперь все переменные заполняются:
Для каждого oStory Из Док.StoryRanges Цикл
Для каждого oField Из oStory.Fields Цикл
oField.Update();
КонецЦикла;
КонецЦикла;

vggrigoryev; +1 Ответить 15
23. Елена Елена (prog-eg) 08.06.10 13:24
Подскажите как обновить переменную в колонтитуле, пробовала как в (22) но все равно не обновляется
24. Елена Елена (prog-eg) 08.06.10 15:34
Нашла! Это что-то вроде: (Footers - нижний колонтитул; Headers - верхний)
Замена = Док.Sections(1).Footers(1).Range.Find;
Замена.Execute(ИмяПеременной, , , , , , , , ,Строка(Значение), 2);
// обновим поля нижнего колонтитула
Док.Sections(1).Footers(1).Range.Fields.UpDate();
25. mrsdin (mrsdin) 02.10.10 17:34
Скажите пожалуйста, возможно в обработке передать в Word строку неопределенной длины (> 255 знаков) в один шаблон?
26. Владимир (a_vovan) 22.02.11 09:21
Поля типа DocVariable не заполняются в колонтитулах Word-a.

Есть варианты решения проблемы?
27. Роман Тарасевич (tarroman) 18.03.11 14:47
Не срабатывает в форме регистрации обработки прикрепление к выбранным объектам (у меня не получилось). Запариваться не стал - зашел в уже подключенной внешней печатной форме в настройки и указал назначение по объектам. Использовал обработку для заполнения шаблоно. От переменных ворда перешел на свойства документа.

Была еще мысль, что по хорошему нужно знать множество заполняемых свойств файла (один список), а уже его заполнять или же из алгоритмов (когда их заполнение обозначено) или же из свойств некоей унифицированной структуры, заполняемой запросом (в ЗиУП подобные запросы есть). Это я к тому, что всякие там сведения о организациях, физических лицах и т.п. одним шаблоном алгоритма проблематично реализовать...
28. Iom Nuerto (n949eo) 13.11.11 18:59
44. Татьяна Шулдикова (taasha25) 02.09.14 10:35
(24) prog-eg, Здравствуйте! Хотела воспользоваться Вашим методом. У меня в верхнем колонтитуле НазваниеОрганизации.

Код:
// Получим документ из объекта и активируем его
Документ = ОбъектВорд.Application.Documents(1);
Документ.Activate();

//Поиск и замена маркеров в колонтитулах
Замена1 = Документ.Sections(1).Headers(1).Range.Find;
Замена1.Execute("[НазваниеОрганизации]", , , , , , , , ,НазваниеОрганизации, 2);
// обновим поля верхнего колонтитула
Документ.Sections(1).Headers(1).Range.Fields.UpDate();

// Поиск и замена маркеров
Замена = Документ.Content.Find;
Замена.Execute("[НомерПриказа]", , , , , , , , , НомерПриказа, 2);
Замена.Execute("[Должность]", , , , , , , , ,Должность, 2);
Замена.Execute("[ДатаПриказа]", , , , , , , , ,ДатаПриказа, 2);

Поля в документе заполняет, а в колонтитуле нет. Что я написала не так?
45. Vladimir Grigoryev (vggrigoryev) 22.11.16 19:41
(22) Ganjubas, Хоть совет и старый. Но работает.
Помогло на отлично.
Спасибо большое.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа