Имя: Пароль:
1C
1C 7.7
v7: Выгрузка из ЗиК в WORD
, ,
0 olmi
 
25.10.12
23:47
Кадровиков не устраивает формат приказов в 1С, они их вручную перебивают в WORD, в болванку из Консультанта Плюс. Просят автоматизировать. С Excelем я работала, с WORDом не приходилось.
Заранее благодарю за любую подсказку!)
1 vah1
 
25.10.12
23:52
в сто раз удобней чем в ексель, и потом править могут, типа расшифровку подписи, если желание есть
(0) под рукой примера нет, но в консультанте возми любой, где название конторы выводится - больше ничего знать и не надо
2 olmi
 
26.10.12
00:07
(1) Что я могу взять в Консультанте? И где там смотреть? Я с ним не работала, но доступ есть.
Мне надо операторы Word-овские знать для поиска нужного места в WORD-овском файле и вставки туда значений через ОЛЕ. Я наискось прочитала, что есть что-то типа шаблонов и закладки какие-то, но с этим не знакома пока.
3 zladenuw
 
26.10.12
00:25
если предложу опен офис :). если не против. помогу
4 zladenuw
 
26.10.12
00:26
в опене находил нужное и менял на свое. в удаленке кописпаст сделаю
5 zladenuw
 
26.10.12
00:28
ня. я щедрый
Процедура ПечатьОпен(пЗаявка,ИмяФайла) Экспорт
 
   мВыбФайл = "\\1CSQL2\storage\1С\Total\ВнешниеПечатныеФормы\"+ИмяФайла;
   sUrl = URLИзИмениФайла(мВыбФайл);
   Файл = Соединение.LoadComponentFromURL(sUrl, "_blank", 0, MassivParametrov);
     

   Масс = Новый Массив();
       
   КолЛистов = Файл.GetSheets().GetCount();
   Если Найти(ИмяФайла,"F1")>0 Тогда
       Попытка        
           ТекущийЛист = Файл.sheets.getByIndex(0);
           ReplaceDescriptor     = ТекущийЛист.createReplaceDescriptor();
           ReplaceDescriptor.SearchString = "code";
           ReplaceDescriptor.ReplaceString = СокрЛП(пЗаявка.Номер);
           ТекущийЛист.replaceAll(ReplaceDescriptor);
           
           ReplaceDescriptor     = ТекущийЛист.createReplaceDescriptor();
           ReplaceDescriptor.SearchString = "Date";
           ReplaceDescriptor.ReplaceString = СокрЛП(пЗаявка.Дата);
           ТекущийЛист.replaceAll(ReplaceDescriptor);
           
           ReplaceDescriptor     = ТекущийЛист.createReplaceDescriptor();
           ReplaceDescriptor.SearchString = "@incde";
           ReplaceDescriptor.ReplaceString = СокрЛП(пЗаявка.Авто.Кузов);
           ТекущийЛист.replaceAll(ReplaceDescriptor);
           
           ReplaceDescriptor     = ТекущийЛист.createReplaceDescriptor();
           ReplaceDescriptor.SearchString = "Klient";
           ReplaceDescriptor.ReplaceString = СокрЛП(пЗаявка.Клиент);
           ТекущийЛист.replaceAll(ReplaceDescriptor);
           
       Исключение
           Сообщить(ОписаниеОшибки());
       КонецПопытки;
   Иначе    
       Попытка        
           ТекущийЛист = Файл.sheets.getByIndex(0);
           ReplaceDescriptor     = ТекущийЛист.createReplaceDescriptor();
           ReplaceDescriptor.SearchString = "code";
           ReplaceDescriptor.ReplaceString = СокрЛП(пЗаявка.Номер);
           ТекущийЛист.replaceAll(ReplaceDescriptor);
           
           ReplaceDescriptor     = ТекущийЛист.createReplaceDescriptor();
           ReplaceDescriptor.SearchString = "Date";
           ReplaceDescriptor.ReplaceString = СокрЛП(пЗаявка.Дата);
           ТекущийЛист.replaceAll(ReplaceDescriptor);
           
           ReplaceDescriptor     = ТекущийЛист.createReplaceDescriptor();
           ReplaceDescriptor.SearchString = "@incde";
           ReplaceDescriptor.ReplaceString = СокрЛП(пЗаявка.Авто.Кузов);
           ТекущийЛист.replaceAll(ReplaceDescriptor);
           
           ReplaceDescriptor     = ТекущийЛист.createReplaceDescriptor();
           ReplaceDescriptor.SearchString = "Klient";
           ReplaceDescriptor.ReplaceString = СокрЛП(пЗаявка.Клиент);
           ТекущийЛист.replaceAll(ReplaceDescriptor);
           
           ReplaceDescriptor     = ТекущийЛист.createReplaceDescriptor();
           ReplaceDescriptor.SearchString = "emploe";
           ReplaceDescriptor.ReplaceString = СокрЛП(пЗаявка.Менеджер);
           ТекущийЛист.replaceAll(ReplaceDescriptor);
       Исключение
           Сообщить(ОписаниеОшибки());
       КонецПопытки;
       
   КонецЕсли;
       //ТекущийЛист.replaceAll(ReplaceDescriptor);
       //Args = Новый COMSafeArray("copycount", 1);
    //Файл.Print(MassivParametrovPrint);
     мВыбФайл = "\\1CSQL2\storage\1С\Total\Печать\"+СокрЛП(глТекущийПользователь)+ИмяФайла;
     sUrl = URLИзИмениФайла(мВыбФайл);
     Попытка
         Файл.storeAsURL(sUrl, MassivParametrovSave);
         Файл.Close(true);
         ЗапуститьПриложение(мВыбФайл);
    Исключение
         Сообщить("Такой файл уже открыт. закройте его!");
    КонецПопытки;
     //
    //Файл  = Неопределено;
   
   //ТекущийЛист = Неопределено;
КонецПроцедуры



//Подключение к серверу автоматизации OpenOffice
Попытка
   OpenOffice = Новый COMОбъект("com.sun.star.ServiceManager");
   
   scr = Новый COMОбъект("MSScriptControl.ScriptControl");
   scr.language = "javascript";
   
   scr.eval("MassivParametrov = new Array()");
   MassivParametrov = scr.eval("MassivParametrov");
   
   scr.AddObject("OpenOffice", OpenOffice);
   
   scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
   scr.eval("MassivParametrov[0].Name='Hidden'");
   scr.eval("MassivParametrov[0].Value=true");
   
   scr.eval("MassivParametrovSave = new Array()");
   
   MassivParametrovSave = scr.eval("MassivParametrovSave");
   scr.eval("MassivParametrovSave[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
   scr.eval("MassivParametrovSave[0].Name='Overwrite'");
   scr.eval("MassivParametrovSave[0].Value=true");
   
    scr.eval("MassivParametrovPrint = new Array()");
   MassivParametrovPrint = scr.eval("MassivParametrovPrint");
   scr.eval("MassivParametrovSave[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
   scr.eval("MassivParametrovSave[0].Name='copycount'");
   scr.eval("MassivParametrovSave[0].Value=1");
   
   Соединение = OpenOffice.createInstance("com.sun.star.frame.Desktop");
   
   
Исключение
   Сообщить(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!");        
КонецПопытки;
6 vah1
 
26.10.12
00:29
док открыть и как в екселе макросы редактировать знаешь, так и в ворде - это ж не отдельные проги в мс офис, да и в опене аналогично
7 vah1
 
26.10.12
00:33
+ в доке текст зарание рисуешь, а переменные д/подстановки рисуешь например так
ФИО _ФИО_ что бы не перепутать
8 vah1
 
26.10.12
00:37
вообще-то и гугле примеров дофика:
1C Word
9 olmi
 
26.10.12
00:38
Завтра с утра все посмотрю, спасибо, ребята). Я тут пока тоже нарыла всякого). Если что не пойму - завтра спрошу, а пока пора и отдохнуть). Спокойной ночи и хорошего настроения!)
10 olmi
 
26.10.12
01:05
Думаю, сделаю просто через закладки, завтра поэкспериментирую).
Что-то в этом духе:
Word=СоздатьОбъект("Word.Application");
Документ=Word.Application.Documents.Open(НазваниеФайла);
КолЗакладок=Документ.Bookmarks.Count;
Для Инд=1 По КолЗакладок Цикл
Закладка=Документ.Bookmarks(1).Name;
Если Закладка="ДатаДоговора" Тогда
 Документ.Bookmarks(Инд).Range.Text="01 января 2004г.";
