Сегодня передо мной стала задача формирования договора контрагента в формате .doc для отправки контрагентам для внесения своих изменений. На данный момент договора хранятся в макете.
Инструментарий который прилагался 1С 8.3 на управляемых формах (для обычных форм также подходит) и предустановленный OpenOffice.
Первым делом подготавливаем шаблон. В данном случае стандартный шаблон договора, только в тех местах, где необходимо будет подставлять данные из 1С я заключал в символ %(можно взять любой другой). Например, %Дата%.
Когда макет готов загружаем его в 1С. Для этого создаем новый макет с типом двоичные данные и загружаем подготовленный шаблон.
Теперь самое интересное. Вызов макета и заполнение переменных, которые мы заключили в %.
//проверка наличия OpenOffice на ПК Попытка OpenOffice = Новый COMОбъект("com.sun.star.ServiceManager"); Исключение Сообщить(ОписаниеОшибки() + "; Программа OpenOffice не установлена на данном компьютере!"); КонецПопытки; //Создаем таблицу значений для описания замены ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Параметр"); ТЗ.Колонки.Добавить("Значение"); //Добавляем записи в ТЗ для поиска и замены Стр = ТЗ.Добавить(); Стр.Параметр = "%Номер%"; //будет заменен параметр Номер Стр.Значение = ЗаказНаряд.Номер; //на что менять Стр = ТЗ.Добавить(); Стр.Параметр = "%Дата%"; //будет заменен параметр Дата Стр.Значение = ЗаказНаряд.Дата; //на что менять Стр = ТЗ.Добавить(); Стр.Параметр = "%Авто%"; //будет заменен параметр Дата Стр.Значение = ЗаказНаряд.Автомобиль.Наименование; //на что менять Макет = ПолучитьМакет("ДоговорДОК"); временныйПуть = КаталогВременныхФайлов(); имяВременногоФайла = временныйПуть + "dog.doc"; Макет.Записать(имяВременногоФайла); Args = Новый COMSafeArray("VT_DISPATCH", 1); Param=OpenOffice.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); Param.Name = "AsTemplate"; Param.Value = True; Args.SetValue(0,Param); // Открыть OpenOffice Desktop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop"); ПутьКФайлуURL = ПреобразоватьВURL(имяВременногоФайла); //преобразивание пути к файлу к URL формату Document = Desktop.LoadComponentFromURL(ПутьКФайлуURL, "_blank", 0, Args); Replace = Document.CreateReplaceDescriptor(); //Меняем параметры в документе согласно ТЗ Для Каждого Строка Из ТЗ Цикл Replace.SearchString = Строка.Параметр; Replace.ReplaceString = Строка.Значение; Document.ReplaceAll(Replace); КонецЦикла;
Вот и все. У меня все отлично работает.
Айрат
Может у кого-то и работает, но у меня ошибка....
Не удалось сформировать внешнюю печатную форму:
{ВнешняяОбработка.ДоговорСПокупателем.МодульОбъекта(94)}: Ошибка при установке значения атрибута контекста (ReplaceString): Произошла исключительная ситуация ([automation bridge] ): InterfaceOleWrapper_Impl::Invoke :
[automation bridge]UnoConversionUtilities::variantToAny
Cannot convert the value of vartype :"9" to the expected UNO type of type class: 12
Евгений
осталось найти текст процедуры
ПутьКФайлуURL = ПреобразоватьВURL(имяВременногоФайла);
потому что хрен знает что это такое и где его брать
admin
Функция ПреобразоватьВURL(ПутьКФайлу)
ПутьКФайлу = СтрЗаменить(ПутьКФайлу," ","%20");
ПутьКФайлу = СтрЗаменить(ПутьКФайлу,"\","/");
Возврат "file:/" + "/localhost/" + ПутьКФайлу;
Конецфункции