В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:
П орядок программных действий при выгрузке в файл выглядит так:
Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки); Конвертируем таблицу значений в табличный документ; Сохраняем табличный документ в MXL.
При загрузке таблицы порядок действий такой:
Читаем из файла табличный документ; Конвертируем табличный документ в таблицу значений; Используем эту таблицу значений в своих целях (загружаем в табличную часть).
Соответственно файл для хранения данных таблицы имеет расширение *.mxl.
Основные функции для реализации поставленной задачи следующие:
ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.
Код 1C v 8.3
Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт
Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда
НачалоСтрока = 1 ;
НачалоСтолбец = 1 ;
КонецЕсли ;
Если НачалоСтрока = Неопределено Тогда
НачалоСтрока = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтрока < ТабДок. ВысотаТаблицы
Цикл
НачалоСтрока = НачалоСтрока + 1 ;
КонецЦикла ;
ИначеЕсли НачалоСтолбец = Неопределено Тогда
НачалоСтолбец = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтолбец < ТабДок. ШиринаТаблицы
Цикл
НачалоСтолбец = НачалоСтолбец + 1 ;
КонецЦикла ;
КонецЕсли ;
КонецСтрока = ? ( КонецСтрока = Неопределено , ТабДок. ВысотаТаблицы, КонецСтрока) ;
КонецСтолбец = ? ( КонецСтолбец = Неопределено , ТабДок. ШиринаТаблицы, КонецСтолбец) ;
ЭтоТаблица = ( ТипЗнч( СтруктураКолонок) = Тип( "ТаблицаЗначений" ) ) ;
ТабЗначений = ПолучитьТаблицуВывода( СтруктураКолонок) ;
Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл
СтрокаТЗ = ТабЗначений. Добавить( ) ;
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из СтруктураКолонок Цикл
НаименованиеКолонки = ? ( ЭтоТаблица, Колонка. Наименование, Колонка. Ключ) ;
пИндексКолонки = ? ( ЭтоТаблица, Колонка. СтолбецОтчёт, ИндексКолонки) ;
Если ТабДок. Область( ИндексСтроки, пИндексКолонки) . СодержитЗначение Тогда
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Значение;
Иначе
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Текст;
КонецЕсли ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
КонецЦикла ;
Возврат ТабЗначений;
КонецФункции ;
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли ;
НачалоСтрока = ? ( НачалоСтрока = Неопределено , 1 , НачалоСтрока) ;
НачалоСтолбец = ? ( НачалоСтолбец = Неопределено , 1 , НачалоСтолбец) ;
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Текст = ? ( ПустаяСтрока( Колонка. Заголовок) , Колонка. Имя, Колонка. Заголовок) ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЕсли ;
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . СодержитЗначение = Истина ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . ТипЗначения = Новый ОписаниеТипов( Колонка. ТипЗначения) ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Значение = Элемент[Колонка. Имя];
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЦикла ;
Возврат ТабДок;
КонецФункции ;
Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок. Прочитать( ИмяФайла) ;
Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл1 = ТабДок. Область( 1 , ИндексКолонки) ;
Обл2 = ТабДок. Область( 2 , ИндексКолонки) ;
ИмяКолонки = СокрЛП( Обл1 . Текст) ;
ИмяКолонки = ? ( Найти( ИмяКолонки, " " ) > 0 , СтрЗаменить( ТРег( ИмяКолонки) , " " , "" ) , ИмяКолонки) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл2 = ТабДок. Область( 1 , ИндексКолонки) ;
ИмяКолонки = "К" + Формат( ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0" ) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
КонецЕсли ;
Таблица = ПреобразоватьТДвТЗ( ТабДок, СтруктураКолонок, ? ( ЕстьЗаголовок, 2 , 1 ) , 1 ) ;
Возврат Таблица;
КонецФункции ;
Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт
ТабДок = ПреобразоватьТЗвТД( ТабЗначений, Неопределено , 1 , 1 , ЕстьЗаголовок) ;
ТабДок. Записать( ИмяФайла, ТипФайлаТабличногоДокумента. MXL) ;
КонецПроцедуры ;
Еще небольшой набор функций для вывода таблицы значений в табличный документ. После формирования табличного документа, - сохраняем его в файл mxl.
Табличный документ можно сохранить a файлы следующих типов:
ANSITXT - Текстовый документ DOCX - документ MS WordHTML HTML3 HTML4 HTML5 MXL MXL7 ODS - Файл Open Office PDF - файл Acrobat Readr TXT - Текстовый документ XLS - файл Excel XLS95 - файл Excel95 XLS97 - файл Excel97 XLSX - файл Excel2010
Код 1C v 8.3
Функция ЗагрузитьТЗизФайла(ИмяФайла)
Путь = КаталогВременныхФайлов( ) + ИмяФайла;
Текст = Новый ЧтениеТекста( Путь, КодировкаТекста. UTF8) ;
стрТЗ = Текст. Прочитать( ) ;
Текст. Закрыть( ) ;
ТЗ = ЗначениеИзСтрокиВнутр( стрТЗ) ;
Возврат ТЗ;
КонецФункции
Функция ЗаписьТЗ2ТабДок(записьТЗ,НомерСтроки,ТабличныйДокумент)
НомерКолонки = 1 ;
Символ160 = Символ( 160 ) ;
Для каждого полеТЗ из ЗаписьТЗ цикл
типПоляТЗ = ТипЗнч( полеТЗ) ;
если типПоляТЗ = Тип( "Число" ) тогда
полеТЗ= Строка( полеТЗ) ;
полеТЗ= СтрЗаменить( полеТЗ, Символ160 , "" ) ;
полеТЗ= СтрЗаменить( полеТЗ, "," , "." ) ;
иначеесли типПоляТЗ = Тип( "Строка" ) тогда
иначе
полеТЗ = строка( полеТЗ) ;
КонецЕсли ;
имяОбласти = "R" + номерСтроки + "C" + НомерКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = полеТЗ;
НомерКолонки = НомерКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент)
номерСтроки= 1 ;
номКолонки= 1 ;
ТабличныйДокумент = новый ТабличныйДокумент;
Для НомКол= 0 по ТаблицаЗначений. Колонки. Количество( ) - 1 Цикл
имяКолонки= ТаблицаЗначений. Колонки[НомКол]. Имя;
имяОбласти = "R" + номерСтроки + "C" + номКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = имяКолонки;
ЖирныйШрифт = ? ( ЖирныйШрифт = Неопределено , Новый Шрифт( Ячейка. Шрифт, , , Истина ) , ЖирныйШрифт) ;
Ячейка. Шрифт = ЖирныйШрифт;
номКолонки = номКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент)
НомСтр= 1 ;
Для каждого записьТЗ из ТаблицаЗначений Цикл
НомСтр = НомСтр + 1 ;
ЗаписьТЗ2 ТабДок( записьТЗ, НомСтр, ТабличныйДокумент) ;
КонецЦикла ;
КонецФункции
Функция ТаблицаЗначений2Mxl(ТаблицаЗначений,ФайлMxl)
ТабличныйДокумент = новый ТабличныйДокумент;
НаимКолонок2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
Таблица2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
ТабличныйДокумент. Записать( ФайлMxl, ТипФайлаТабличногоДокумента. MXL) ;
ТабличныйДокумент. Показать( ФайлMxl, ФайлMxl) ;
Возврат 0 ;
КонецФункции
Функция Тест_ВыгрузитьТЗвMxl() ;
файл_мТЗИсходныеДанные = "мТЗИсходныеДанные.dat" ;
ТЗ = ЗагрузитьТЗизФайла( файл_мТЗИсходныеДанные) ;
ФайлMxl = КаталогВременныхФайлов( ) + СтрЗаменить( файл_мТЗИсходныеДанные, ".dat" , ".mxl" ) ;
ТаблицаЗначений2 Mxl( ТЗ, ФайлMxl) ;
КонецФункции
Тест_ВыгрузитьТЗвMxl( ) ;
Пример выгруженной таблицы значений в файл:
Часто при разработке какого-либо функционала в 1С мы делаем прикрепление файлов pdf.
Итак, Первым делом идет Выбор файла, далее нужно быстро просмотреть приложенный файл.
Для решения используются следующие варианты:
файл Выбирается по кнопке Выбор файла и помещается в Реквизит с типом Хранилище Значений
Код 1C v 8.х Процедура КнопкаВыбратьСканНажатие(Элемент)
Диалог = Новый ДиалогВыбораФайла( РежимДиалогаВыбораФайла. Открытие) ;
Диалог. Заголовок = "Выберите файл" ;
Диалог. ПолноеИмяФайла = "" ;
Фильтр = "Все файлы (*.*)|*.*" ;
Диалог. Фильтр = Фильтр;
Если Диалог. Выбрать( ) Тогда
Попытка
ПутьКВнешнемуФайлу = Диалог. ПолноеИмяФайла;
СканФайл = Новый ХранилищеЗначения( Новый ДвоичныеДанные( ПутьКВнешнемуФайлу) ) ;
СканНазвание = СтрЗаменить( Диалог. ПолноеИмяФайла, Диалог. Каталог, "" ) ;
Исключение
СканНазвание = "ОШИБКА!" ;
Сообщить( ОписаниеОшибки( ) ) ;
КонецПопытки ;
КонецЕсли ;
КонецПроцедуры
Для открытия используем:
1. Открытие файла в программе Adobe Acrobat Reader
для этого используйте код:
Код 1C v 8.х Процедура ОсновныеДействияФормыПечатьСканВорд(Кнопка)
ИмяМакета = СканФайл;
Если Прав(СканНазвание,3)="doc" или Прав(СканНазвание,3)="docx " Тогда
Состояние("Идет печать в Word");
УниверсальныеМеханизмы.НапечататьВнешнююФорму(Ссылка, ИмяМакета);
Иначе
ИмяКаталога = КаталогВременныхФайлов();
ИмяФайла = "vrem" + Формат(ТекущаяДата(),"ДФ=yyyyMMddhhmmss")+СокрЛП(Прав(СканНазвание,5));
ИмяФайла = РаботаСФайлами.ПолучитьИмяФайла(ИмяКаталога, ИмяФайла);
ДвоичныеДанные = ИмяМакета.Получить();
Если ДвоичныеДанные = Неопределено Тогда
Предупреждение("Не могу открыть файл, прикрепите новый внешний файл!");
Иначе
ДвоичныеДанные.Записать(ИмяФайла);
ЗапуститьПриложение(ИмяФайла);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
2. Добавляем на форму элемент ActiveX Adobe PDF Reader
для этого используйте код:
Код 1C v 8.х Процедура ОсновныеДействияФормыПечатьСканВорд(Кнопка)
ИмяМакета = СканФайл;
Если Прав(СканНазвание,3)="doc" или Прав(СканНазвание,3)="docx " Тогда
Состояние("Идет печать в Word");
УниверсальныеМеханизмы.НапечататьВнешнююФорму(Ссылка, ИмяМакета);
Иначе
ИмяКаталога = КаталогВременныхФайлов();
ИмяФайла = "vrem" + Формат(ТекущаяДата(),"ДФ=yyyyMMddhhmmss")+СокрЛП(Прав(СканНазвание,5));
ИмяФайла = РаботаСФайлами.ПолучитьИмяФайла(ИмяКаталога, ИмяФайла);
ДвоичныеДанные = ИмяМакета.Получить();
Если ДвоичныеДанные = Неопределено Тогда
Предупреждение("Не могу открыть файл, прикрепите новый внешний файл!");
Иначе
ДвоичныеДанные.Записать(ИмяФайла);
// Вывод в элемент ActiveX Adobe PDF Reader
ЭлементыФормы.PDFСканДоговор.LoadFile(ИмяФайла);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Вот так это выглядит:
В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Код 1C v 8.х
Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект( ПутьКФайлу) ;
Объект. Application. Visible = 1 ;
Word = Объект. Application;
Doc = Объект. Application. Documents( 1 ) ;
Doc. Activate( ) ;
Text = Word. S_election;
Text. WholeStory( ) ;
Text. Delete( 1 , 1 ) ;
Text. TypeText( Символы. ВК) ;
Text. TypeText( Символы. ВК) ;
Text. TypeParagraph( ) ;
Text. TypeText( "Обычный текст, набранный первую очередь" ) ;
Text. HomeKey( , 1 ) ;
Text. Font. Bold = 9999998 ;
Text. Font. Size = 14 ;
Text. Font. Name = "Verdana" ;
Text. MoveUp( , 2 ) ;
Text. HomeKey( , 1 ) ;
Text. TypeText( "Обычный текст, набранный во вторую очередь" ) ;
Text. MoveDown( , 1 ) ;
Text. EndKey( ) ;
Text. TypeParagraph( ) ;
Text. ClearFormatting( ) ;
Position = Text. Range( ) ;
Table = Doc. Tables. Add( Position, 1 , 6 , 1 , 2 ) ;
Table. Columns( 1 ) . PreferredWidth= 10 ;
Table. Columns( 2 ) . PreferredWidth= 50 ;
Table. Columns( 3 ) . PreferredWidth= 10 ;
Table. Columns( 4 ) . PreferredWidth= 10 ;
Table. Columns( 5 ) . PreferredWidth= 10 ;
Table. Columns( 6 ) . PreferredWidth= 10 ;
Row1= Table. Rows( 1 ) ;
Row1. Cells( 1 ) . Range. Text= "№ п/п" ;
Row1. Cells( 2 ) . Range. Text= "Наименование" ;
Row1. Cells( 4 ) . Range. Text= "Кол-во" ;
Row1. Cells( 3 ) . Range. Text= "Ед. изм." ;
Row1. Cells( 5 ) . Range. Text= "Цена,руб." ;
Row1. Cells( 6 ) . Range. Text= "Сумма,руб." ;
НомерСтроки = 1 ;
Для каждого СтрокаТовары Из Ссылка. Товары Цикл
Row= Table. Rows. Add( ) ;
Row. Cells( 1 ) . Range. Text= НомерСтроки;
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 2 ) . Range. Text= СтрокаТовары. Номенклатура. Наименование
+ ? ( ЗначениеЗаполнено( СтрокаТовары. ХарактеристикаНоменклатуры) ,
" (" + СтрокаТовары. ХарактеристикаНоменклатуры+ ")" , "" ) ;
Row. Cells( 4 ) . Range. Text= Строка( СтрокаТовары. Количество) ;
Row. Cells( 4 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 3 ) . Range. Text= ? ( ЗначениеЗаполнено( СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения)
, СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения. Наименование, "-" ) ;
Row. Cells( 3 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 5 ) . Range. Text= Формат( СтрокаТовары. Цена, "ЧДЦ=2" ) ;
Row. Cells( 5 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 6 ) . Range. Text= Формат( СтрокаТовары. Сумма, "ЧДЦ=2" ) ;
Row. Cells( 6 ) . Range. ParagraphFormat. Alignment = 1 ;
НомерСтроки= НомерСтроки+ 1 ;
КонецЦикла ;
Row1. Range. Font. Bold = 9999998 ;
Row1. Range. Font. Size = 14 ;
Row1. Range. Font. Name = "Verdana" ;
Row1. Range. ParagraphFormat. Alignment = 1 ;
Row = Table. Rows. Add( ) ;
Row. Range. Font. Bold = 9999998 ;
Row. Cells( 1 ) . Range. Text= "Итого:" ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
Попытка
Table. cell( НомерСтроки+ 1 , 1 ) . Merge( Table. cell( НомерСтроки+ 1 , 5 ) ) ;
Исключение
КонецПопытки ;
Попытка
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 3 ;
Row. Cells( 2 ) . Range. Text= Формат( Ссылка. Товары. Итог( "Сумма" ) , "ЧДЦ=2" ) ;
Row. Cells( 2 ) . Range. ParagraphFormat. Alignment = 1 ;
Doc. Save( ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
КонецПроцедуры
Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:\Users\NKrylov\Desktop\Тест.docx ");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;
ThisDocument = Word.Documents(1);
ThisDocument.Activate();
// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;
// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;
// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);
// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию
// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;
Bookmark = ThisDocument.Bookmarks("Закладка3");
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
Table.Rows(1).Cells(1).Range.Text = 1;
Table.Rows(1).Cells(2).Range.Text = 2;
Table.Rows(1).Cells(3).Range.Text = 3;
Table.Rows(1).Cells(4).Range.Text = 4;
Table.Rows(1).Cells(5).Range.Text = 5;
// После вывода таблицы, появится "лишняя строка", удалим ее
// в результате курсор встанет в область закладки 4
S_election.MoveDown(, 1);
S_election.Delete(1, 1);
// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)
// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.MoveUp(,4,1);
// Настроим шаблон объекта галереи списков
// Галереи списков бывают несккольких типов, 2 - нумерованные списки
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
// Формат нумератора списка - точка после символа нумерации
ListTemplate.NumberFormat = "%1.";
// стиль нумератора - арабские цифры
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
// 4 - маленькие латинские буквы.
// 2 - маленькие римские цифры.
// 58- меленькие русские буквы.
// Font = Template.Font; // можно указать форматирование текста списка
// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));
// Перейдем в конец текста
S_election.EndKey(6);
// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:\Users\NKrylov\Desktop\Новый.bmp", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...
ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Автор:
Крылов Николай Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудьте указать свои пути.
Тестировалось на Office 2007.
Некоторые переменные переименованы по стандарту Office: Text --> S_election. Doc --> ThisDocument.
Вот текст модуля:
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:\Users\NKrylov\Desktop\Тест.docx ");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;
ThisDocument = Word.Documents(1);
ThisDocument.Activate();
// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;
// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;
// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);
// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию
// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;
Bookmark = ThisDocument.Bookmarks("Закладка3");
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
Table.Rows(1).Cells(1).Range.Text = 1;
Table.Rows(1).Cells(2).Range.Text = 2;
Table.Rows(1).Cells(3).Range.Text = 3;
Table.Rows(1).Cells(4).Range.Text = 4;
Table.Rows(1).Cells(5).Range.Text = 5;
// После вывода таблицы, появится "лишняя строка", удалим ее
// в результате курсор встанет в область закладки 4
S_election.MoveDown(, 1);
S_election.Delete(1, 1);
// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)
// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.MoveUp(,4,1);
// Настроим шаблон объекта галереи списков
// Галереи списков бывают несккольких типов, 2 - нумерованные списки
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
// Формат нумератора списка - точка после символа нумерации
ListTemplate.NumberFormat = "%1.";
// стиль нумератора - арабские цифры
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
// 4 - маленькие латинские буквы.
// 2 - маленькие римские цифры.
// 58- меленькие русские буквы.
// Font = Template.Font; // можно указать форматирование текста списка
// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));
// Перейдем в конец текста
S_election.EndKey(6);
// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:\Users\NKrylov\Desktop\Новый.bmp", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...
ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Написал Nikola23 - http://infostart.ru/public/68072/