Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сохранить отредактированный Word-документ  (Прочитано 34193 раз)
0 Пользователей и 1 Гость смотрят эту тему.
cloudcat
Гость
« : 29-01-2010 12:27 » 

Создаю новый Word-документ:

Код:
WORD = Новый COMОбъект("Word.Application");
НовДокум = WORD.Documents;
Докум = НовДокум.Add("");
WORD.Visible = 1;
WORD.WindowState = 0;
WORD.Activate();

Пользователь его редактирует, сохраняет где-то под каким-то именем.

Вопрос - как мне перехватить имя сохраненного файла, чтобы закатать его в ХранилищеЗначения?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 30-01-2010 15:01 » 

Используй обработчики событий объекта Word
Платформа 8.Х это позволяет делать...
Записан
cloudcat
Гость
« Ответ #2 : 30-01-2010 16:45 » 

Попробовала, не выходит каменный цветок =(

Так выглядит основная процедура:

Код:
Процедура РедактироватьШаблонНажатие(Элемент)
//Проверим, что шаблон не пуст
Если ШаблонТиповогоДоговора.Получить() <> Неопределено Тогда
//Пишем шаблон в файл
ИмяФайла = КаталогВременныхФайлов() + "ШТД" + Номер + ".dot";
ШаблонТиповогоДоговора.Получить().Записать(ИмяФайла);
//Открываем Ворд
WORD = Новый COMОбъект("Word.Application");
WORD.Visible = 1;
//Создаем новый файл по шаблону
Документ = WORD.Documents.Add(ИмяФайла);
//Сохраняем готовый файл с текстом договора во временный файл
ИмяВремФайла = КаталогВременныхФайлов()+ "ТекТД" + Номер + ".doc";
Документ.SaveAs(ИмяВремФайла,0);
//Добавляем обработчик события от документа Word
//Ничего не перехватывается ТТ
ДобавитьОбработчик Документ.Close, ЗакрытиеДокумента;

Документ.Activate();
Документ.Application.Activate();
Иначе
Предупреждение("Шаблон не выбран.");   
КонецЕсли;
КонецПроцедуры

Обработчик:
Код:
Процедура ЗакрытиеДокумента()
// Сохранить документ
Документ.Save();
// Получить имя файла документ до того, как документ будет освобожден
ИмяФайла = Документ.FullName;
// Удалить обработчик закрытия документа
УдалитьОбработчик Документ.Close, ЗакрытиеДокумента;
// Освободить ссылку на документ
Документ = Неопределено;
// Сделать копию файла, документ еще остается блокирован Word'ом,
// поэтому его нельзя загружать в ДвоичныеДанные напрямую
КопияФайла = ПолучитьИмяВременногоФайла(".doc");
КопироватьФайл(ИмяФайла, КопияФайла);
// Загрузить изменения документа
ТекстДоговора = Новый ХранилищеЗначения(Новый ДвоичныеДанные(КопияФайла), Новый СжатиеДанных(9));
//// Получить текст документа для полнотекстового поиска
//ИзвлТекста = Новый ИзвлечениеТекста(КопияФайла);
//СправочникОбъект.Текст = Новый ХранилищеЗначения(ИзвлТекста.ПолучитьТекст(), Новый СжатиеДанных(9));
//// Удалить копию
УдалитьФайлы(КопияФайла);
// Сохранить имя временного файла для дальнейшего удаления.
ВременныйФайл = ИмяФайла;
КонецПроцедуры

Во-первых, не могу добавить событие обработчика Документ.Save - система ругается, что такое событие не найдено
Во-вторых, обработчик ничего не перехватывает! Я уже и так и этак закрывала файл вордовый - ничего не происходит, процедура обработчика не запускается
В-третьих, при обновлении конфигурации 1с ругается, что не найдена переменная Документ в процедуре ЗакрытиеДокумента... но ведь она должна передаваться как параметр?...

Помогите пожалуйста, знатоки =)))
Записан
cloudcat
Гость
« Ответ #3 : 30-01-2010 17:25 » 

У меня стоит 8.1.13.37
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 02-02-2010 15:54 » 

Пойдем с конца:
В-третьих, при обновлении конфигурации 1с ругается, что не найдена переменная Документ в процедуре ЗакрытиеДокумента... но ведь она должна передаваться как параметр?...
Логично, а где у тебя этот параметр?
Код:
Процедура ЗакрытиеДокумента()
Может стоит попробовать
Код:
Процедура ЗакрытиеДокумента(Документ)
"Во-вторых" наверное связано с "в-третьих", т.е. если напишешь правильный обрботчик - то он будет вызываться.
А вот "во-первых" надо искать как правильно:
заходим на MSDN (у меня вторая ссылка) и видим событие BeforeSave
Записан
Dest
Опытный

ru
Offline Offline

« Ответ #5 : 13-07-2011 11:35 » 

Все привет. Работаю с макетом active document, файл -  ms word. Пытаюсь перехватить событие word перед закрытием.

