17.02.10 — 08:45
Добрый день. Стоит задача — считать таблицу из файла WORD, сравнить построчно, добавить новый столбец, записать туда значение, выделить цветом. Помогите плиз. Нало есть:
Word.Documents.Open(ИмяФайла);
Word = Новый ComОбъект(«Word.Application»);
Документ = Word.ActiveDocument ();
Таблица = Документ.Tables.Item(1);
2 — 17.02.10 — 08:50
// Устанавливаем жирный шрифт для шапки таблицы
Документ.Range( Таблица.Cell( Счетчик,!). Range.Start,
Таблица.Cell(Счетчик,4).Range.End).Font.Bold = Истина;
Для каждого Значение Из Объект[Параметр.Ключ] Цикл
Счетчик = Счетчик + 1;
// Заполняем содержимое таблицы
Попытка
Таблица.Cell(Счетчик,1).Range().InsertAfter(Значение.Имя);
Исключение
КонецПопытки;
3 — 17.02.10 — 08:58
(0)//ПРоцедура заполняет заранее созданую таблицу в Ворде. мож пригодится тебе
Процедура БольшаяКраснаяКнопкаНажатие(Элемент)
// Вставить содержимое обработчика.
АктивныйДокумент = ПолучитьМакет(«Макет1»);
WordDoc = АктивныйДокумент.Получить();
WordDoc.Application.Visible=1;
Таблица = WordDoc.Tables.Item(1);
запрос= Новый запрос();
запрос.Параметры.Вставить(«ДатаНачала»,ДатаНачала);
запрос.Параметры.Вставить(«ДатаКонца»,ДатаКонца);
запрос.Текст = «ВЫБРАТЬ
|ВсеТемы.ДатаПроведения КАК ДатаПроведения,
|ВсеТемы.ВремяПроведения КАК ВремяПроведения,
|ВсеТемы.ПредметПроведения КАК ПредметПроведения,
|ВсеТемы.ТемаЗанятия КАК ТемаЗанятия,
|ВсеТемы.ФормаПроведения КАК ФормаПроведения
| ИЗ РегистрСведений.ВсеТемы КАК ВсеТемы
|ГДЕ ДатаПроведения >= &ДатаНачала И ДатаПроведения <= &ДатаКонца
|УПОРЯДОЧИТЬ ПО ДатаПроведения «;
Результат= запрос.Выполнить().Выгрузить();
Если месяц(ЭлементыФОрмы.ДатаНачала.Значение)= месяц(ЭлементыФОрмы.ДатаКонц.Значение) Тогда
НачалоНедели = День(ЭлементыФОрмы.ДатаНачала.Значение);
Иначе НачалоНедели = ФОрмат(ЭлементыФОрмы.ДатаНачала.Значение,»ДФ=»»дд ММММ»»»);
КонецЕсли;
WordDoc.Variables.Item(«НачалоНедели»).Value=НачалоНедели;
WordDoc.Variables.Item(«КонецНедели»).Value=Формат(ЭлементыФОрмы.ДатаКонц.Значение,»ДФ=»»дд ММММ гггг ‘года’ «»»); //»ДФ=»»дд ММММ»»»
WordDoc.Variables.Item(«ДатаУтверждения»).Value=ФОрмат(((ЭлементыФОрмы.ДатаНачала.Значение)-3*60*60*24),»ДФ=»»дд ММММ гггг ‘ года’ «»») ;
WordDoc.Fields.UpDate();
Для ии = 1 По Результат.Количество()-1 Цикл
Таблица.Rows.Add(Таблица.Rows(3)); // тиражируем первую строку сколько нужно раз
КонецЦикла;
НомерСтроки = 2;
для каждого стр из Результат Цикл
ДатаПроведения = Формат(стр.ДатаПроведения, «ДФ =»»дд.ММ»»»);
НомерСтроки = НомерСтроки+1;
Таблица.Cell(НомерСтроки,1).Range().InsertAfter(Строка(ДатаПроведения));
Таблица.Cell(НомерСтроки,1).Range().Font.Size = 9;
Таблица.Cell(НомерСтроки,2).Range().InsertAfter(Строка(стр.ВРемяПроведения));
Таблица.Cell(НомерСтроки,2).Range().Font.Size = 9;
Таблица.Cell(НомерСтроки,3).Range().InsertAfter(Строка(Строка(стр.ПредметПроведения)+» «+ строка(стр.ТемаЗанятия)));
Таблица.Cell(НомерСтроки,3).Range().Font.Size = 9;
присоед = Таблица.Cell(НомерСтроки, 1);
Если присоед = Таблица.Cell(НомерСтроки-1, 1) тогда
Таблица.Cell(НомерСтроки-1, 1).Merge(присоед);
Таблица.Cell(НомерСтроки,1).Range().InsertAfter(Строка(ДатаПроведения));
Конецесли;
WordDoc= 0;
КонецЦикла;
КонецПроцедуры
никмейн 57 / 39 / 19 Регистрация: 24.10.2016 Сообщений: 970 |
||||
1 |
||||
29.04.2021, 19:21. Показов 8144. Ответов 23 Метки нет (Все метки)
Приветствую еще раз, задача такова: есть Документ «УчетПассажиров», у него есть ТЧ «СписокПассажиров»(реквизиты ТЧ: ФИО,ДатаРождения»), надо из ворда загрузить данные из таблицы в ТЧ документа, создал внешнюю обработку, записал алгоритм, Кликните здесь для просмотра всего текста
Миниатюры
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
29.04.2021, 19:21 |
23 |
1529 / 967 / 369 Регистрация: 31.05.2012 Сообщений: 3,393 |
|
29.04.2021, 21:14 |
2 |
У документа word-а есть объект Tables со всеми таблицами, вытащив нужный объект Table методом Tables.Item дергаем из ячеек данные. Ознакомиться можно здесь https://docs.microsoft.com/ru-… ject-model
1 |
57 / 39 / 19 Регистрация: 24.10.2016 Сообщений: 970 |
|
29.04.2021, 22:05 [ТС] |
3 |
Аватар, а скажите из pdf в 1с можно загрузить данные? И если да, то скиньте инфу как это делается ,в инете чето не нашел
0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
30.04.2021, 03:53 |
4 |
а скажите из pdf в 1с можно загрузить данные? И если да, то скиньте инфу как это делается ,в инете чето не нашел Я делал через внешнюю компоненту, хотя где-то читал, что последнии версии платформы умеют читать PDF никмейн, Какая версия платформы?
0 |
1155 / 702 / 203 Регистрация: 22.04.2013 Сообщений: 5,219 Записей в блоге: 1 |
|
30.04.2021, 07:00 |
5 |
ЧтениеPDF (PDFReader) на тебе инфу скинул
0 |
57 / 39 / 19 Регистрация: 24.10.2016 Сообщений: 970 |
|
30.04.2021, 11:08 [ТС] |
6 |
Dethmontt,
Какая версия платформы? 8.3.18.1128 Добавлено через 1 час 18 минут
Я делал через внешнюю компоненту Вы через ComОбъект делали?
0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
30.04.2021, 15:34 |
7 |
Вы через ComОбъект делали? Нет, натвиная компонента Добавлено через 47 секунд
ЧтениеPDF (PDFReader)
0 |
никмейн 57 / 39 / 19 Регистрация: 24.10.2016 Сообщений: 970 |
||||
30.04.2021, 21:39 [ТС] |
8 |
|||
Аватар, написал такой код, но у меня он ругается на метод Cells, чт не так я делаю? Кликните здесь для просмотра всего текста
0 |
Аватар 1529 / 967 / 369 Регистрация: 31.05.2012 Сообщений: 3,393 |
||||
30.04.2021, 22:00 |
9 |
|||
там и символы перевода каретки и строки тоже вроде прочитаются, не помню
0 |
57 / 39 / 19 Регистрация: 24.10.2016 Сообщений: 970 |
|
01.05.2021, 13:20 [ТС] |
10 |
Аватар, Теперь на сell ругается
0 |
1832 / 1249 / 446 Регистрация: 16.01.2015 Сообщений: 5,460 |
|
01.05.2021, 18:21 |
11 |
никмейн,
Значение = Row.Сells(СтолбецWord).Range.Text Здесь все верно. Скоре всего «С» в «Сells» из русской раскладки. Перейди в англ клаву и напечатай, или поставь точку останова и из Вычислить выражение сделай этот код.
0 |
1155 / 702 / 203 Регистрация: 22.04.2013 Сообщений: 5,219 Записей в блоге: 1 |
|
01.05.2021, 18:29 |
12 |
как именно ругается на метод сел покажи, да?
0 |
57 / 39 / 19 Регистрация: 24.10.2016 Сообщений: 970 |
|
01.05.2021, 18:55 [ТС] |
13 |
polax, Да, действительно, написал с английской раскладной, ошибка исчезла спасибо, но возникла новая ошибка Миниатюры
0 |
1832 / 1249 / 446 Регистрация: 16.01.2015 Сообщений: 5,460 |
|
01.05.2021, 19:00 |
14 |
никмейн, Текста хмл в приведенном коде не вижу — это раз Добавлено через 1 минуту
1 |
никмейн 57 / 39 / 19 Регистрация: 24.10.2016 Сообщений: 970 |
||||
02.05.2021, 09:35 [ТС] |
15 |
|||
но лучше используй то что предлагает IDE
а дальше какой метод использовать ПоказатьВложения()?
0 |
Модератор 3711 / 2907 / 573 Регистрация: 10.03.2011 Сообщений: 11,447 Записей в блоге: 1 |
|
03.05.2021, 04:28 |
16 |
а дальше какой метод использовать я даже не знаю, у меня 8.3.14
0 |
57 / 39 / 19 Регистрация: 24.10.2016 Сообщений: 970 |
|
04.05.2021, 00:06 [ТС] |
17 |
Кто нибудь может подсказать?
0 |
1832 / 1249 / 446 Регистрация: 16.01.2015 Сообщений: 5,460 |
|
04.05.2021, 16:11 |
18 |
никмейн, Даже на ИТС все как-то невнятно описано. Типа взяли и процитировали СП. И примеров не найти в интернете. Однако есть примеры с чтением и разбором ПДФ внешними утилитами. Например, программная конвертация в текст и потом чтение текста. Есть и другие способы. Но, на мой взгляд, оптимальный вариант, способ обращения к поставщику, чтобы свои долбанные прайсы присылал в формате Эксель )))).
0 |
Аватар 1529 / 967 / 369 Регистрация: 31.05.2012 Сообщений: 3,393 |
||||
04.05.2021, 16:38 |
19 |
|||
По поводу ЧтениеPDF молчок в сети. А точно ЧтениеPDF? Больше в сети про это:
Еще установить нужно Adobe PDF IFilter v6.0
0 |
57 / 39 / 19 Регистрация: 24.10.2016 Сообщений: 970 |
|
04.05.2021, 22:14 [ТС] |
20 |
Аватар, да ЧтениеPDF Добавлено через 2 часа 45 минут Добавлено через 1 минуту
0 |
Оглавление (нажмите, чтобы раскрыть)
Вставка таблицы в документ Word
Пример вставки таблицы в Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //определяем место вставки Range = Doc.Range(0); //создаем таблицу 2х2 Table = Doc.Tables.Add(Range, 2, 2); Table.Style = "Сетка таблицы"; //определяем ширину столбцов Table.columns(1).Width = 20; Table.columns(2).Width = 50; //заполняем первую строку Table.Cell(1, 1).Select(); Word.Selection.Font.Bold = Истина; Word.Selection.TypeText("1"); Table.Cell(1, 2).Select(); Word.Selection.TypeText("Один"); //заполняем вторую строку Table.Cell(2, 1).Select(); Word.Selection.Font.Bold = Истина; Word.Selection.TypeText("2"); Table.Cell(2, 2).Select(); Word.Selection.TypeText("Два"); //показываем документ на экране Word.Visible = Истина;
Вставка текста в документ Word
Пример вставки текста в документ Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //добавляем пустой документ Doc = Word.Documents.Add(); //добавляем 10 параграфов Для Н = 1 По 10 Цикл Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Параграф №" + Н); КонецЦикла; //вставляем текст в начало докуменета Range = Doc.Range(0); Range.InsertBefore("Начало!" + Символы.ПС); //вставляем текст после 16-го символа Range = Doc.Range(16, 16); Range.InsertAfter("[Вставка]"); //показываем документ на экране Word.Visible = Истина;
Выделение текста
Пример выделения текста в документе Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Выделяемый текст"); //выделяем первое слово Doc.Range(0, 10).Select(); //копируем выделение в буфер обмена Word.Selection.Copy(); //меняем размер шрифта и т.д. Word.Selection.Font.Size = 16; //показываем документ на экране Word.Visible = Истина;
Выравнивание текста
Пример выравнивания текста в документе Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Заголовок"); Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Выравниваем этот текст"); //0 - по левому краю //1 - по центру //2 - по правому краю //3 - по ширине //текущей параграф по центру Par.Alignment = 1; //заголовок по правому краю Doc.Paragraphs(1).Alignment = 2; //показываем документ на экране Word.Visible = Истина;
Замена текста в документе Word
Пример замены текста в документе Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Сбербанк ИНН/КПП: [ИНН]/[КПП]"); //заменяем ИНН Word.Selection.Find.Text = "[ИНН]"; Word.Selection.Find.Replacement.Text = "7707083893"; Word.Selection.Find.Execute(, , , , , , , , , , 2); //заменяем КПП Word.Selection.Find.Text = "[КПП]"; Word.Selection.Find.Replacement.Text = "773601001"; Word.Selection.Find.Execute(, , , , , , , , , , 2); //показываем документ на экране Word.Visible = Истина;
Открытие документа Word
Пример открытия документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //открываем документ C:tmp1.docx Word.Documents.Add("C:tmp1.docx"); //показываем документ на экране Word.Visible = Истина;
Преобразование в таблицу
Пример преобразования документа Word в таблицу из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Таблица умножения:"); //формируем строку с разделителями Сторока = ""; Для Н1 = 1 По 9 Цикл Для Н2 = 1 По 9 Цикл Сторока = Сторока + Н1 * Н2 + ?( Н2 = 9, "", Символы.Таб); КонецЦикла; Сторока = Сторока + Символы.ПС; КонецЦикла; Par.Range.InsertAfter(Сторока); //переходим на строчку вниз Word.Selection.MoveDown(5, 1, 0); //выделяем таблицу Word.Selection.MoveDown(5, 9, 1); //конвертируем текст в таблицу Word.Selection.ConvertToTable(1, 9, 9, 0); Word.Selection.Tables(1).Style = "Сетка таблицы"; //показываем документ на экране Word.Visible = Истина;
Создание документа Word
Пример создания документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //показываем документ на экране Word.Visible = Истина;
Сохранение документа
Пример сохранения документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Сохраняемый текст"); //сохраняем документ в файл Doc.SaveAs("C:tmp2.docx"); //закрываем документ Doc.Close(); Word.Quit();
Удаление текста из документа Word
Пример удаления текста из документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Некоторый текст"); //удаляем слово некоторый и пробел Range = Doc.Range(0, 10); Range.Text = ""; //показываем документ на экране Word.Visible = Истина;
Форматирование текста в документе Word
Пример форматирования текста в документе Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //создаем новый документ Doc = Word.Documents.Add(); //добавляем параграф Par = Doc.Paragraphs.Add(); Par.Range.InsertBefore("Форматируем этот текст"); //меняем размер шрифта Par.Range.Font.Size = 15; //меняем название шрифта Par.Range.Font.Name = "Verdana"; //выбираем слово "этот" Range = Doc.Range(12, 16); //меняем шрифт на ширный Range.Font.Bold = Истина; //курсив Range.Font.Italic = Истина; //подчеркнутый Range.Font.Underline = Истина; //красный Range.Font.Color = 13311; //показываем документ на экране Word.Visible = Истина;
Чтение текста документа Word
Пример чтения текста из документа Word из 1С
//создаем объект для работы с Word Word = Новый COMОбъект("Word.Application"); //открываем документ C:tmp1.docx Doc = Word.Documents.Open("C:tmp1.docx"); //читаем весь текст документа Text = doc.Content.Text; Сообщить(Text); //читаем с 6-го по 10-й символ From = 6; To = 10; Range = Doc.Range(From, To); Text = Range.Text; Сообщить(Text); //закрыть документ Doc.Close(); Word.Quit();
Функция ВывестиДокументВордВМоксель(ИмяФайла)
Попытка
// Для пересчётов использовать вхВорд.CentimetersToPoints(ЧислоСМ) и вхВорд.PointsToCentimeters(ЧислоПунктов)
вСантиметр=6.25; // в средних символах шрифта
//(при необходимости пересчитывать по вДиапазон.CharacterWidth — ширина символов, константа WdCharacterWidth
вШиринаСтраницы=75; // эмпирически, довести до ума с учётом
//сообщить(«стран ширина «+стран.PageWidth+», высота «+стран.PageHeight); // в пунктах, работает
// Типовые настройки документа Ворд:
// 1.25 до номера (отступ первой строки) и 1.89 табуляция (до основного текста)
// Размеры листа А4 в сантиметрах: 21х29.7
вхВорд=Новый COMОбъект(«Word.Application»);
вПодтверждатьПреобразования=Истина;
вТолькоЧтение=Истина;
вДокумент=вхВорд.Documents.Open(ИмяФайла, вПодтверждатьПреобразования, вТолькоЧтение);
#Область Проверки
вСтраница=вДокумент.PageSetup;
Если вСтраница.TextColumns.Count>1 Тогда
Сообщить(«Текущая версия не обрабатывает многоколонные документы!»);
вДокумент.Close(Ложь); // без сохранения
вхВорд.Quit(0);
вхВорд=«»;
Возврат Неопределено;
КонецЕсли;
вШиринаСтраницыВорда=Окр(вхВорд.PointsToCentimeters(вСтраница.PageWidth),2);
вВысотаСтраницыВорда=Окр(вхВорд.PointsToCentimeters(вСтраница.PageHeight),2);
Если НЕ ((20<=вШиринаСтраницыВорда И вШиринаСтраницыВорда<=22) И
(28<=вВысотаСтраницыВорда И вВысотаСтраницыВорда<=30)) Тогда
Сообщить(«Текущая версия не обрабатывает размеры страницы, отличающиеся от А4!»);
вДокумент.Close(Ложь); // без сохранения
вхВорд.Quit(0);
вхВорд=«»;
Возврат Неопределено;
КонецЕсли;
#КонецОбласти
// подготовка вывода таблиц
мКомТаблиц=Новый Массив;
Для Каждого вхТаблица Из вДокумент.Tables Цикл
мКомТаблиц.Добавить(Новый Структура(«Начало,Конец,Таблица»,вхТаблица.Range.Start,вхТаблица.Range.End,вхТаблица));
КонецЦикла;
#Область ПодготовкаВыводаНумерованныхСписков
// можно, конечно, рСписок.ConvertNumbersToText(ТипНомера)
//- но это не лучший выход, и это изменение документа
СоотПараграфовСписков=Новый Соответствие;
// свойство вДокумент.Lists.Count ситуационно-зависимое, не применять!
Для Каждого рСписок Из вДокумент.Lists Цикл
//ОбработкаПрерыванияПользователя();
// рЛист.CountNumberedItems();
Для Каждого вПараграфСписка Из рСписок.ListParagraphs Цикл
//ОбработкаПрерыванияПользователя();
рФорматСписка=вПараграфСписка.Range.ListFormat;
рТипСписка=рФорматСписка.ListType; // WdListType
Если рТипСписка=0 Или рТипСписка=2 Или рТипСписка=6 Тогда
// ненумерованные и bullet игнорируем
Иначе
// заниматься иерархией с проверкой погружения (рФорматСписка.ListLevelNumber) не будем,
// нам достаточно проверить так:
вПредставлениеПункта=СокрЛП(рФорматСписка.ListString);
// выравнивание смотрим по первой позиции уровней (хотя можно перебирать,
// смотреть по позиции или по NumberFormat)
Попытка вВыравнивание=рФорматСписка.ListTemplate.ListLevels.Item(0).Alignment
Исключение вВыравнивание=0 КонецПопытки;
// из первого уровня также можно брать NumberPosition — отступ,если будет надо;
//он в пунктах, поэтому тоже может потребоваться пересчёт!
Если СтрРазделить(вПредставлениеПункта,«.»,Ложь).Найти(рФорматСписка.ListValue)=0 Тогда
Сообщить(«Внимание! Нарушение нумерации списка для «+вПредставлениеПункта+«!»);
КонецЕсли;
// фиксируем для дальнейшего вывода
СоотПараграфовСписков.Вставить(вПараграфСписка.Range.Start,
Новый Структура(«Номер,Выравнивание», вПредставлениеПункта, вВыравнивание));
КонецЕсли;
КонецЦикла;
КонецЦикла;
#КонецОбласти
// FitTextWidth для диапазонов НЕ используем, в т.ч. для вДокумент.Range()
тд=Новый ТабличныйДокумент;
#Область ПодготовкаТабДокумента
// устанавливаем ширины рабочих колонок А4
вСтолбец=1;
Пока Истина Цикл
тд.Область(1,вСтолбец,1,вСтолбец).ШиринаКолонки=Окр(вСантиметр/4,2);
вСтолбец=вСтолбец+1;
Если тд.ШиринаТаблицы>вШиринаСтраницы Тогда
Прервать;
КонецЕсли;
КонецЦикла;
#КонецОбласти
#Область ВыводОсновныхДанных
вСтрока=1;
вПравыйКрайнийСтолбец=тд.ШиринаТаблицы;
вИдетТаблица=Ложь;
Для Каждого вПараграф Из вДокумент.Paragraphs Цикл
//ОбработкаПрерыванияПользователя();
// к сожалению, вПараграф.ListNumberOriginal использовать ненадёнжно
вДиапазон=вПараграф.Range;
вТекстДиапазона=вДиапазон.Text;
вНачалоДиапазона=вДиапазон.Start;
вКонецДиапазона=вДиапазон.End;
#Область ВыводПозицииНумерованногоСписка
// использовать вДиапазон.ListFormat.ListLevelNumber и
// вДиапазон.ListFormat.ListValue не рекомендуется
вПараграфСписка=СоотПараграфовСписков.Получить(вНачалоДиапазона);
Если вПараграфСписка=Неопределено Тогда
вПредставлениеПункта=«»;
вВыравнивание=0;
Иначе
вПредставлениеПункта=СокрЛП(вПараграфСписка.Номер);
вВыравнивание=вПараграфСписка.Выравнивание;
КонецЕсли;
Если ПустаяСтрока(вПредставлениеПункта) Тогда
// нумерации списка нет
вГраницаОбластиПараграфа=1;
Иначе // надо выводить № пункта списка
вОбластьНомера=тд.Область(вСтрока,1,вСтрока,4);
вОбластьНомера.Объединить();
вОбластьНомера.Текст=вПредставлениеПункта;
// или вДиапазон.ListStyle.Font, если они разные:
вОбластьНомера.Шрифт=ПостроительШрифта(вДиапазон.Font);
вОбластьНомера.ГоризонтальноеПоложение=ПолучениеВыравнивания(вВыравнивание);
вОбластьНомера.ВертикальноеПоложение=ВертикальноеПоложение.Верх; // по умолчанию
вГраницаОбластиПараграфа=5;
КонецЕсли;
#КонецОбласти
вхТаблица=Неопределено;
Для Каждого знч Из мКомТаблиц Цикл
Если знч.Начало<=вНачалоДиапазона И вНачалоДиапазона<=знч.Конец
И знч.Начало<=вКонецДиапазона И вКонецДиапазона<=знч.Конец
Тогда // можно было бы вДиапазон.InRange(вхТаблица.Range), но оно медленнее
вхТаблица=знч.Таблица; Прервать;
КонецЕсли;
КонецЦикла;
Если вхТаблица=Неопределено Тогда
вИдетТаблица=Ложь;
#Область ВыводОбычногоАбзаца
// для параграфа и Диапазон.ParagraphFormat, при необходимости:
// вПараграф.FirstLineIndent — Возвращает или устанавливает значение
// в пунктах для первой линии или отступа.
// вПараграф.LeftIndent — Отступ слева в пунктах.
// вПараграф.RightIndent — Отступ справа в пунктах.
// вПараграф.LineSpacing — Междустрочный интервал.
// вПараграф.PageSetup.PageWidth аналогично ширине документа в целом,
// можно не заморачиваться
вОбластьПараграфа=тд.Область(вСтрока,вГраницаОбластиПараграфа,вСтрока,вПравыйКрайнийСтолбец);
вОбластьПараграфа.Объединить();
вОбластьПараграфа.Текст=вТекстДиапазона;
вОбластьПараграфа.Шрифт=ПостроительШрифта(вДиапазон.Font); // а не вПараграф.Style.Font!
// или лучше вДиапазон.ParagraphFormat.Alignment?:
вОбластьПараграфа.ГоризонтальноеПоложение=ПолучениеВыравнивания(вПараграф.Alignment);
вОбластьПараграфа.ВертикальноеПоложение=ВертикальноеПоложение.Верх; // по умолчанию
вОбластьПараграфа.РазмещениеТекста=ТипРазмещенияТекстаТабличногоДокумента.Переносить; // по умолчанию
#КонецОбласти
вСтрока=вСтрока+1;
Иначе
Если не вИдетТаблица Тогда // выводим таблицу,
// а далее пропускаем все входящие в неё диапазоны, и идём до её конца
ВывестиТаблицу(вхВорд, вхТаблица, тд, вСтрока);
КонецЕсли;
вИдетТаблица=Истина;
Продолжить; // вСтрока уже «промотана» до нужной позиции пост-таблицы
КонецЕсли;
КонецЦикла;
#КонецОбласти
вДокумент.Close(Ложь); // без сохранения
вхВорд.Quit(0);
вхВорд=«»;
Возврат тд;
Исключение
Сообщить(«Ошибка: «+ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
-
Здравствуйте.
1С:Предприятие 8.3 (8.3.13.1513)
Управление производственным предприятием, редакция 1.3
Толстый клиент. Обычное приложение.Читаю таблицу из ворда
WordApplication = Новый COMОбъект("Word.Application"); WordApplication.Documents.Open(ИмяФайла); Документ = WordApplication.ActiveDocument(); Таблица = Документ.Tables.Item(1);
Далее хочу получить значение в ячейке. Вычислить выражение показывает такую картину
В самом ворде какой-то служебный символ в каждой ячейке
Не могу его удалить в 1С.
Как это сделать?
СокрЛП — не помогает
Думаю, что нашел в Unicode код символа, попробовал такСтрЗаменить(ПрочтенноеЗначение,Символ(164),"")
тоже не помогло.
Последнее редактирование: 23 янв 2019 -
Вот этого не хотелось бы делать, думаю есть более «верный» метод
Значение = Таблица.cell(1,2).Range().Text; Значение = Лев(Значение, Стрдлина(Значение)-2);
— Объединение сообщений, 23 янв 2019 —
Или может быть я не правильно получаю значение?
Последнее редактирование: 23 янв 2019 -
Offline
TrasserZero
Опытный в 1С- Регистрация:
- 26 окт 2016
- Сообщения:
- 69
- Симпатии:
- 4
- Баллы:
- 29
емнип если СтрЗаменить не работает — не тот код. Там же он не один, есть еще кодировка — Юникод, вин1251 и тп..
// код первого символа в строке
КодПервогоСимволаФамилии = КодСимвола(«Грозный»);
Сообщить(КодПервогоСимволаФамилии); // 1043, потому что Unicodeпопробуйте вывести код этого символа..типа
// код третьего символа в строке
Сообщить(КодСимвола(«ABC», 3)); //67
Содержание:
1. Для чего нужна работа в 1С 8.3 с Word?
2. Как работать программно с документами MS WORD (расширениями .doc и .docx)?
3. Заполнение в 1С 8 таблицы Word
1. Для чего нужна работа в 1С 8.3 с Word?
В этой статье обсудим, как в 1С можно работать с форматом текста Word: создание, редактирование, копирование документов MS Word. Самый распространенный вариант использования программного заполнения документов MS Word – это заполнение шаблонов в ворде. То есть после создания шаблона word, пользователь помечает параметры квадратными скобками [] (это наиболее частый вариант экранирования параметров) или знаками больше меньше <>, после чего при нажатии кнопки «Печать Word» или «Сохранить Word» открывается заполненный документ MS Word. Большинству шаблонов, конечно, подойдут и табличные документы, но лично мною было создано множество шаблонов, которые требовали форматирования текстового документа именно в MS Word (чаще из-за удобства редактирования шаблона MS Word для пользователя). Это были договора, сертификаты, письма и различные заявления. Все они сохранялись в формат текста Word и в дальнейшем отправлялись по почте или уходили на печать.
2. Как работать программно с документами MS WORD (расширениями .doc и .docx)?
В дополнение к вступлению скажу, что хранение самих шаблонов MS Word мы в данной статье рассматривать не будем. Лично я использовал и справочники и регистры сведений (хранение в реквизите с типом ХранилищеЗначения), макеты с типом двоичные данные, аналог хранения файлов в базе данных. И были случаи использования указанного пути к каталогу с шаблонами, наподобие хранения файлов в томах на диске. Выбор за вами. В статье мы рассмотрим конкретно программный принцип работы с MS Word.
Рис. 1 Пример оформления документа word, который будет использован как шаблон
Получаем шаблон Word, например, из макета и сохраняем его во временный файл Word.
Рис. 2 Сохранение временного файла Word
Создаем Com-объект и сам документ Word, передавая в метод Add путь к ранее сохраненному шаблону.
Рис. 3 Программное создание COM-объекта и документа Word
Для заполнения параметров я использую структуру (или соответствие), ключ и значение. Имя ключа – это параметр замены, а значение – то, на которое меняем экранированный параметр.
В итоге параметры заполнения (структуру) мы размещаем где удобно, получаем ее и заполняем уже созданный документ MS Word.
Рис. 4 Определение параметров заполнения
С методом Find. Execute (Word) лучше всего ознакомится отдельно на официальном сайте Microsoft. Там же можно посмотреть описание и других методов, которые могут пригодится.
После замены разворачиваем окно и делаем его активным (то есть показываем пользователю заполненный шаблон MS word).
Рис. 5 Активация окна Word
И это – весь процесс заполнения шаблона 1С Word! Да, это так просто! Однако на моей практике встречались случаи, когда в шаблоне необходимо было заполнить табличную часть, например, приложение к договору со спецификацией. Здесь необходим отдельный блок кода и особенный шаблон.
3. Заполнение таблиц в программе Word
В шаблоне создаем одну строку с нужным форматированием. Получаем таблицу или выборку со значениями строк для заполнения их в документе MS Word. Заполнение таблицы в программе Word происходит по номеру строки и колонки, то есть мы точно должны знать нумерацию колонок (но можно подумать и о другом заполнении). Итак, получаем таблицу word по номеру и заполняем значениями.
Рис. 6 Заполнение таблицы в Word
В итоге скажу, что работа с Microsoft Word может быть на очень высоком уровне, но для этого необходимо изучить документацию от Microsoft по Word. И тогда в ворде из 1С можно будет творить настоящие чудеса (как собственно и в Excel)!
Специалист компании «Кодерлайн»
Вадим Хоменко
В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
// "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.
// "Ссылка" - ДокументСсылка (в моем случае - счет).
Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;
Word = Объект.Application;
Doc = Объект.Application.Documents(1);
Doc.Activate();
// Готовим переменную в которой будет содержимое нашего документа
// (текст, таблицы и проч).
Text = Word.S_election;
// Очистим документ
// Ctrl-A
Text.WholeStory();
// Del
Text.Delete(1, 1);
// Двигаемся на 3 строки ниже. Документ пустой, поэтому добавляем
// строки "Переводами коретки"
Text.TypeText(Символы.ВК);
Text.TypeText(Символы.ВК);
Text.TypeParagraph(); // другой вариант того же действия
// Выводим текст.
Text.TypeText("Обычный текст, набранный первую очередь");
// Курсор в конце строки
// Эмулируем нажатие Shift+Home - выделяем строку
Text.HomeKey(, 1);
// Форматирование выделенной строки
Text.Font.Bold = 9999998;
Text.Font.Size = 14;
Text.Font.Name = "Verdana";
// Сдвигаем курсор. Сдвинуть курсор по строкам возможно, только,
// если эти строки уже содержат текст, иначе ничего не произойдет.
Text.MoveUp(,2); // вверх на 2 строки
//Word.S_election.MoveDown(,числострок); // вниз
//Word.S_election.MoveLeft(,числострок); // влево
//Word.S_election.MoveRight(,числострок);// вправо
// Добавление текста. Текст выводится начиная с текщей позиции
// курсора.
Text.HomeKey(, 1);
Text.TypeText("Обычный текст, набранный во вторую очередь");
Text.MoveDown(,1); // вниз на 2 строки
Text.EndKey(); // в конец строки
Text.TypeParagraph(); // и в начало следующей строки
// Очищаем форматирование
Text.ClearFormatting();
// Добавляем таблицу.
// Получаем текущую позицию курсора
Position = Text.Range();
// Параметры: Позиция, число строк, число колонок,
// последние 2 параметра отвечают за автоподбор высоты и отображение
// границ таблицы
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;
// В качестве текста можно передать только значение "простого" формата
// все агрегатные объекты, переданные как текст, что нормально для платформы 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’а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.
Процедура ВыполнитьОбработку() Экспорт
Попытка
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:UsersNKrylovDesktopТест.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:UsersNKrylovDesktopНовый.bmp", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...
ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры