Имя: Пароль:
1C
 
Как в Word открыть окно вопроса?
0 253670489
 
14.10.09
10:04
Можно ли в Ворде открыть окно вопроса?
Есть начало, а что дальше?
MsOffice = Новый COMОбъект("Word.Application");
MsOffice.Documents.Open(ПолныйПуть);
MsOffice.Visible = Истина;
ДобавитьОбработчик MsOffice.DocumentBeforeSave, ОбработкаСобытияДокумента;

Процедура ОбработкаСобытияДокумента(Doc, SaveAsUI, Cancel)
   Сообщить("Документ Сохранен");
   //Что здесь должно быть, чтоб открыть окно вопроса?
КонецПроцедуры // ПриСохраненииДокумента()

В Visual Basic вопрос задается так
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
а как это вызвать в 1С?
1 Stim
 
14.10.09
10:06
попробуй через помощника
2 253670489
 
14.10.09
10:40
(1) Не совсем понял, какого помощника? Если имеется ввиду синтакс-помощник, то там ничего нет!
3 НЕА123
 
14.10.09
10:56
(2)
Вопрос()
4 253670489
 
14.10.09
11:14
(3) Вопрос() это вызывается окно вопроса в 1С:Преприятие, а мне нужно открыть окно вопроса в Вореде.
5 also
 
14.10.09
11:19
(4) Ну и попробуй в VB задать через Execute
6 253670489
 
14.10.09
11:26
(5) а можно немного поподробнее как это сделать?
7 Stim
 
14.10.09
11:28
(2)нет. Через помощника в Ворде, агента в 1С. В ворде это скрепка, например
8 Stim
 
14.10.09
11:29
+7 агент выскакивает поверх всех окон и управление идет через 1С. Правда, это не совсем подходит для деловой документации:)
9 План счетов
 
14.10.09
11:29
10 План счетов
 
14.10.09
11:33
11 smaharbA
 
14.10.09
11:34
Зачем ?(с)
12 253670489
 
14.10.09
11:44
(7) справка по Ворду мне также не помогла.
13 Stim
 
14.10.09
11:50
14 smaharbA
 
14.10.09
12:00
(12) что хотел то - точно можешь сказать, что за вопрос ?
15 253670489
 
14.10.09
12:02
(13) ясно, но помощник был в MSOffice только до 2000 верси, в 2007 его уже нет. А пользователь всегда может использовать новейшие версии.
(11), (14) мне при сохранении документа Word, который был открыт, нужно задать вопрос, и при его ответе сделать соответствующие действия в 1С.
16 253670489
 
14.10.09
12:04
(9, 10) При создании макроса и его выполнении непосредственно в Ворде я в 1С не получу результата, который вернулся при ответе пользователя на вопрос.
17 План счетов
 
14.10.09
12:53
(16) дак ты из ворда запускай 1С по ОЛЕ и отправляй туда параметры.
18 253670489
 
14.10.09
13:21
(17) Пожалуйста не подскажите как это сделать? Как именно передать параметр и как его значение потом получить после выполнения макроса?
19 253670489
 
14.10.09
13:24
(17) я из 1С запускаю Ворд, и по Вашей ссылке создаю в нем макрос, но как получить результат выполнения макроса не знаю!
20 Stim
 
14.10.09
14:06
ну что, разобралсо?
21 253670489
 
14.10.09
14:17
(20) пока нет!
22 План счетов
 
14.10.09
14:24
(19) когда запускаешь ворд - он и работает сам по себе. Пропиши в макросах параметры базы из которой ты запустил ворд. Пользователь в ворде сделает необходимые действия и ворд запустит 1С и передаст туда что тебе надо - например внесет изменения в константе. а как из ворда передать параметр в 1С - я не делал но думаю не особо сложно: 1S = CreateObject("V77.Application") и т.д.
23 Stim
 
14.10.09
14:26
(22)ага.. но только в ворде нет процедры ПриЗакрытии() :)
24 План счетов
 
14.10.09
14:31
(23) как нету?
а

Private Sub Document_Close()

End Sub
25 План счетов
 
14.10.09
14:43
Надо делать так.
Из 1С делаешь файл ворда с нужными данными и макросами.
сохраняешь его и потом открываешь из 1С так


ЗапуститьПриложение(<?>);
RunApp(<?>);

<romix>

Пример:

    ЗапуститьПриложение("calc.exe");
    //Запускает калькулятор

Замечание:
Если необходимо дождаться завершения программы и получить ее код возврата (что требуется, например, при запуске внешних архиваторов) лучше использовать метод run системного объекта WScript.Shell.

Пример:
Функция ЗапуститьПриложениеОжидая(cmdLine)
   WshShell = CreateObject("WScript.Shell");
   Возврат WshShell.Run(cmdLine, 1, -1);
КонецФункции

</romix>



это для 7-ки, для 8-ки думаю тоже такое есть.
26 253670489
 
14.10.09
14:56
(25) Понятно спасибо, Но мне нужно было открыть Ворд, и вылавливать у него событие перед сохранением (DocumentBeforeSave), что я и делаю. Перед сохранением Ворда у меня в 1С вызывается процедура ОбработкаСобытияДокумента, где я должен был спросить пользователя что он дальше хочет делать (но вопрос должен задаваться не в программе 1С, а в Ворде) и дальше выполнить необходимые действия в Базе 1С. я думал что это будет примерно так:

Процедура ОбработкаСобытияДокумента(Doc, SaveAsUI, Cancel)
   ОтветНаВопрос = Doc.MsgBox("Ответьте на вопрос!", 4);
   Если ОтветНаВопрос = 6 Тогда
       Сообщить("На вопрос в Ворде был ответ ДА");
   Иначе
       Сообщить("На вопрос в Ворде был ответ НЕТ");
   КонецЕсли
КонецПроцедуры // ПриСохраненииДокумента()

Но оказалось не все так просто как я думал, и из ворда запускать заново приложение 1С у меня нет возможности (не известно какие параметры будут у 1С);
27 smaharbA
 
14.10.09
15:03
(26) все гораздо просче
и от макроса в 1С ответ легко получается, но можно и без макроса
28 План счетов
 
14.10.09
15:05
(27) продолжайте
29 253670489
 
14.10.09
15:05
(27) Очень интересно
30 smaharbA
 
14.10.09
15:30
В модуль дока ворд


Dim X As New eventclass
Sub RegisterEvent()
   Set X.App = Word.Application
End Sub


В класс

Public WithEvents App As Word.Application

Private Sub App_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
   On Error Resume Next
   Cancel = (MsgBox("Да/Нет?", vbYesNo) = vbYes)

   Doc.Variables.Add "Test", Cancel
   Doc.Variables.Item("Test").Value = Cancel
End Sub


Вот и отлавливай эту вариаблу
31 253670489
 
14.10.09
15:55
(30) А как такой макрос вставить в ворд? И как их разделить одну часть в модуль документа Вор, а вторую в класс(я не понял что такое класс).Так не получается?

MsOffice = Новый COMОбъект("Word.Application");
MsOffice.Documents.Open(ПолныйПуть);
MsOffice.Visible = Истина;

i = MsOffice.VBE.ActiveVBProject.VBComponents.Count();
MsOffice.VBE.ActiveVBProject.VBComponents.Add (1);
MsOffice.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.InsertLines (1, "Public WithEvents App As Word.Application");
MsOffice.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.InsertLines (2, "Private Sub App_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)");
MsOffice.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.InsertLines (3, "Dim intResponse As Integer");
MsOffice.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.InsertLines (4, "intResponse = MsgBox(""Do you really want to "", 4)");
MsOffice.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.InsertLines (5, "Doc.Variables.Add ""Test"", intResponse");
MsOffice.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.InsertLines (6, "Doc.Variables.Item(""Test"").Value = intResponse");
MsOffice.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.InsertLines (7, "End Sub");

И как на счет второго варианта? Без макросов?
32 253670489
 
14.10.09
15:58
Хотелось бы конечно без макросов, а то пользователю придется включить исполнение макросов и ставить галочку "Доверять доступ к обектной модели проектов VBA". Что не каждый пользователь сделает!
33 smaharbA
 
14.10.09
18:18
С макросами примерно так

//*******************************************
Процедура Сформировать()
   Ворд=СоздатьОбъект("Word.Application");
   Ворд.Visible=-1;
   Доки=Ворд.Documents;
   Док=Доки.Add();
   ВбПроект=Док.VBProject;
   ВбКомпоненты=ВбПроект.VBComponents;
   Для Сч=1 По ВбКомпоненты.Count Цикл
       ВбКомпонент=ВбКомпоненты.Item(Сч);
       Если (ВбКомпонент.Name = "МойКрутойМодуль") Или (ВбКомпонент.Name = "МойКрутойКласс") Тогда
           ВбКомпоненты.Remove(ВбКомпонент);
       КонецЕсли;
   КонецЦикла;
   Модуль=ВбКомпоненты.Add(1);
   Класс=ВбКомпоненты.Add(2);
   Модуль.Name="МойКрутойМодуль";
   Класс.Name="МойКрутойКласс";
   Класс.CodeModule.InsertLines(1, "Public WithEvents App As Word.Application
   |Private Sub App_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
   |On Error Resume Next
   |Rez = MsgBox(""Да/Нет?"", vbYesNo)
   |Cancel = True
   |Doc.Variables.Add ""Test"", Rez
   |Doc.Variables.Item(""Test"").Value = Rez
   |On Error Goto 0
   |End Sub");
   Модуль.CodeModule.InsertLines(1, "Public X as New МойКрутойКласс
   |Sub РегистрацияКласса()
   |Set X.App = Word.Application
   |End Sub");
   Ворд.Run("МойКрутойМодуль.РегистрацияКласса");
   Проверка=1;
   Шел=СоздатьОбъект("Shell.Application");
   Пока Проверка<>0 Цикл
       Стр="";
       Попытка
           Проверка=Док.Variables.Item("Test").Value;
           Док.Variables.Item("Test").Value=1;
       Исключение
       КонецПопытки;
       Попытка
           Врем=Док.Name;
       Исключение
           Проверка=0;
       КонецПопытки;
       Если Число(Проверка)=6 Тогда
           Стр="Нажали ДА";
       ИначеЕсли Число(Проверка)=7 Тогда
           Стр="Нажали НЕТ";
       ИначеЕсли Число(Проверка)=0 Тогда
           Стр="Все капец";
       КонецЕсли;
       Если ПустоеЗначение(Стр)=0 Тогда
           Шел.MinimizeAll();
           ВвестиСтроку(Стр,Стр,100);
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры
34 253670489
 
15.10.09
10:20
С использованием макроса я разобрался у меня получилось так:
Процедура ОткрытьФайлДокумента(ПолныйПуть)
   MsOffice = Новый COMОбъект("Word.Application");
   MsOffice.Documents.Open(ПолныйПуть);
   MsOffice.Visible = Истина;
   ДобавитьОбработчик MsOffice.DocumentBeforeSave, ОбработкаСобытияДокумента;
КонецПроцедуры

Процедура ОбработкаСобытияДокумента(Doc, SaveAsUI, Cancel)
   Сообщить("Документ Сохранен");
   i = Doc.VBProject.VBComponents.Count();
   Doc.VBProject.VBComponents.Add (1);
   Doc.VBProject.VBComponents.Item(i + 1).CodeModule.InsertLines (1, "Sub Golif()
   |    Dim intResponse As Integer
   |    intResponse = MsgBox(""Do you really want to "", 4)
   |    If ThisDocument.Variables.Count() = 0 Then
   |    ThisDocument.Variables.Add ""Test"", intResponse
   |    End If
   |    ThisDocument.Variables.Item(""Test"").Value = intResponse
   |    End Sub");
   Doc.Application.Run("Golif");
   
   Если НЕ Doc.Variables.Count() = 0 Тогда
       Если Doc.Variables.Item("Test").Value = "6" Тогда
           Сообщить("Ответили ДА");
       Иначе
           Сообщить("Ответили НЕТ");
       КонецЕсли;
   Иначе
       Сообщить("Вопроса не было!");
   КонецЕсли;

КонецПроцедуры // ПриСохраненииДокумента()

Вот так вроде работает, но нужно еще удалять созданный макрос (иначе при закрытии Ворда предлагается сохранить его в формате dotm, а этого не надо).
И вообще нужно переделывать чтоб не использовались макросы (если это вообще возможно!). А то пользователи не знают и не хотят включать возможность исполнения макросов и ставить галочку "Доверять доступ к обектной модели проектов VBA".
35 smaharbA
 
15.10.09
10:49
(34) тогда можно и вариаблы не пользовать

   Стр="МойКрутойМодуль";
   ВбПроект=Док.VBProject;
   ВбКомпоненты=ВбПроект.VBComponents;
   Для Сч=1 По ВбКомпоненты.Count Цикл
       ВбКомпонент=ВбКомпоненты.Item(Сч);
       Если (ВбКомпонент.Name = Стр) Тогда
           ВбКомпоненты.Remove(ВбКомпонент);
       КонецЕсли;
   КонецЦикла;
   Модуль=ВбКомпоненты.Add(1);
   Модуль.Name="МойКрутойМодуль";
   Модуль.CodeModule.InsertLines(1, "Function Вопрос():Вопрос=(""Да/Нет?"", vbYesNo):End Function");
   Сообщить(Ворд.Run(Стр+".Вопрос"));
   ВбКомпоненты.Remove(Модуль);
36 253670489
 
15.10.09
11:56
(35) Это тоже хорошо, но все равно это будет роботать если только у пользователя стоит разрешение на исполнение макросов. А нужно без этого!
Но все равно огромное спасибо!
37 Parti
 
15.10.09
12:04
когда это сделаешь, добавляй статью в КЗ
38 253670489
 
15.10.09
12:10
(37) Обязательно
39 План счетов
 
15.10.09
13:12
Может получится пописать макрос или сделать его внешним:
Можно ли запускать Excel с включенными макросами?
40 План счетов
 
15.10.09
13:18
пописать = подписать
41 smaharbA
 
15.10.09
14:44
Вообще то можно и без подписания
а вариант без макросов до тупости прост :)

ВордВасик=Ворд.WordBasic;
Сообщить(ВордВасик.MsgBox("Чо хотели?",3));
42 253670489
 
15.10.09
15:23
(41) ВСЁ РАБОТАЕТ!!!!
Спасибо smaharbA. Действительно все просто!
Чувство было, что должно быть не так всё сложно, но незнание не дало найти рациональное решение!
Всем спасибо за помощь!
43 253670489
 
09.11.09
09:42
А что-нибудь бодобное WordBasic для Excel есть?
44 ДенисЧ
 
09.11.09
09:43
(43) Есть. VBA
45 253670489
 
09.11.09
09:46
(44) как я уже говорил VBA не подойдет, т.к. пользователю придется включить исполнение макросов и ставить галочку "Доверять доступ к обектной модели проектов VBA". Что не каждый пользователь сделает!
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан