Имя: Пароль:
1C
 
Висит процесс WINWORD.EXE после использования шаблона Ворда.
,
0 Nykos
 
19.06.15
08:23
Всем привет. Есть шаблон Word'a, прикрученный через макет.двоичные данные. Если файл уже открыт, то при повторном открытии 1с выдает ошибку совместного доступа к файлу и при этом добавляет в систему процесс WINWORD.EXE. В итоге если 5 раз при уже открытом шаблоне ворда понажимать на форме кнопку Печать, соглашаться с ошибкой и открыть Диспетчер задач - то там будет висеть 5 процессов ворда. Как правильно запилить множественный доступ и уничтожать процесс в случае ошибки?
1 МаксимМП23
 
19.06.15
08:24
(0) Через двоичные данные это как-то странно. Как актив документ не хочется переделать?
2 Остап Сулейманович
 
19.06.15
08:27
(1) Все там нормально. Если из шаблона СОЗДАВАТЬ документ (все в терминах ВОРД). А вот если его (шаблон) пытаться открыть семью экземплярами ВОРДа - тогда да. Гемор обеспечен. И актив документ в таком случае тоже ни разу не спасет.
3 Nykos
 
19.06.15
08:33
Процедура ОсновныеДействияФормыПечать(Кнопка)
    Word = Новый COMОбъект("Word.Application");
    Макет = ПолучитьМакетСервер();
    временныйПуть = КаталогВременныхФайлов();
    имяВременногоФайла = временныйПуть + "gph.doc";
    Макет.Записать(имяВременногоФайла);
    ТекДок = Word.Documents.ADD(имяВременногоФайла);
    ТекДок.Variables("NomerDogovora").Value = СокрЛП(Строка(Номер));
    ТекДок.Variables("Data").Value = Формат(Дата,"ДЛФ = ДД");
    ТекДок.Variables("Client").Value = Заказчик.Наименование;
    ТекДок.Variables("Director").Value = СокрЛП(Заказчик.Директор);
    Если Основание = "0" Тогда
        ТекДок.Variables("Osnovanie").Value = СокрЛП(ЭлементыФормы.Основание.СписокВыбора.Получить(0).Представление);
    Иначе
        Сообщить("Укажите основание договора!",СтатусСообщения.ОченьВажное);
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    ТекДок.Variables("AdresKlienta").Value = СокрЛП(Заказчик.ПочтАдрес);
    ТекДок.Variables("TelFax").Value = СокрЛП(Заказчик.Телефоны);
    ТекДок.Variables("UNP").Value = СокрЛП(Заказчик.УНП);
    ТекДок.Variables("OKPO").Value = СокрЛП(Заказчик.ОКПО);
    Счет = Справочники.РасчетныеСчета.ПустаяСсылка();
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    РасчетныеСчета.Ссылка КАК РС,
    |    РасчетныеСчета.Банк КАК Банк,
    |    РасчетныеСчета.Банк.МФО КАК МФО,
    |    РасчетныеСчета.Банк.Адрес КАК Адрес
    |ИЗ
    |    Справочник.РасчетныеСчета КАК РасчетныеСчета
    |ГДЕ
    |    РасчетныеСчета.Владелец = &Контрагент";
    Запрос.УстановитьПараметр("Контрагент",Заказчик);
    Выб = Запрос.Выполнить().Выбрать();
    Если Выб.Количество() = 1 Тогда
        Выб.Следующий();
        Счет = Выб.РС;
        Банк = Выб.Банк;
        МФО = Выб.МФО;
        Адрес = Выб.Адрес;
    КонецЕсли;
    ТекДок.Variables("Schet").Value = СокрЛП(Счет) ;
    ТекДок.Variables("BankNaim").Value = СокрЛП(Банк) ;
    ТекДок.Variables("MFO").Value = СокрЛП(МФО);
    ТекДок.Variables("AdresBanka").Value = СокрЛП(Адрес);
    ТекДок.Fields.Update();
    Word.ActiveWindow.View.ShowFieldCodes = False;
    Word.Visible = Истина;
КонецПроцедуры
4 Nykos
 
19.06.15
08:36
(1) Честно сказать я первый раз столкнулся с этими макетами, поэтому выбрал первый попавшийся, да и на Мисте читал где-то, что он в большинстве случаев более удобен.
5 Остап Сулейманович
 
19.06.15
08:53
(3) Собака порылась вот здесь :
имяВременногоФайла = временныйПуть + "gph.doc";
Макет.Записать(имяВременногоФайла);

