Имя: Пароль:
1C
 
Word и 1С
0 Baglandir
 
16.02.09
12:39
Добрый день.
Задача состоит в том что надо динамически формировать печатную форму в Word. в зависимости от количества ел в табличной части.

Сначала я решил делать это с помощю макета Active document.
В документе создал поля (Field)
и заполнил их.

// 2. Создаем структуру
Отбор=Новый Структура;
           
// 2.1 Шапка печатной формы
Отбор.Вставить("НомерПриказа",Ном);
Отбор.Вставить("ДатаДокум",Дата);

Попытка
               н=Документ.Fields.Count;    
               Для ц=1 по н Цикл
                   Значение="";
                   Закладка="";
                   Закладка=СокрЛП(Документ.Fields(ц).Code.Text);
                   Если отбор.Свойство(Закладка,Значение) Тогда
                       Документ.Fields(ц).Result.Text = Значение;    
                   КонецЕсли;    
               КонецЦикла;    
               Док.Application.Visible=True;    
           Исключение
               Сообщить(ОписаниеОшибки(),СтатусСообщения.Важное);
               Док.Application.Quit();
КонецПопытки;

Вопрос вот в чем,
можно ли как-то динамически формировать - Поля с параметрами(Field) в самом документе "ActiveX"

Или возможно, есть какой-то другой способ сформировать динамически (в зависимости от количества строк в табличной части )документ в "Word" ?
1 ТелепатБот
 
гуру
16.02.09
12:39
2 Immortal
 
16.02.09
12:43
3 gr13
 
16.02.09
12:47
(2) а как добавить ТЧ в Ворд?
4 gr13
 
16.02.09
12:47
т.е. мне необходимо чтобы в документе ворд заполнялась таблица?
5 Baglandir
 
16.02.09
12:54
(2) спасибо,
А можно ли както их скопировать имена , перед тем как искать и заменять ?
6 Immortal
 
16.02.09
13:00
(3) какую ТЧ??
может ты про таблицу.
можно попробовать
   КомОбъект.Tables.Add()
7 Immortal
 
16.02.09
13:01
(4) в (2) уже есть пример заполнения таблицы
8 Immortal
 
16.02.09
13:03
Represents a single table. The Table object is a member of the Tables collection. The Tables collection includes all the tables in the specified selection, range, or document.

Using the Table Object
Use Tables(index), where index is the index number, to return a single Table object. The index number represents the position of the table in the selection, range, or document. The following example converts the first table in the active document to text.

ActiveDocument.Tables(1).ConvertToText Separator:=wdSeparateByTabs
       
Use the Add method to add a table at the specified range. The following example adds a 3x4 table at the beginning of the active document.

Set myRange = ActiveDocument.Range(Start:=0, End:=0)
ActiveDocument.Tables.Add Range:=myRange, NumRows:=3, NumColumns:=4
9 Immortal
 
16.02.09
13:06
(5) перебрать что ли?
обращайся к коллекции и перебирай
10 калайдеРР
 
16.02.09
13:10
может чуть в тему, но всетаки - у некоторых пользователей  элемент Активикс не виден, точнее он сам виден а его свойства нет... (активикс = MS Rich Textbox Control 6.0
11 калайдеРР
 
16.02.09
13:11
саму OCXку зарегистрировал
12 Immortal
 
16.02.09
13:12
это надо у Абрахамса спросить
13 Baglandir
 
16.02.09
13:13
Text = "НовыйНомер1"
Selection.Fields.Add Selection.Range, wdFieldEmpty, Text

Вот есть функция добавления поля из макроса VB. При переносе в 1С ругается на поле  Text

Док = Приказ.Получить();
Документ = Док.Application.Documents(1);
Документ.Activate();
Text = "НовыйНомер1";
Документ.Fields.Add ("", -1,Text,False );
14 калайдеРР
 
16.02.09
13:17
(12) как с ним связаться
15 Immortal
 
16.02.09
13:19
(13) что т оне нашёл такой перегрузки, у меня в мане только
ъUse the Add method to add a field to the Fields collection. The following example inserts a DATE field at the beginning of the selection and then displays the result.

Selection.Collapse Direction:=wdCollapseStart
Set myField = ActiveDocument.Fields.Add(Range:=Selection.Range, _
   Type:=wdFieldDate)
MsgBox myField.Result
       

(14) на форуме поищи персонажа SmaharbA
прежде чем его искать, проверь права и прочая прочая.
16 Immortal
 
16.02.09
13:21
а, нашёл
Adds a Field object to the Fields collection. Returns the Field object at the specified range.

expression.Add(Range, Type, Text, PreserveFormatting)
expression    Required. An expression that returns a Fields object.

Range   Required Range object. The range where you want to add the field. If the range isn't collapsed, the field replaces the range.

Type   Optional Variant. Can be any WdFieldType constant. For a list of valid constants, consult the Object Browser. The default value is wdFieldEmpty.

Text   Optional Variant. Additional text needed for the field. For example, if you want to specify a switch for the field, you would add it here.

PreserveFormatting   Optional Variant. True to have the formatting that's applied to the field preserved during updates.
вже ж
Text   Optional Variant
17 Immortal
 
16.02.09
13:25
+(16) в смысле опусти этот параметр, не задавай
18 Baglandir
 
16.02.09
13:47
(16)  
вже ж
Text   Optional Variant

Additional text needed for the field.

I need :)
Насколько я понимаю Optional Variant говорит о том что параметр необязательный
но если надо туда можно текст вставить.

В 1С все-равно пишет несоответствие типов не соглашается и на пустое поле :)

Хотя в макросе все ок.

Щас попробую в 1С вставить макрос.И посмотрю получется ли то что я задумал )
19 Immortal
 
16.02.09
13:59
(18) через ms script control можно (тут трошки могу ошибиццо), давно уже Михайлова не читал
20 gr13
 
16.02.09
14:35
(19) кого? дай название книжки
21 Immortal
 
16.02.09
14:39
22 Immortal
 
16.02.09
14:40
+(21) яндекс закрыли?
23 KAO111
 
16.02.09
14:44
24 Immortal
 
16.02.09
14:46
(23) бэст-)
25 gr13
 
16.02.09
14:47
а есть пример обработки?
26 gr13
 
16.02.09
14:47
(23) а где-нить где региться не надо плиз
27 KAO111
 
16.02.09
14:51
(26) мне уж точно будет лень перекладывать, там зарегится - 1 минута.
пример там есть с табличными частями.
28 Immortal
 
16.02.09
14:51
29 gr13
 
16.02.09
14:59
так это vbs)
30 Immortal
 
16.02.09
15:21
(29) а чем не устраивает..
в край можнео налабать макросов, и вызывать их.
31 vde69
 
16.02.09
15:24
КоличествоПеременных = WORDФайл.Fields.Count;  
       Для е = 1 по КоличествоПеременных Цикл         //Result  Code
           ИмяПеременной = "";
           ЗнПоля = СокрЛП(WORDФайл.Fields(е).Code.text);
           Если ВРег(Лев(ЗнПоля,11)) = "DOCVARIABLE" Тогда
               ЗнПоля = СокрЛП(Сред(ЗнПоля, 12));
               ИмяПеременной = СокрЛП(Лев(ЗнПоля, Найти(ЗнПоля, " ")));
           КонецЕсли;
           
           Если ИмяПеременной <> "" Тогда
               МассивПеременныхДокумента.ДобавитьЗначение(ИмяПеременной);
           КонецЕсли;
       КонецЦикла;


http://www.infostart.ru/projects/3060/
32 gr13
 
16.02.09
16:17
а как в Ворд указать, что это переменная?
33 vde69
 
16.02.09
16:18
(32) по ссылке www.infostart.ru/projects/3060/ есть картинка, там показано как должно поле выглядеть
34 gr13
 
16.02.09
16:19
(33) не открывается
35 gr13
 
16.02.09
16:22
(33) а как с активным документом работать? просто ты напрямую обращаешься к ворд
36 vde69
 
16.02.09
16:27
(35) все открываеться, скачай обработку, она по OLE с ним работает...

а поле описываеться так
{ DOCVARIABLE  Подразделение \* MERGEFORMAT}
37 gr13
 
16.02.09
16:36
(36) да я понял, я вообще от переменных отказался. execute
только надо еще разобраться как с таблицами работать.
пример работы с шаблоном ворд вообще пустой
38 gr13
 
16.02.09
17:56
а как мне "показать" Active document?
39 Immortal
 
17.02.09
00:12
//КомОбъект.Application.Visible=1;
40 gr13
 
17.02.09
09:01
ап
41 gr13
 
17.02.09
09:01
(39) есть такое - не отображается(
42 gr13
 
17.02.09
09:02
АктивныйДокумент = ПолучитьМакет("ДополнительноСоглашение");
   КомОбъект = АктивныйДокумент.Получить();
   
   
   Замена = КомОбъект.Content.Find;
   
   Если ВыборкаШапка.Следующий() Тогда
Замена.execute("<ДоговорДата>", Ложь,Истина,Ложь,,,Истина,,Ложь, ВставитьПробел(ВыборкаШапка.ДоговорДата),2);
       КонецЕсли;
   
   КомОбъект.Fields.Update();
   КомОбъект.ActiveWindow.Visible = 1;
   КомОбъект.Activate();

что я не так делаю?
43 gr13
 
17.02.09
09:08
гы) утро вечера мудренее... нашел кучу открытых вордовских файлов...
а как мне сделать так, чтобы ворд при закрытии спрашивал о сохранении в другую папку? т.е. чтобы дать признак модифицированности?
44 gr13
 
17.02.09
09:22
НомерПоПорядкуСтолбец = КомОбъект.Tables(1).Columns(1);
   ФИОСтолбец = КомОбъект.Tables(1).Columns(2);
   ДатаРожденияСтолбец = КомОбъект.Tables(1).Columns(3);
       
   Пока ВыборкаТЧ.Следующий() Цикл
       НомерПоПорядкуСтолбец = ВыборкаТЧ.НомерСтроки;
       ФИОСтолбец = ВыборкаТЧ.ПациентНаименование;
       ДатаРожденияСтолбец = ВыборкаТЧ.ПациентДатаРождения;
       КомОбъект.Tables(1).Rows.Add();
   КонецЦикла;

а что здесь не правильно? строки добавляются, но не добавляются значения столбцов
45 gr13
 
17.02.09
09:27
НомерПоПорядкуСтолбец = КомОбъект.Tables(1).Columns(1);
   ФИОСтолбец = КомОбъект.Tables(1).Columns(2);
   ДатаРожденияСтолбец = КомОбъект.Tables(1).Columns(3);
   
   Ном = 0;
   
   Пока ВыборкаТЧ.Следующий() Цикл
       
       Ном = Ном + 1;
       
       НомерПоПорядкуЯчейка=НомерПоПорядкуСтолбец.Cells(Ном);
       ФИОЯчейка=ФИОСтолбец.Cells(Ном);
       ДатаРожденияЯчейка=ДатаРожденияСтолбец.Cells(Ном);
       
       НомерПоПорядкуЯчейка.Range.Text = Строка(ВыборкаТЧ.НомерСтроки);
       ФИОЯчейка.Range.Text = Строка(ВыборкаТЧ.ПациентНаименование);
       ДатаРожденияЯчейка.Range.Text = Строка(ВыборкаТЧ.ПациентДатаРождения);
       КомОбъект.Tables(1).Rows.Add();
   КонецЦикла;

вроде так должно быть правильно( а выводится не известная ошибка на НомерПоПорядкуЯчейка.Range.Text = Строка(ВыборкаТЧ.НомерСтроки);
46 Immortal
 
17.02.09
09:27
гм..а где у тебя заполнение ячеек?
или у тебя столбцы (пустые) не отображаются?
ДатыЯчейка=ДатыСтолбец.Cells(Номер);
           КодыЯчейка=КодыСтолбец.Cells(Номер);
           ТДЯчейка=ТДСтолбец.Cells(Номер);
           ВалютыЯчейка=ВалютыСтолбец.Cells(Номер);
           СуммыЯчейка=СуммыСтолбец.Cells(Номер);        
           
           СуммыЯчейка.Range.Text=Формат(ВыборкаИзЗапроса.СуммаДокумента+ВыборкаИзЗапроса.СуммаДопРасходов,"ЧЦ=15; ЧДЦ=2");
           ДатыЯчейка.Range.Text=ВыборкаИзЗапроса.ДатаПоступления;
           
           КодыЯчейка.Range.Text="01";
           ВалютыЯчейка.Range.Text="643";
47 gr13
 
17.02.09
09:43
(46) столбцы отображались пустые - я почитал, и обработку скачал
http://gendin.ru/2008/10/07/1c8-to-word/
сделал так - работает
тбл = КомОбъект.Tables.Item(1);
       Ном = 0;
       
       Пока ВыборкаТЧ.Следующий() Цикл
           
           Ном = Ном + 1;
КомОбъект.Tables(1).Rows.Add();
           тбл.Cell(Ном + 1,1).Select();
           КомОбъект.ActiveWindow.ActivePane.Selection.ParagraphFormat.Alignment = 0; // выравнивание по левому
           КомОбъект.ActiveWindow.ActivePane.Selection.TypeText(СокрЛП(Ном));
КонецЦикла;
       
       
       КомОбъект.Fields.Update();
       КомОбъект.ActiveWindow.Visible = 1;
       КомОбъект.Activate();
       
       //КомОбъект.Application.Quit();
       КомОбъект = Неопределено;
48 gr13
 
17.02.09
09:54