Код:
...
Макет = ПолучитьМакет("Макет");
// Получить объект из макета.
MSWord = Макет.Получить();
Документ = MSWord.Application.Documents(1);
Документ.Activate();

ДобавитьОбработчик Документ.DocumentBeforeClose, ПередЗакрытиемДокументаOffice;            // (*)
...

Процедура ПередЗакрытиемДокументаOffice(Документ, Отмена)
    сообщить("есть");
КонецПроцедуры

Ругается на Строку (*)
{Форма.Форма(19)}: Событие объекта не обнаружено (DocumentBeforeClose)

Должно работать, где собака?
      
« Последнее редактирование: 13-07-2011 11:37 от Dest » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 13-07-2011 11:48 » 

В MSDN это иначе описано...

http://msdn.microsoft.com/en-us/library/aa211915%28v=office.11%29.aspx
http://msdn.microsoft.com/en-us/library/aa211766%28v=office.11%29.aspx

Хотя, у тебя же не VBA...
« Последнее редактирование: 13-07-2011 11:50 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 13-07-2011 15:00 » 

Dest, по той ссылке, что я давал, событие называется BeforeSave (без Document).
А формат object_DocumentBeforeSave (из ссылки RXL) - это вроде как правила формирования названий процедур в VBA для использования их как обработчиков событий
Записан
Dest
Опытный

ru
Offline Offline

« Ответ #8 : 17-07-2011 12:17 » 

Попробовал BeforeSave:

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


Процедура ДокBeforeSave(msword, Отмена)
    сообщить("есть");
КонецПроцедуры


Пишет
{Форма.Форма(36)}: Событие объекта не обнаружено (BeforeSave)

Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 17-07-2011 17:46 » 

Меня смущает вот это:
Код:
MSWord = Макет.Получить();
У тебя в макете объект Word.Application?
Может все-таки должно быть:
Код:
MSWord = COMОбъект("Word.Application");
Записан
Dest
Опытный

ru
Offline Offline

« Ответ #10 : 17-07-2011 22:47 » 

Вообще, когда я добавлял макет выбирал тип макета "Active Document", потом загружал вордовский документ из файла.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 17-07-2011 23:31 » 

Методом тыка и по аналогии с синтакс-помощником получил вот такой работающий код (после Document точки нет):
ДобавитьОбработчик MSWord.Application.DocumentBeforeSave, ДокBeforeSave;

Добавлено через 1 минуту и 43 секунды:
Только на BeforeSave ругнулся про количество параметров, а BeforeClose отработало корректно.
« Последнее редактирование: 17-07-2011 23:33 от Kivals » Записан
Dest
Опытный

ru
Offline Offline

« Ответ #12 : 31-10-2011 14:38 » 

Добавляю обработчик:
Код:
...
ДобавитьОбработчик Документ.Application.DocumentBeforeClose, ДокBeforeClose;
...

Потом  документ word'ий открывается, я  там пишу, пишу. Закрываю срабатывает моя процедура

Процедура ДокBeforeClose(Документ, пар2)
...
КонецПроцедуры

В ней мне необходимо узнать - редактировал я word'ий документ после открытия или нет?
Мне советовали так:

Код:
Документ.Saved

Все время показывает ложь.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 31-10-2011 16:27 » 

Советовали правильно.
Определись, что ты подразумеваешь под словами: "редактировал я word'ий документ после открытия или нет":
1. Добавил и удалил что угодно и документ стал таким, как при открытии - в понимании Word это значит "Редактировался" (Документ.Saved=Ложь)
2. Добавил что-то и вернул все назад через отмену (Undo, Ctrl+Z) к первоначальному виду - вот это "Не редактировлся" (Документ.Saved=Истина)
Записан
Dest
Опытный

ru
Offline Offline

« Ответ #14 : 31-10-2011 23:51 » new

Что-то я фишку не понял. Как мне это может пригодиться?
Если просто ворд открыть, хоть что-нибудь на листе изменить, добавить и т.д. у документа вводится флаг, что он изменялся. Потом, если нажать на кнопку закрыть (крестик), вылезет окно - "Сохранять или не сохранять". Мне нужно, т.к. я заменил обработчик ДокBeforeClose, повторить эту же логику. Я не знаю как узнать, что документ изменялся.
Saved мне в любом случае (менял, я что-то или не менял) показывает ложь. Может другое свойство есть?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 01-11-2011 04:35 » 

А что мешает в Табло исследовать свойства переменной Документ, установив точку остнова на первый оператор ДокBeforeClose?
Или же посмотреть справку VBA по типу объекта Document...
Записан
Dest
Опытный

ru
Offline Offline

« Ответ #16 : 01-11-2011 05:38 » 

А что мешает в Табло исследовать свойства переменной Документ, установив точку остнова на первый оператор ДокBeforeClose?
В общем-то я это делал, но увы...
Я же с начала сам ищу, потом сюда пишу.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 01-11-2011 13:29 » 

Dest, сможешь здесь выложить обработку, в которой это реализовано (открытие документа и привязка события)?
Тогда смогу проверить (а то повторять времени сейчас нет)...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines