28.11.13 — 12:33
Создал в общихМакетах Макет типа ActiveDocument с расширением doc. Не получает с ним работать. Подскажите что не так. Делаю на УФ. Вот код
&НаКлиенте
Процедура Печать(Команда)
ПолучитьМакетНаСервере(«ПФ_DOC_Договор»);
//MSWord = Договор.Получить;
КонецПроцедуры
Процедура ПолучитьМакетНаСервере(ИмяМакета)
Договор = ПолучитьОбщийМакет(ИмяМакета);
MSWord = Договор.Получить;
конецпроцедуры
Выскакивает ошибка
Ошибка при вызове метода контекста (Получить)
MSWord = Договор.Получить();
1 — 28.11.13 — 12:34
&НаСервере забыл?
2 — 28.11.13 — 12:36
Если не указываешь директиву, то по умолчанию означает что код будет выполняться на сервере
3 — 28.11.13 — 12:37
Да я пробовал и &НаСервере и &НаСервереБезКонтекста. Все-равно не получается
4 — 28.11.13 — 12:40
А зачем ты пишешь Получить()? Ведь у тебя это не хранилище…
5 — 28.11.13 — 12:43
(4) А как надо сделать что бы заработало
6 — 28.11.13 — 12:44
MSWord = ПолучитьОбщийМакет(ИмяМакета);
не?
7 — 28.11.13 — 12:48
А потом как начать работать с документом что бы можно было заполнять поля в нем?
8 — 28.11.13 — 12:49
Я ставлю
Документ = MSWord.Application.Documents(1);
Документ.Activate();
У меня сразу выскакивает
Поле объекта не обнаружено (Application)
Документ = MSWord.Application.Documents(1);
Весь инет облазил. У всех работает. Может я что с начала не правильно делал
9 — 28.11.13 — 12:52
(8) А ты что, заполнять его на сервере собрался?
10 — 28.11.13 — 12:53
Ну вроде как так надо делать.
11 — 28.11.13 — 13:03
(10) Я уже сильно не помню причины, но я делаю через временный файл.
Код такой (у меня макет хранится в ХЗ):
&НаКлиенте
Процедура СформироватьПечатнуюФорму(ДоговорКонтрагента, Макет)
ДанныеДляПечати = ПолучитьДанныеДляПечати(ДоговорКонтрагента, Макет);
ХранилищеМакета = ДанныеДляПечати[0];
Если ХранилищеМакета.Представление = «ХранилищеМакета» Тогда
ИмяФайла = ПолучитьИмяВременногоФайла();
ХранилищеМакета.Значение.Записать(ИмяФайла); //Записываем макет во временный файл.
ДанныеДляПечати.Удалить(ХранилищеМакета);
Иначе
Сообщить(«Ошибка получения макета», СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
Попытка
MSWord = ПолучитьCOMОбъект(, «Word.Application»); //Если Word уже открыт, то подключаемся к нему.
Исключение
Попытка
MSWord = Новый COMОбъект(«Word.Application»); //Открываем Word.
Исключение
Сообщить(«Ошибка формирования печатной формы. Скорее всего на Вашем компьютере не установлен Microsoft Word.», СтатусСообщения.Внимание);
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
КонецПопытки;
Документ = MSWord.Documents.Open(ИмяФайла); //Открываем макет из временного файла.
MSWord.Selection.WholeStory(); //Выделяем весь документ.
MSWord.Selection.Copy(); //Копируем выделенное в буфер.
Документ.Close(); //Закрываем документ.
УдалитьФайлы(ИмяФайла); //Удаляем временный файл.
Документ = MSWord.Documents.Add(); //Создаем новый документ.
MSWord.Selection.PasteAndFormat(19); //Вставляем в документ содержимое из буфера с форматом исходного документа.
MSWord.ActiveDocument.Range(0,1).Copy(); //Очищаем буфер обмена, чтоб лишних вопросов при закрытии документа не задавал.
MSWord.Selection.HomeKey(6); //Переводим курсор в начало документа.
//Производим заполнение заменяемых полей
Замена = Документ.Content.Find;
Для Каждого ЗаменяемоеПоле Из ДанныеДляПечати Цикл
Замена.Execute(ЗаменяемоеПоле.Значение, Ложь, Истина, Ложь, , , Истина, , Ложь, ЗаменяемоеПоле.Представление, 2);
КонецЦикла;
//Проверяем, остались ли незаполненные заменяемые поля
Если Замена.Execute(«{«) Тогда
Сообщить(«В печатной форме «»» + СокрЛП(Макет.Наименование) + «»» заполнены не все заменяемые поля.», СтатусСообщения.Внимание);
КонецЕсли;
Документ.Saved = Истина; //Помечаем документ как сохраненный, чтобы при закрытии не выдавался запрос на сохранение документа
Если Элементы.ФормаПечатьНаПринтер.Пометка Тогда
Документ.PrintOut(Истина, , , , , , , Макет.КоличествоКопий, , , , Истина);
Документ.Close();
Иначе
MSWord.Visible = Истина;
MSWord.Activate();
КонецЕсли;
КонецПроцедуры //СформироватьПечатнуюФорму()
12 — 28.11.13 — 13:06
(11) Спасибо. Попробую. Надеюсь заработает
13 — 28.11.13 — 13:08
ПолучитьДанныеДляПечати() выполняется &НаСервере
14 — 02.12.13 — 12:03
&НаСервереБезКонтекста
Процедура ПолучитьМакетНаСервере()
Макет = ПолучитьОбщийМакет(«ПФ_DOC_Договор»);
Ком = Макет.Получить();
Ком.Application.Visible = 1;
конецПроцедуры
&НаКлиенте
Процедура Напечатать(Команда)
Состояние(НСтр(«ru = ‘Выполняется формирование печатных форм'»));
ПолучитьМакетНаСервере();
КонецПроцедуры
Ошибка при вызове метода контекста (Получить)
Ком = Макет.Получить();
Что не так? Сделал как написано в книге «Профессиональная разработка в системе 1С».
В общих макетах создал .doc макет, в него скопировал содержимое документа. Пытаюсь его получить, вылетает ошибка. Помоги разобрать, как сделать через ActiveDocument
15 — 02.12.13 — 12:04
Тип созданного макета — ActiveDocument
16 — 02.12.13 — 12:06
Делаю все это во внешней обработке
17 — 02.12.13 — 12:08
(14) что за ошибка?
18 — 02.12.13 — 12:09
Ошибка при вызове метода контекста (Получить)
Ком = Макет.Получить();
19 — 02.12.13 — 12:10
хз, попробуй так
текОбъект = ЭтаФорма.РеквизитФормыВЗначение(«Объект»);
Макет = текОбъект.ПолучитьМакет(«ПФ_DOC_Договор»);
20 — 02.12.13 — 12:11
(19) Делал, не получается
21 — 02.12.13 — 12:15
(14) (18) Ты (4) Читал?
&НаСервереБезКонтекста
Процедура ПолучитьМакетНаСервере()
Ком = ПолучитьОбщийМакет(«ПФ_DOC_Договор»);
Ком.Application.Visible = 1;
конецПроцедуры
&НаКлиенте
Процедура Напечатать(Команда)
Состояние(НСтр(«ru = ‘Выполняется формирование печатных форм'»));
ПолучитьМакетНаСервере();
КонецПроцедуры
Так работает?
22 — 02.12.13 — 12:17
(4) я читал
23 — 02.12.13 — 12:19
(21) Сделал так, выскочила другая ошибка
Поле объекта не обнаружено (Application)
Ком.Application.Visible = 1;
Я еще раз повторюсь, делал по примеру, который приведен в книге.
24 — 02.12.13 — 12:20
Ну если не работает, как там приведен, вот я спрашиваю у Вас все, форумчане. Так как считаю этот форум одним из лучших по 1С, почти всегда тут можно найти решение проблем
25 — 02.12.13 — 12:23
(23) А, точно, Получить() надо. Только что посмотрел, как раньше делал. Тогда у меня версия, что у тебя в макете что-то не то…
Cube
26 — 02.12.13 — 12:26
+(25) Если оставить только суть, то:
Макет = ПолучитьМакет(«Макет»);
MSWord = Макет.Получить();
…
Документ = MSWord.Application.Documents(1);
Документ.Activate();
…
MSWord.Application.Visible = Истина;
MSWord.Activate();
3 / 3 / 7 Регистрация: 21.03.2013 Сообщений: 638 |
|
1 |
|
13.12.2017, 12:05. Показов 17743. Ответов 10
Добрый день, вот пытаюсь напечатать документ MSWorld в обработке, делаю по примеру, вот так ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»); MSWord = СсылкаМакет.Получить();// И вот тут выдает ошибку Ошибка при вызове метода контекста (Получить) Подскажите плз где ошибка? http://programmist1s.ru/pechat… 8-3-i-8-2/ — вот брал отсюда Добавлено через 22 минуты
0 |
434 / 305 / 92 Регистрация: 28.05.2014 Сообщений: 1,247 |
|
13.12.2017, 13:53 |
2 |
Владислаучык, в той же статье автор пишет ещё следующее: Скорее всего проблема в ворде или в правах системы. Он корректно установлен? Попробуйте другую версию Ворда. Ну или на крайний случай можно проделать это на другой машине.
1 |
3 / 3 / 7 Регистрация: 21.03.2013 Сообщений: 638 |
|
13.12.2017, 14:09 [ТС] |
3 |
0 |
Владислаучык 3 / 3 / 7 Регистрация: 21.03.2013 Сообщений: 638 |
||||||||
13.12.2017, 16:52 [ТС] |
4 |
|||||||
Phil, Да, такой тип Добавлено через 2 часа 42 минуты
Так макет нельзя вернуть, а если на сервере сделать сразу, то тоже ошибка отсутствует отображение типа для ActiveDocument
0 |
polax 1897 / 1301 / 461 Регистрация: 16.01.2015 Сообщений: 5,656 |
||||
14.12.2017, 10:25 |
5 |
|||
Владислаучык, Вот рабочий код. Неделю назад делал ВПФ с макетом в Ворде
0 |
3 / 3 / 7 Регистрация: 21.03.2013 Сообщений: 638 |
|
15.12.2017, 15:15 [ТС] |
6 |
polax, Приложение = Новый ComObject («Word.Application»); — вот тут ошибка, Ошибка при вызове конструктора (ComObject)
0 |
1897 / 1301 / 461 Регистрация: 16.01.2015 Сообщений: 5,656 |
|
15.12.2017, 18:19 |
7 |
Владислаучык, Либо делаете не на сервере, либо на компьютере не установлен Ворд
1 |
1193 / 732 / 211 Регистрация: 22.04.2013 Сообщений: 5,381 Записей в блоге: 1 |
|
15.12.2017, 21:17 |
8 |
Либо делаете не на сервере я путаю? может наоборот — делаете на сервере?
1 |
1897 / 1301 / 461 Регистрация: 16.01.2015 Сообщений: 5,656 |
|
15.12.2017, 22:24 |
9 |
Сообщение было отмечено Владислаучык как решение РешениеВладислаучык, Yulunga, не то что ошибся, а высказал неправильно. Вот здесь описано http://1clancer.ru/article/oso… ie_8.2_847
1 |
0 / 0 / 0 Регистрация: 06.06.2022 Сообщений: 2 |
|
15.06.2022, 11:55 |
10 |
polax, У вас есть код для Exel макета active document?
0 |
1897 / 1301 / 461 Регистрация: 16.01.2015 Сообщений: 5,656 |
|
15.06.2022, 15:54 |
11 |
Dfolt, Вот из моих закладок по которым делаю подобное
0 |
Добрый день! Воспользовавшись поиском нашел порядка 3-4х веток на эту тему и нигде так и не увидел решения. Может его и нет? Суть задачи: Открыть на сервере шаблон Word сохраненный как ActiveDocument, заполнить и откорректировать его на сервере и например вывести его пользователю на стороне клиента. …. ну дальше делаем все что нужно с документом ДокументWORD = Новый ДвоичныеДанные(ПолноеИмяФайла); и затем записываем его в хранилище значений а на клиенте получаем и открываем. И все замечательно работает и формируется на толстом и тонком клиенте… пока не запускаем Тонкий клиент через веб-сервер ну или не открываем 1с через браузер. В этом случае вываливается ошибка: Ошибка при вызове метода контекста (Получить)MSWord = Макет.Получить; На некоторых компах ошибка вываливается на методе Документ.SaveAs но если его закомментировать то опять же возвращаемся к ошибке MSWord = Макет.Получить; Хоть кто нибудь знает доступен ли метод получения шаблона на сервере при работе через веб сервер? Или как это сделать лучше. Но весь смысл в том чтобы документ формировался именно на сервере, потому как иногда совсем не нужно показывать файл на клиенте пользователю а достаточно сохранить(на стороне сервера)
В синтакс-помощнике забанили?
xDD ага, забанили… Но то что там написано обламывает нас по полной: ОболочкаActiveDocument (ActiveDocumentShell) Получить (Get) Синтаксис: Получить Возвращаемое значение: Тип: COMОбъект. Описание: Получает COMОбъект для программного управления Active document. Доступность: ТОЛСТЫЙ КЛИЕНТ Но я сюда написал ибо помощь требуется. Кто сталкивался с подобной задачей? Формировать файлы из ActiveDocument шаблона при клиент-серверном взаимодействии. Есть же наверное способ обхода ((((((
Выход — не использовать ActiveDocument
Вы меня убиваете ))))) Причем так обидно… если полностью по оболочке читать то она доступна на сервере Методы: Описание: Используется для доступа к Active document. Объект может быть записан в файл. Доступность: Сервер, толстый клиент. а ее методы только на толстом клиенте… ((
Однако спасибо все равно ))
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Lavr |
|
||
---|---|---|---|
Здравствуйте. Импортировал word-документ в справочник «Филиал», в макет как Active document. Есть форма списка и форма элемента списка, сделал кнопку на форме элемента, при нажатии вызов процедуры: &НаКлиенте Макет = Справочники.Филиал.ПолучитьМакет(«Макет»).Получить();Документ = Макет.Application.Documents(1);Документ.Activate();Макет.Application.Visible = Истина;Макет.Activate(); Надо чтобы документ из макета открывался в ворде у пользователя, просто открывался без заполнения какими-либо данными из формы. Подскажите пожалуйста, добрые специалисты, как это правильно сделать? Может вообще по другому можно, как-то проще? Благодарю. |
Yandex |
|
||
---|---|---|---|
IBReiter |
|
||
---|---|---|---|
Код 1C v 8.3
|
Lavr |
|
||
---|---|---|---|
В жиме толстого клиента все работает, а в web-интерфейсе ошибка: Ошибка при вызове метода контекста (Получить) Через web-интерфейс этот метод должен работать? |
IBReiter |
|
||
---|---|---|---|
Проверил на платформе 8.3.6.2152 и в браузере хром — все ок, работает алоритм. У вас конфигурация вообще какая? |
Lavr |
|
||
---|---|---|---|
Платформа 8.2 Конфигурация УП, с нуля пишу, очень простая с 7-ю справочниками. |
IBReiter |
|
||
---|---|---|---|
Режимы совместимости? как вариант.. Ну а так, попробуйте на 8.3 ещё |
Lavr |
|
||
---|---|---|---|
Не работает в совместимости. Оставлю тогда так: &НаКлиентеПроцедура СлужебнаяЗаявка(Команда) Word = Новый COMОбъект («Word.Application»);Word.Documents.Open («\192.168.47.130wudataWU,_Фамилия_Имя,_Филиал_г._Караганда.doc»);Документ = Word.Application.Documents(1);Документ.Application.Visible = Истина;Документ.Activate();КонецПроцедуры |
IBReiter |
|
||
---|---|---|---|
И на 8.3 не работает? Вам совместимость нужна |
Подсказка: Вы можете приложить к ответу файл или изображение щелкнув по значку или в редакторе. |
-
Есть обработка в которой в макет помещен документ Word-овский. Я его получаю заполняю шаблон значениями из Таблицы значений. Проблема в том что на файловом варианте эта обработка работает а на серверном нет. В чем может быть проблема?
Ошибка выскакивает здесь:
Сама обработка:
Вложения:
-
Еще вопрос в тему.
Почему при сохранении макета типа active document в файл word кодом:
ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); Макет = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка"); ИмяФайла = КаталогВременныхФайлов() + ""файл.doc"; Макет.Записать(ИмяФайла);
Я получаю вместо нормального документа вот такой
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.899
- Симпатии:
- 1.035
- Баллы:
- 204
Какой тип значения у Макет?
-
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.899
- Симпатии:
- 1.035
- Баллы:
- 204
Ну а что ж вы хотите?
Простым Записать() там непойми чего может быть….Вроде еще нужно сделать:
OLEMSWord = Макет.Получить();
-
Из статьи: http://infostart.ru/public/270277/
Когнитивный диссонанс
&НаСервере АктивныйДокумент = ПолучитьМакет("Макет"); КомОбъект = АктивныйДокумент.Получить();
Вот самые первые строчки, на которые натыкается в гугле юный неофит. В файловом варианте такой код сработает корректно (неважно в толстом или тонком клиенте). Т.к. и сервер и клиент у нас находятся на одной машине, и MS Word тоже установлен на этой машине.
А давайте представим, что у нас клиент-сервер, да ещё и сервер находится на другой машине. Будет оно работать в тонком клиенте? Нет. И тут возникнет когнитивный диссонанс. WTF?
— Объединение сообщений, 5 апр 2017 —
У меня как раз серверный вариант
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.899
- Симпатии:
- 1.035
- Баллы:
- 204
Когнитивного диссонанса нет, т.к. в режиме управляемого приложения нет объекта типа ActiveDocument от слова совсем
Выход: макет делать в виде двоичных данных, и гонять результат на клиента через временное хранилище.
-
&НаСервере Функция ПолучитьДанныеМакета() АдресХранилища = Новый УникальныйИдентификатор(); МакетПисьма = Обработки.ФормированиеПисемПоДепонентам.ПолучитьМакет("ШаблонПисьмо"); Возврат ПоместитьВоВременноеХранилище(МакетПисьма, АдресХранилища); КонецФункции &НаКлиенте Процедура СформироватьПисьма(Команда) Попытка Индификатор = ПолучитьДанныеМакета(); МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор); ИмяФайла = "Письмо.doc"; ИмяФайлаПолное = "E:ЭРЯковенко" + ИмяФайла; МакетПисьма.Записать(ИмяФайлаПолное); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры
Я правильно понял?
— Объединение сообщений, 5 апр 2017 —
Так что это уже пережиток?
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.899
- Симпатии:
- 1.035
- Баллы:
- 204
В первом приближении — да.
Только проще будет MSWord установить на сервер, выполнять заполнение и сохранение файла на сервере и уже результат гнать на клиента иначе придется на каждом клиенте устанавливать MSWord.
-
Есть код:
&НаКлиенте Процедура ПолучитьМакет(Команда) Попытка Индификатор = ПолучитьДанныеМакета(); МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор); ИмяФайла = "Письмо4.doc"; ИмяФайлаПолное = "E:ЭРЯковенко" + ИмяФайла; МакетПисьма.Записать(ИмяФайлаПолное); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Попытка Шаблон = Новый COMОбъект("Word.Application"); Исключение Сообщить("Ошибка при попытке создать объект ""MS Word""!" + Символы.ПС + "Возможно приложение ""MS Word"" не установлено или установлено неправильно.", СтатусСообщения.Внимание); КонецПопытки; Шаблон.Documents.Open(ИмяФайлаПолное); Попытка Шаблон.Application.Documents(1).Content.Find.Execute("{Сумма}",,,,,,,,, ЭтаФорма.Сумма, 2); Шаблон.Application.Documents(1).Content.Find.Execute("{Контрагент}",,,,,,,,, ЭтаФорма.Контрагент, 2); //Перемещаемся до строки в таблице Шаблон.Application.Selection.MoveDown(,8); //Перемещаемся вниз, выделяем строку таблицы и копируем ее в буфер обмена Шаблон.Application.Selection.SelectRow(); Шаблон.Application.Selection.Copy(); Для каждого Строка Из Этаформа.ТЗ Цикл //Заменяем значения Шаблон.Application.Selection.Find.Execute("{НомерСчета}" ,,,,,,,,,Строка.НомерСчета, 2); Шаблон.Application.Selection.Find.Execute("{ДатаПоставки}" ,,,,,,,,,Строка.ДатаПоставки, 2); //Последний параметр поиска пустой Шаблон.Application.Selection.Find.Execute("{КрайняяДата}" ,,,,,,,,,Строка.КрайняяДата, 2); Шаблон.Application.Selection.Find.Execute("{СтоимостьТоваров}" ,,,,,,,,,Строка.СтоимостьТоваров, 2); //Перемещаемся вниз, вставляем из буфера обмена строку Шаблон.Application.Selection.MoveDown(); Шаблон.Application.Selection.Paste(); //Перемещаемся вверх и выделяем строку для замены значений Шаблон.Application.Selection.MoveUp(); Шаблон.Application.Selection.SelectRow(); КонецЦикла; //Вырезаем лишнюю строку Шаблон.Application.Selection.Cut(); Шаблон.Application.Visible = Истина; Исключение // Если произойдет ошибка выводятся данные об ошибке и объект закрывается. Сообщить("Ошибка: " + ОписаниеОшибки(), СтатусСообщения.Внимание); Шаблон.Application.Quit(0); КонецПопытки; КонецПроцедуры &НаСервере Функция ПолучитьДанныеМакета() АдресХранилища = Новый УникальныйИдентификатор(); ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); Макет = ОбработкаОбъект.ПолучитьМакет("ШаблонПисьмаПросрочка"); Возврат ПоместитьВоВременноеХранилище(Макет, АдресХранилища); КонецФункции
Если перенести заполнение документа с сервера на клиент то вот этот код отказывается работать:
Шаблон.Application.Documents(1).Content.Find.Execute("{Сумма}",,,,,,,,, ЭтаФорма.Сумма, 2); Шаблон.Application.Documents(1).Content.Find.Execute("{Контрагент}",,,,,,,,, ЭтаФорма.Контрагент, 2);
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.899
- Симпатии:
- 1.035
- Баллы:
- 204
Чего говорит?
Версия MSOffice на клиенте совпадает с версией на сервере?