ИначеЕсли Закладка="НомерДоговора" Тогда
 Документ.Bookmarks(Инд).Range.Text="Е-200/15";
КонецЕсли;
КонецЦикла;
Word.Application.DisplayAlerts = 0;
Документ.PrintOut();
Word.Quit();
Word="";
Еще не смотрела, что такое DisplayAlerts, а так все предельно просто).
11 zladenuw
 
26.10.12
01:05
оно везде так. если понимаешь
12 vah1
 
26.10.12
01:09
(10) ну, легче чем ячейки многострочные в екселе программно раздвигать?
13 vah1
 
26.10.12
01:11
вообщем, когда пиво будешь - нас позови :))
14 zladenuw
 
26.10.12
01:27
(13) далеко. но я за. надо сказать модерам. за счетчик пива за ТС :) и за сроки реализации пива :) ы
15 olmi
 
30.10.12
01:34
(11)-(13) Золотые мои ребята!) С пивом, увы, только виртуально, а так все работает). Спасибо за поддержку!)
Сделала через шаблон вот по такой болваночке, решив, что пусть они печатают, если хочут, и пусть видят, чего печатали).

ПутьШаблона = СокрЛП(КаталогИБ()+"\ExtForms\Закладки.dot");
   Если ФС.СуществуетФайл(ПутьШаблона)=0 Тогда
       Предупреждение("Не найден файл "+ПутьШаблона);
       Возврат;
   КонецЕсли;
   
   Word = СоздатьОбъект("Word.Application");
   Word.visible=0;
   Word.Documents.Add(ПутьШаблона);    
   Док = Word.ActiveDocument;    

   КолЗакладок=Док.Bookmarks.Count;
   Для Инд=1 По КолЗакладок Цикл
       Закладка=Док.Bookmarks(Инд).Name;
       Если Закладка="З1" Тогда
           Док.Bookmarks(Инд).Range.Text=СокрЛП(Сотрудник.Наименование);
       ИначеЕсли Закладка="З2" Тогда
           Док.Bookmarks(Инд).Range.Text=Строка(ДатаПриема);  
       ИначеЕсли Закладка="З3" Тогда
           Док.Bookmarks(Инд).Range.Text=СокрЛП(Подразделение.Наименование);  
       ИначеЕсли Закладка="З4" Тогда
           Док.Bookmarks(Инд).Range.Text=СокрЛП(Должность.Наименование);  
       КонецЕсли;
   КонецЦикла;

   Док.SaveAs("c:\...\Приказ о приеме на работу № "+НомерДок+" от "+Строка(ДатаДок)+".rtf");
   Word.Application.DisplayAlerts = 0;
   Если Вопрос("Печатаем?","Да+Нет")="Да" Тогда
       Док.PrintOut(-1);
       //Док.PrintOut();
   КонецЕсли;    
   Word.visible=1;
   Word.Activate();
   //Word.Quit();
   //Word="";

Сорри за задержку ответа, другим пришлось заняться).
Успехов, хорошего настроения, прохладного пива в теплой комнате!)
16 Ant1773
 
30.10.12
07:34
У меня стандартный вопрос - А ЗАЧЕМ???
Ну не устраивает их типовая форма приказа в 1С - нужно сделать такую, чтобы устраивала.
17 Морозов Александр
 
30.10.12
07:38
а чего внешнюю печатную форму никак?
18 dk
 
