Обработка печатной формы WORD клиент-сервер УФ



Это моя первая статья на данном портале, но попытаюсь изложить все понятно и подробно.
Долгое время у меня заняло создание такой вот внешней обработки. Есть очень много примеров, как сделать подобное на неуправляемых формах (2.0) и очень мало информации касательно управляемых(3.0), по крайней мере я многого найти не смог в доступе. Создание подобное обработки выглядит вполне несложно, если производить все действия на сервере, как это было с 2.0, но в нашем случае необходимо инициализировать открытие документа на клиенте, чему сильно мешает отсутствие возможности передать макет Active Document с сервера на клиент.

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

1. Открываем модуль объекта обработки и создаем там Функцию СведенияОВнешнейОбработке() (естественно экспортную):

 

  СведенияОВнешнейОбработке()

Как мы видим, использовать будем ВызовКлиентскогоМетода, по скольку открыть файл нужно будет на компьютере пользователя.

Далее понадобится создать еще две процедуры здесь же:

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

 

 ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")

3. И функция по созданию этой самой таблицы команд:

 

 ПолучитьТаблицуКоманд()

(Из комментариев можно подробней понять, для чего используется тот или иной параметр-поле данной таблицы)

На этом настройка регистрации внешней обработки в нужной вам конфигурации закончена.

Далее. Самое интересное: создание, заполнение и вывод макета клиенту.

Первое, что нам необходимо сделать, это создать макет нашего документа(Изображение 3). Макет понадобится двоичный, т.к. обычный мы на клиент не передадим(как я и говорил ранее). Заменяем нужные данные в шаблоне, перед загрузкой в обработку, "Параметрами", у меня они выглядят так, на примере: "{Сотрудник}"(кавычки не учитывать), после чего загружаем в Обработку-Макет.

Теперь в модуле формы создаем процедуру, которая будет вызвана при обращении к печати именно в таком виде(за исключением содержимого, заполнять можете как вам угодно), процедура так же должна быть экспортной и на клиенте, так как вызывается из конфигурации и выполнение назначено на клиентской стороне:

 

 Печать(ИдентификаторКоманды, МассивОбъектов)

Макет я собираю и вызываю в отдельной процедуре, обязательно на клиенте. 

 

 СобратьМакет(СсылкаНаОбъект)

Для сбора макета нам понадобится получить этот самый макет уже с сервера. Передаю я его через временное хранилище:

 

 ПолучитьМакетСервер(ИмяМакета)

Далее нужно получить данные для заполнения макета, естественно на сервере, по скольку может понадобиться обратиться к сторонним регистрам и справочникам, если нет, то можно выполнить и на клиенте, получив ссылку на интересующий нас объект:

 

 ПолучитьДанные(СсылкаНаОбъект)

Данные складываем в структуру,где ключ — имя параметра в макете(без фигурных скобок), а значение — собственно значение, которое необходимо подставить.

На этом завершается наше создание. Вы можете скачать обработку в готовом виде, в ней также реализован запуск через форму обработки, то есть с помощью открытия обработки без регистрации ее в конфигурации. Надеюсь, моя статья многим поможет и окажется полезной. Спасибо большое за внимание!

41 Comments

  1. maks_20

    Все бы ничего, но за 10 стартмани врядли кто-то захочет скачать, тем более, что почти весь код приведен в статье)))

    Reply
  2. Lem0n

    «Это моя первая статья на данном портале…» и я решил начать свою деятельность здесь попыткой грабежа местных

    Reply
  3. khabibullin.tu

    Автор может быть вы не в курсе, но 10 стартмани это 400 рублей, просить за это 400 рублей ? WTF ?

    Reply
  4. LeoKeyn

    (3) Извините, не правильно понял курс) подправлю)

    Reply
  5. LeoKeyn

    (1) Цену я поменял, а на счет все написано в статье, почти да. Но я долговато мучился с этой темой и надеюсь люди, которым статья поможет скачают ее в благодарность 🙂

    Reply
  6. sytkosa

    (0) Автор как понимаю БСП никогда не смотрел с примерами. Полностью перепечатка оттуда. И самое интересное что в последних релизах БСП 1С отказалась от Word.Application теперь все делается через xml и сборку docx.

    Reply
  7. triviumfan

    (6)

    отказалась от Word.Application, теперь все делается через xml и сборку docx

    Спасибо, надо ознакомиться

    Reply
  8. LeoKeyn

    (6) Если честно не смотрел, но видимо воссоздал их путь:-) Что тоже считаю не плохо 🙂

    Reply
  9. mcgoblin

    (8)Должен ли на сервере стоять ms office?

    Reply
  10. LeoKeyn

    (9) С этим вопросом изначально и была проблема. Нет не должен, только на машине клиента.

    Reply
  11. mcgoblin

    (10)А вот если , допустим на серваке поставят ворд, то будет ли у клиента формироваться документ. Не сталкивались с таким?

    Reply
  12. mcgoblin

    (10) Выходит ошибка

    {ВнешняяОбработка.БН_ПриказОПриёме.Форма.Форма.Форма(21)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища): Ошибка получения значения из временного хранилища: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.: Ошибка преобразования данных XDTO:

    Запись значения свойства ‘response’:

    форма: Элемент

    имя: {http://v8.1c.ru/8.2/mngsrv/ws}response: Ошибка отображения типов:

    Отсутствует отображение для типа ‘ОболочкаActiveDocument’

    Reply
  13. LeoKeyn

    (11) В случае, если у клиента не установлен microsoft office обработка работать не будет, так как документ формируется на стороне клиента при помощи com объекта. Если вам необходимо формировать документ именно на сервере, то можно процедуру

    &НаКлиенте
    Процедура СобратьМакет(СсылкаНаОбъект)

    Перенести на сервер:

    &НаСервере
    Процедура СобратьМакет(СсылкаНаОбъект) 

    и заменить

     Word.Application.Visible = Истина;//установить видимость документа
    Word.Activate();//открыть документ пользователю

    НА

    Документ.SaveAs(ПутьКСетевойПапкеКоторуюВидитНужныйКлиент)
    Reply
  14. LeoKeyn

    (12) Какого вида у вас макет? Должен быть не ActiveDocument, а двоичный макет

    Первое, что нам необходимо сделать, это создать макет нашего документа(Изображение 3). Макет понадобится двоичный, т.к. обычный мы на клиент не передадим(как я и говорил ранее). Заменяем нужные данные в шаблоне, перед загрузкой в обработку, «Параметрами», у меня они выглядят так, на примере: «{Сотрудник}»(кавычки не учитывать), после чего загружаем в Обработку-Макет.
    Reply
  15. mcgoblin

    (14)Да, ошибку я вчера заметил, забыл отписаться)

    Reply
  16. mcgoblin

    (13) я имел ввиду, если не по вашей обработке, работать, а через стандартное создание всего на сервере, но в прочем это чисто теоретический вопрос. так как вчера по Вашему образу состряпал свой говнокод, собрал параметры и вставил их в макет и сегодня все заработало.

    Reply
  17. LeoKeyn

    (16) Рад, что вам помогло #k8SjZc9Dxk_#k8SjZc9Dxk

    Reply
  18. LeoKeyn

    (16) Создать то все можно, а вот с передачей через сервер-клиент много проблем

    Reply
  19. an1c

    (10) У меня ругается Процедура или функция с указанным именем не определена (ПолучитьИмяВременногоФайла)

    Макет двоичный

    Как решить проблему?

    Reply
  20. LeoKeyn

    (19) Значит вы не добавили процедуру или функцию «ПолучитьИмяВременногоФайла» =)

    Reply
  21. an1c

    (20) Вместо того, что бы смеяться помогли бы…

    Reply
  22. LeoKeyn

    (21) Я и не смеюсь, ошибка означает именно это. В статье все очень подробно описано, и если скопировать код, то обработка уже будет готова

    Reply
  23. LeoKeyn

    (21) возможно вы выбрали не правильную директиву компиляции (&НаКлиенте, &НаСервере)

    Reply
  24. an1c

    (22) Я и скопировала весь код… И пробовала разные директивы и &НаКлиенте и &НаСервере. Данная ошибка выходит именно когда на &НаКлиенте, что мне предпочтительнее. Буду разбираться дальше. Если у кого есть решение или варианты пишите.

    Reply
  25. LeoKeyn

    (24) Получите имя файла на сервере, и передайте на клиент

    Reply
  26. Elvina

    Подскажите, пожалуйста, как вставить картинку в ворд (программно), к каждому договору прикрепляется карта, если точек несколько, то несколько картинок с картой. Картинка находится в каталоге на диске.

    В АктивДокумент получается картинку вставить, а вот как это сделать в случае с двоичными данными нигде не могу найти…

    Reply
  27. akey

    Добрый день

    Есть некорректный код, см. ниже:

    
    //Было
    ДокументЗаполнение = Документ.Application.Documents(1);
    // Получить объект, который будем использовать для поиска и замены.
    Для Каждого ЭлементДанных Из Данные Цикл
    Замена = Документ.Content.Find;//поиск параметра в макете
    Замена.Execute(«{» + ЭлементДанных.Ключ + «}», Ложь, Истина, Ложь, Ложь, , Истина, , Ложь, ЭлементДанных.Значение, 2);//замена параметра на значение
    КонецЦикла;
    
    
    //Стало
    ДокументЗаполнение = Документ.Application.Documents(1);
    // Получить объект, который будем использовать для поиска и замены.
    Для Каждого ЭлементДанных Из Данные Цикл
    Замена = ДокументЗаполнение.Content.Find;//поиск параметра в макете
    Замена.Execute(«{» + ЭлементДанных.Ключ + «}», Ложь, Истина, Ложь, Ложь, , Истина, , Ложь, ЭлементДанных.Значение, 2);//замена параметра на значение
    КонецЦикла;
    
    

    Показать

    Reply
  28. user979442

    На ЗУП корпе ругается:

    {ОбщийМодуль.УправлениеПечатью.Модуль(1510)}: Метод объекта не обнаружен (Печать)

    ВнешняяОбработкаОбъект.Печать(

    Что может быть?

    Reply
  29. LeoKeyn

    (28) Скорее всего вы не сделали процедуру экспортной

    Reply
  30. LeoKeyn

    (26) Не пробовал, не было задачи. Но должен работать тот же метод что и с АктивДокумент. Так как двоичный макет нужен для создания «Word = Новый COMОбъект(«Word.Application»);\создаем COMОбъект» А с ним дальше делайте все что вам нужно по методам работы с COMОбъект

    Reply
  31. user1199708

    Указал экспортную процедуру, все равно в ЗУП, не работает.

    Reply
  32. r.moschenskiy

    Если до этого в параметре команды Использование было указано «ВызовСерверногоМетода», то нужно пометить обработку на удаление и создать её заново. Видимо, тип команды устанавливается один раз при регистрации обработки.

    Reply
  33. LeoKeyn

    (32) Не проверял такой возможности, спасибо за подсказку

    Reply
  34. KidMo

    (6)

    И самое интересное что в последних релизах БСП 1С отказалась от Word.Application теперь все делается через xml и сборку docx.

    Киньте ссылку на оригинал, пожалуйста. Просмотрел доку и не нашел там подобного. Интересно, что Вы имели в виду.

    Reply
  35. LeoKeyn

    1

    Reply
  36. NikeDyu

    Спасибо за статью! Оч помогла.

    Reply
  37. LeoKeyn

    (36) Всегда рад!

    Reply
  38. sveta21

    Спасибо за статью. Печатная форма формируется, всё прекрасно.

    НО перестали работать стандартные печатные формы в этом документе.

    Выдает ошибку при выборе стандартной печатной формы:

    {ОбщийМодуль.УправлениеПечатью.Модуль(1510)}: Метод объекта не обнаружен (Печать)

    ВнешняяОбработкаОбъект.Печать(

    Не подскажите в чем может быть проблема?

    Reply
  39. LeoKeyn

    (38) Здравствуйте. Не подскажу, не сталкивался с таким. Посмотрите отладкой.

    Reply
  40. sveta21

    (39)

    Здравствуйте. Не подскажу, не сталкивался с таким. Посмотрите отладкой.

    В том то и дело… В отладке уже в описании команды сразу присутствует обращение к внешней обработке. А она же стандартная!

    Пишет:

    «ДополнитьКомплектВнешнимиПечатнымиФормами»=Истина

    Помогите, пожалуйста!

    Причем для Кадрового перевода всё в порядке, а для совмещений, выхода из отпуска за ребенком вот такая проблема!

    Reply
  41. MaximKor

    Отличная статья. Спасибо!

    Reply

Leave a Comment

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