Пока не закрыт предыдущий документ файл шаблона заблокирован. А ты пытаешься его Записать. Ворд не понимает, что с этим делать. Видимо нужно сначала проверять наличие этого файла и только потом решать записывать его по новой или пользовать имеющийся.

Либо каждый раз имя файла формировать с помощью ПолучитьИмяВременногоФайла()
6 Nykos
 
19.06.15
09:32
(5) вот именно что надо сделать возможность открывать неограниченное количество копий файла шаблона, причем не только если они отличаются( разные документы в журнале), но и одинаковые копии
7 МаксимМП23
 
19.06.15
09:34
(6) Переделай на актив док. Это не долго будет и избавишься от плясок с файлами.
8 MadHead
 
19.06.15
09:36
переходи на линукс там это пофикшено
9 Nykos
 
19.06.15
09:42
(7) а как мне правильно описать его?
10 МаксимМП23
 
19.06.15
09:46
(9) МАкет создаешь Active Document. Копируешь туда содержимое своего шаблона и потом почти также с ним работаешь.
Погугли, примеров полно.
11 Nykos
 
19.06.15
09:49
(10) ок, поизучаю, спасибо)
12 Nykos
 
19.06.15
10:15
(10) ну как-то так у меня поулчилось. Вроде все круто) открывает несколько вордовских доков одновременно, процессы лишние не создает, параметры заполняет... Печатать пользователи вручную будут, так что PrintOut() не нужен. Может  упустил что, но не замечаю?


Процедура ОсновныеДействияФормыПечать(Кнопка)
    АктивныйДокумент = ПолучитьМакет("Макет1");
    ТекДок = АктивныйДокумент.Получить();
    ТекДок.Application.Visible=1;
    ТекДок.Variables("NomerDogovora").Value = СокрЛП(Строка(Номер));
    ТекДок.Variables("Data").Value = Формат(Дата,"ДЛФ = ДД");
    ТекДок.Variables("Client").Value = Заказчик.Наименование;
    ТекДок.Variables("Director").Value = СокрЛП(Заказчик.Директор);
    Если Основание = "0" Тогда
        ТекДок.Variables("Osnovanie").Value = СокрЛП(ЭлементыФормы.Основание.СписокВыбора.Получить(0).Представление);
    Иначе
        Сообщить("Укажите основание договора!",СтатусСообщения.ОченьВажное);
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    ТекДок.Variables("AdresKlienta").Value = СокрЛП(Заказчик.ПочтАдрес);
    ТекДок.Variables("TelFax").Value = СокрЛП(Заказчик.Телефоны);
    ТекДок.Variables("UNP").Value = СокрЛП(Заказчик.УНП);
    ТекДок.Variables("OKPO").Value = СокрЛП(Заказчик.ОКПО);
    Счет = Справочники.РасчетныеСчета.ПустаяСсылка();
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    РасчетныеСчета.Ссылка КАК РС,
    |    РасчетныеСчета.Банк КАК Банк,
    |    РасчетныеСчета.Банк.МФО КАК МФО,
    |    РасчетныеСчета.Банк.Адрес КАК Адрес
    |ИЗ
    |    Справочник.РасчетныеСчета КАК РасчетныеСчета
    |ГДЕ
    |    РасчетныеСчета.Владелец = &Контрагент";
    Запрос.УстановитьПараметр("Контрагент",Заказчик);
    Выб = Запрос.Выполнить().Выбрать();
    Если Выб.Количество() = 1 Тогда
        Выб.Следующий();
        Счет = Выб.РС;
        Банк = Выб.Банк;
        МФО = Выб.МФО;
        Адрес = Выб.Адрес;
    КонецЕсли;
    ТекДок.Variables("Schet").Value = СокрЛП(Счет) ;
    ТекДок.Variables("BankNaim").Value = СокрЛП(Банк) ;
    ТекДок.Variables("MFO").Value = СокрЛП(МФО);
    ТекДок.Variables("AdresBanka").Value = СокрЛП(Адрес);
    ТекДок.Fields.UpDate();
КонецПроцедуры
13 Nykos
 
19.06.15
10:16
(12) При использовании AD файл шаблона хранится в конфигурации  или с ним надо какие-либо манипуляции проводить?
14 Nykos
 
19.06.15
11:51
Имеется ввиду его нужно ложить в определенную папку на сервере или достаточно один раз указать путь к файлу и 1с запомнит настройки?