30.10.12
07:58

   Попытка
       Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
       Скрипт.language="javascript";
       Ворд = Скрипт.Eval("new ActiveXObject('Word.Application')");
   Исключение
       Попытка
           Ворд = СоздатьОбъект("Word.Application");
       Исключение
           Сообщить("Не удалось открыть Word");
           Возврат;
       КонецПопытки;
   КонецПопытки;    
   
   Ворд.DisplayAlerts = ексНет;    
   
   Док = Ворд.Documents.Add(КаталогИБ()+"ExtForms\mxl\" + "Предварительное исковое - предоплата.dotx");
   
   НомерИсходящий = ПолучитьИсходящий(Фирма, Элем, СокрЛП(глПользователь)+" "+ТекущаяДата()+" "+ТекущееВремя()+" долг: "+ СуммаПросрочки, Перечисление.ВидыДокументов.Исковое);
   Госпошлина        = Окр(ПолучитьСуммуГоспошлины(СуммаПросрочки + СуммаПени), 2);
   
   Док.Bookmarks("Исходящий").Range.Text                    = НомерИсходящий + " от " + ПолучитьТекстовуюДату(ПолучитьДатуТА());;
   Док.Bookmarks("НаименованиеКонтрагента").Range.Text        = СокрЛП(Элем.ПолнНаименование);
   Док.Bookmarks("ИндексЮридическийАдрес").Range.Text        = ?(СокрЛП(Элем.ЮридическийАдрес)="",СокрЛП(Элем.ПочтовыйАдрес),СокрЛП(Элем.ЮридическийАдрес));;
   Док.Bookmarks("ЦенаИска").Range.Text                    = СокрЛП(Формат(СуммаПросрочки + СуммаПени, "Ч15.2, ")) + " рублей";
   Док.Bookmarks("Госпошлина").Range.Text                    = СокрЛП(Формат(Госпошлина, "Ч15.2, ")) + " рублей";
   Док.Bookmarks("Дата").Range.Text                        = ПолучитьТекстовуюДату(ТекДоговор.ДатаЗаключения);//ПолучитьТекстовуюДату(ПолучитьДатуТА());
   Док.Bookmarks("Договор").Range.Text                        = ПолучитьНомерДоговора(ТекДоговор);
   Док.Bookmarks("Сумма").Range.Text                        = СокрЛП(Формат(СуммаДок, "Ч15.2, "));;
   Док.Bookmarks("ТоварнаяНакладная").Range.Text            = ПолучитьСписокНакладных(ТабДок);
   Док.Bookmarks("СуммаОплаты").Range.Text                    = СокрЛП(Формат(СуммаОплатили, "Ч15.2, "));
   Док.Bookmarks("ДатаДолг").Range.Text                    = ПолучитьТекстовуюДату(ПолучитьДатуТА());
   Док.Bookmarks("Долг").Range.Text                        = СокрЛП(Формат(СуммаПросрочки, "Ч15.2, "));
   Док.Bookmarks("Проценты").Range.Text                    = СокрЛП(Формат(СуммаПени, "Ч15.2, "));
   Док.Bookmarks("ОбщаяСуммаЗадолженности").Range.Text        = СокрЛП(Формат(СуммаПросрочки + СуммаПени, "Ч15.2, "));
   Док.Bookmarks("ДатаПретензии").Range.Text                = ПолучитьТекстовуюДату(ПолучитьДатуПретензии(Элем));//ПолучитьТекстовуюДату(ПолучитьДатуТА());
   Док.Bookmarks("Ответчик").Range.Text                    = СокрЛП(Элем.ПолнНаименование);
   Док.Bookmarks("СуммаДолга").Range.Text                    = СокрЛП(Формат(СуммаПросрочки, "Ч15.2, "));
   Док.Bookmarks("СуммаПроцентов").Range.Text                = СокрЛП(Формат(СуммаПени, "Ч15.2, "));
   Док.Bookmarks("СуммаГоспошлины").Range.Text                = СокрЛП(Формат(Госпошлина, "Ч15.2, "));
   Док.Bookmarks("ДоговорКопия").Range.Text                = ПолучитьНомерДоговора(ТекДоговор) + " от " + ПолучитьТекстовуюДату(ТекДоговор.ДатаЗаключения);
   Док.Bookmarks("ТоварнаяНакладнаяКопия").Range.Text        = ПолучитьСписокНакладных(ТабДок, " (копия)");
   
   ИмяДляСохранения = КаталогВременныхФайлов() + "Исковое_" + НомерИсходящий + ".rtf";
   
   Попытка
       Док.SaveAs2(ИмяДляСохранения, wdFormatRTF);
   Исключение
       Сообщить("Ошибка при сохранении файла: ");
   КонецПопытки;

   Попытка
       Док.Close(ексНет);
   Исключение
   КонецПопытки;
   
   Попытка
       Ворд.Quit(ексНет);
   Исключение
   КонецПопытки;

19 dk
 
30.10.12
08:00
это для 2010-го, но в 2007 тоже должон нормально работать
20 mzelensky
 
30.10.12
08:15
(18) а зачем эти ухищрения:

   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
       Скрипт.language="javascript";
       Ворд = Скрипт.Eval("new ActiveXObject('Word.Application')");

???
21 dk
 
30.10.12
08:27
(20) чтобы новый экземпляр ворда получить, а не "приклеиваться" к существующему.
22 mzelensky
 
30.10.12
09:02
(21) попробовал с этим....честно говоря разницы не увидел :(
23 dk
 
30.10.12
09:27
это критично, если пользователь уже интерактивно работает с Excel / Word и в коде используются selection или еще что-нить интерактивное.
Например ты выполняешь код на VBA, а юзер тут решил закрыть приложение
---
кому-то критично, а кому-то пофиг
24 olmi
 
15.11.12
21:02
Ребята, уже задним числом сюда заглянула)... Все просто решилось - налепила закладок, сделала шаблоны, в ExtForms их, в документах приказов в СписокЗначений забила нужное для закладок текстами, и все в обработочку. При закрытии обработки по ОК вызываю процедурку создания файла WORD, и в ней из списка в закладки все закидываю, потом документ сохраняю и активизирую).
Вот код процедурки:
Процедура ПолучитьФайлWORD(КодОш)  
   
   Если ТекКаталог="" Тогда
       Сообщить("Константа пути к файлам приказов данного вида не заполнена!","!");
       КодОш=1;
       Возврат;
   КонецЕсли;    
   
   ПутьШаблона = СокрЛП(КаталогИБ()+"\ExtForms\"+НаимШаблона+".dot");
   Если ФС.СуществуетФайл(ПутьШаблона)=0 Тогда
       Предупреждение("Не найден файл "+ПутьШаблона);  
       КодОш=1;
       Возврат;
   КонецЕсли;  
   
   НовыйФайл=СокрЛП(ТекКаталог)+"\"+НаимДок+".rtf";  
   Если ФС.СуществуетФайл(НовыйФайл)=1 Тогда
       Если Вопрос("Файл данного документа в WORD уже создан. Перезаписать?","Да+Нет")="Да" Тогда
           ФС.УдалитьФайл(НовыйФайл);
       Иначе
           Возврат;
       КонецЕсли;  
   КонецЕсли;  
       
   Word = СоздатьОбъект("Word.Application");
   Word.visible=0;
   Word.Documents.Add(ПутьШаблона);    
   Док = Word.ActiveDocument;  
   
   КолЗакладок=Док.Bookmarks.Count;  
   
   //Для Инд=1 По КолЗакладок Цикл
   //    Сообщить(Док.Bookmarks(Инд).Name);
   //КонецЦикла;  
   //Док.Close();    
   //Word.Quit();  
   //Возврат;
   
   Если КолЗакладок=СписокПараметров.РазмерСписка() Тогда
       Для Инд=1 По КолЗакладок Цикл
           Док.Bookmarks(Инд).Range.Text=СписокПараметров.ПолучитьЗначение(Инд);
       КонецЦикла;
   Иначе
       Сообщить("Количество закладок в шаблоне WORD не соответствует количеству выводимых реквизитов документа."
       +РазделительСтрок+"Обратитесь к программисту 1С.","!");
       Word.Quit();
       Word="";
       КодОш=1;
       Возврат;
   КонецЕсли;  
   
   Док.SaveAs(НовыйФайл);
   Word.Application.DisplayAlerts = 0;
   //Если Вопрос("Печатаем?","Да+Нет")="Да" Тогда
   //    Док.PrintOut(-1);
   //КонецЕсли;    
   Word.visible=1;
   Word.Activate();
   
   //Предупреждение("Файл "+НовыйФайл+" создан и открыт.");
   Сообщить("Файл "+НовыйФайл+" создан и открыт.");
   
КонецПроцедуры
25 Lama12
 
15.11.12
22:13
Как все усложняет :)
Сохраняем в mxl
Открываем в "работа с файлами 1с"
Сохраняем в word.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн