Проверка правописания и орфографии Код 1C v 8.х ТекстДляПроверки = "Данный текст садержит как минемум три ошипки !";
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Создадим объект MS Word, он должен быть установлен
Попытка
Word = Новый COMОбъект("Word.Application");
Исключение
Предупреждение("Microsoft Word не установлен!",,"Ошибка!");
Возврат;
КонецПопытки;
НетОшибок = Word.CheckSpelling(ТекстДляПроверки);
Если НетОшибок Тогда // Все правильно
Сообщить("Нет ошибок");
Иначе // текст содержит ошибки. Проверим каждое слово и выведем ошибочные.
Док = Word.Documents.Add(); // Создадим новый документ
Область = Док.Range(0,0); // Получим пустую область в начале документа
Область.I_nsertBefore(ТекстДляПроверки); // Добавим в документ текст
Для каждого Слово Из Область.Words Цикл
СловоДляПроверки = СокрЛП(Слово.Text);
НетОшибок = Word.CheckSpelling(СловоДляПроверки);
Если НЕ НетОшибок Тогда // Слово ошибочно
// покажем возможные замены неправильного слова
СтрокаВариантов = "";
// Получим варианты правописания
Варианты = Слово.GetSpellingSuggestions( ,1, ,0);
Для каждого Вариант Из Варианты Цикл
СтрокаВариантов = СтрокаВариантов + ", " + Вариант.Name;
КонецЦикла;
СтрокаВариантов = ". Варианты замены: " + Сред(СтрокаВариантов, 2);
Сообщить("Ошибка в слове: " + СловоДляПроверки + СтрокаВариантов);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Док.Close(0,,); // закроем документ без сохранения wdDoNotSave Changes
Word.Quit(); // закроем Word
КонецПроцедуры
Еще посмотрите ActiveX-компоненту, которая проверяет правописание текста.
Основана на технологии OpenOffice MySpell. Не требует установленного офиса.
В комплекте словари для 10 языков, включая русский (с "ё").
Автор: dushelov Категория:
Полезные, Универсальные Функции Пример построения в Word нумерованного списка, закладок, вставки картинки, настройки ее параметров. Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего 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/ Категория:
Работа с Microsoft Office и OpenOffice Создание документа Word без использования макетов и пример создания таблицы и её оформление. Кроме прочего в статье присутствует пример создания таблицы с любым количеством колонок и столбцов. Несколько строк с форматированием текста и таблицы. Создание "объединенных" ячеек.
В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Исп. переменные: "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.
"Ссылка" - ДокументСсылка (в моем случае - счет).
Вот текст модуля:
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = Получить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();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Написал Nikola23 - http://infostart.ru/public/67727/ Категория:
Работа с Microsoft Office и OpenOffice Установка полей и масштаба документа при сохранении из 1С MS Excel
Код 1C v 8.х Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("ВНИМАНИЕ! TOpenOffice не установлен или недостаточно прав доступа!
| - " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
ТабДокумент = ПечатьЦенника(ВидЦенника);
ИмяФайла = ПутьДляСохранения+"\"+ТабДокумент.ИспользуемоеИмяФайла+".xls";
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
МакетОформления = Неопределено;
// Откроем табличный документ
Excel.Workbooks.Open(ИмяФайла);
КнигаExcel = Excel.Workbooks.Item(Excel.Workbooks.Count);
ЛистExcel = КнигаExcel.WorkSheets.Item(1);
КнигаExcel.Activate();
ЛистExcel.Activate();
//Установка полей
//Значение - points. Придется делать пересчет (100 points = 3.8 inches)
ЛистExcel.PageSetup.LeftMargin = 28;
ЛистExcel.PageSetup.RightMargin = 28;
ЛистExcel.PageSetup.TopMargin = 25;
ЛистExcel.PageSetup.BottomMargin = 25;
//Установка ориентации
Если ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт Тогда
ЛистExcel.PageSetup.Orientation = 2;
Иначе
ЛистExcel.PageSetup.Orientation = 1;
КонецЕсли;
//Установка масштаба печати
ЛистExcel.PageSetup.Zoom = ТабДокумент.МасштабПечати;
//Сохранение в Мои документы
КнигаExcel.Save ();
//Покажем книгу на экран
Excel.Visible = 1;
//Отключаем COM - соединение
Excel.Quit();
OpenOffice Calc
Код 1C v 8.х Попытка
СервисМанагер = Новый COMОбъект("Com.Sun.Star.ServiceManager");
Исключение
Сообщить("Не могу создать объект Open Office!
| - " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
ТабДокумент = ПечатьЦенника(ВидЦенника);
ИмяФайла = ПутьДляСохранения+"\"+ТабДокумент.ИспользуемоеИмяФайла+".xls";
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
МакетОформления = Неопределено;
// Откроем табличный документ
Скрипт = новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.eval("Massiv=new Array()");
Массив = Скрипт.eval("Massiv");
Скрипт.AddObject("СервисМанагер",СервисМанагер);
Скрипт.eval("Massiv[0]=СервисМанагер.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
Скрипт.eval("Massiv[0].Name='Hidden'");
Скрипт.eval("Massiv[0].Value=true");
Стол = СервисМанагер.createInstance("com.sun.star.frame.Desktop");
ВремПуть = СтрЗаменить(ПутьДляСохранения, "\", "/");
ВремПуть = СтрЗаменить(ВремПуть, " ", "%20");
УРЛ = "file:///"+ВремПуть+"/"+ТабДокумент.ИспользуемоеИмяФайла+".xls";
Документ = Стол.LoadComponentFromURL(УРЛ,"_blank",0,Массив);
Документ.lockControllers();
Документ.addActionLock();
Листы=Документ.getSheets();
ЛистДанные=Листы.getByIndex(0);
СтилиСтраницы=Документ.StyleFamilies.getByName("PageStyles");
ПараметрыСтраницы=СтилиСтраницы.getByName(ЛистДанные.PageStyle);
//Установка полей
ПараметрыСтраницы.LeftMargin = ТабДокумент.ПолеСлева * 100;
ПараметрыСтраницы.RightMargin = ТабДокумент.ПолеСправа * 100;
ПараметрыСтраницы.TopMargin = ТабДокумент.ПолеСверху * 100;
ПараметрыСтраницы.BottomMargin = ТабДокумент.ПолеСнизу * 100;
//Установка ориентации
Если ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт Тогда
ПараметрыСтраницы.IsLandscape = Истина;
ПараметрыСтраницы.Width = 29700;
ПараметрыСтраницы.Height = 21000;
Иначе
ПараметрыСтраницы.IsLandscape = Ложь;
ПараметрыСтраницы.Width = 21000;
ПараметрыСтраницы.Height = 29700;
КонецЕсли;
//Установка масштаба печати
ПараметрыСтраницы.PageScale = ТабДокумент.МасштабПечати;
//Сохранение документа
Документ.unlockControllers();
Документ.removeActionLock();
Документ.store();
Документ.Close(Истина);
//Отключаем COM - соединение
Стол.terminate();
Категория:
Работа с Microsoft Office и OpenOffice Как прочитать RTF файл и сохранить его в обычный TXT файл? Код 1C v 8.х // Создание объекта MS Word
Word = Новый COMОбъект("Word.Application");
// Установка видимости приложения
Word.Visible = Ложь;
// Добавление нового документа в приложение
Word.Documents.Open("C:\111.rtf",0,0);
// Получение активного документа
Word.Documents.Item(1).Activate();
// Сохранение документа
Word.ActiveDocument.Save As("C:\111.txt", 2,,,,,,,,,,1251);
// Закрытие документа
Word.ActiveDocument.Close();
// Закрытие приложения
Word.Quit();
Категория:
Работа с Microsoft Office и OpenOffice Как сформировать новый документ на основании файла, шаблона Microsoft Office Word и OpenOffice? Код 1C v 8.х Перем СсылкаНаДокумент;
Процедура СформироватбФайл_MS_Word_И_OpenOffice(Кнопка)
ДокументСсылка = СсылкаНаДокумент;
ИмяФайла = ПолучитьИмяВременногоФайла();
// Теперь формируем файл из MS Wordа
Попытка
MSWord = новый COMОбъект("Word.Application");
//Передаем текущие параметры форм в MSWord
MSWord.Documents.Open(ИмяФайла);
MSWordDoc = MSWord.ActiveDocument();
WordContent = MSWord.ActiveDocument().ActiveWindow.S_election;
//------------------------------------------------------------
// Перебираем таблицы в документе, и сопоставляем имена переменных
// с именами табличных частей.
Для ТекущаяТаблица = 1 ПО MSWordDoc.Tables.Count Цикл
мТабличнаяЧасть = Неопределено;
Для ТекущаяСтрока = 1 ПО MSWordDoc.Tables(ТекущаяТаблица).Rows.Count Цикл
Для ТекущаяКолонка = 1 ПО MSWordDoc.Tables(ТекущаяТаблица).Columns.Count Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока,ТекущаяКолонка).Range.Text )
,ДокументСсылка);
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
//Итак мы имеем номер текущей таблицы и имя табличной части
Если мТабличнаяЧасть <> Неопределено Тогда
//Производим редактирование нашей таблицы в соответствии с количеством строк
ВсегоСтрокТЧ = 0;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть.Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+1;
КонецЦикла;
//ВсегоСтрокТЧ = ДокументСсылка[мТабличнаяЧасть.Имя].Количество;
// Добавляем строки
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
MSWordDoc.Tables(ТекущаяТаблица).Rows.Add(MSWordDoc.Tables(ТекущаяТаблица).Rows(ТекущаяСтрока+ТекущаяСтрокаТЧ-1));
КонецЕсли;
//MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,2).Range.Text = Строка(ТекущаяСтрокаТЧ);
Для ТекКол = 1 ПО MSWordDoc.Tables(ТекущаяТаблица).Columns.Count Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ,ТекКол).Range.Text));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text = ТекстПеременной;
КонецЕсли;
КонецЦикла;
КонецЦикла;
//MSWordDoc.Tables(ТекущаяТаблица).Rows.Delete();
//MSWordDoc.Tables(ТекущаяТаблица).Rows(3).Delete();
КонецЕсли;
КонецЦикла;
//------------------------------------------------------------
// Вытаскивам из шаблона текст
ТекстДокумента = MSWordDoc.Range(0, MSWordDoc.Characters.Count).Text;
// Из текста вытаскиваем Имена переменных залюченных а скобки []
Список = ПолучитьСписокПеременных(ТекстДокумента);
//Список.ВыбратьЭлемент();
// Заполняем в структуру ревизитовперечень переменных
СтруктураРеквизитов=СтруктураРеквизитовДокумента(ДокументСсылка);
ЗначениеРеквизита="";
Для Каждого ЭлементСписка Из Список Цикл
// Если находится соответствие переменной из документа и шаблона то производим замену
Если СтруктураРеквизитов.Свойство(ЭлементСписка.Значение, ЗначениеРеквизита ) Тогда
//Сообщить("["+ЭлементСписка.Значение+"]"+" : "+ЗначениеРеквизита);
WordContent.Find.Execute("["+ЭлементСписка.Значение+"]",0,0,0,0,0,-1,,,Строка(ЗначениеРеквизита),2);
Иначе
Сообщить("-> " + ЭлементСписка.Значение+" - Не найден в структуре документа");
// Заменим переменную на пустую строку
WordContent.Find.Execute("["+ЭлементСписка.Значение+"]",0,0,0,0,0,-1,,," ",2);
КонецЕсли;
КонецЦикла;
//автоматически обновляем поля документа
MSWord.S_election.WholeStory();
MSWord.S_election.Fields.Update();
MSWord.S_election.HomeKey();
//MSWordDoc.Save As(ИмяФайла);
//отображаем MSWord
MSWord.Visible=1;
MSWord.Activate();
Исключение
Предупреждение(ОписаниеОшибки());
MSWord.Quit();
КонецПопытки;
// Теперь формируем файл из OpenOffice
Попытка
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Reflection = ServiceManager.createInstance("com.sun.star.reflection.CoreReflection");
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
Args = Новый COMSafeArray("VT_DISPATCH", 1);
OOДокумент = Desktop.loadComponentFromURL(ПреобразоватьВURL(ИмяФайла), "_blank", 0, Args);
//------------------------------------------------------------
// Перебираем таблицы в документе, и сопоставляем имена переменных
// с именами табличных частей.
Для ТекущаяТаблица = 0 ПО OOДокумент.getTextTables().Count-1 Цикл
мТабличнаяЧасть = Неопределено;
Для ТекущаяСтрока = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.Count-1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекущаяКолонка, ТекущаяСтрока).string )
,ДокументСсылка);
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
//Итак мы имеем номер текущей таблицы и имя табличной части
Если мТабличнаяЧасть <> Неопределено Тогда
//Производим редактирование нашей таблицы в соответствии с количеством строк
ВсегоСтрокТЧ = 0;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть.Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+1;
КонецЦикла;
//ВсегоСтрокТЧ = ДокументСсылка[мТабличнаяЧасть.Имя].Количество;
// Добавляем строки
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
// Добавляем строку перед нашей
OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.I_nsertByIndex(ТекущаяСтрока+ТекущаяСтрокаТЧ-1, 1);
КонецЕсли;
Для ТекКол = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ).string));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string = ТекстПеременной;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
//------------------------------------------------------------
// Вытаскивам из шаблона текст
//ТекстДокумента = MSWordDoc.Range(0, MSWordDoc.Characters.Count).Text;
ТекстДокумента = ООПолучитьТекст(OOДокумент);
// Из текста вытаскиваем Имена переменных залюченных а скобки []
Список = ПолучитьСписокПеременных(ТекстДокумента);
//Список.ВыбратьЭлемент();
// Заполняем в структуру ревизитовперечень переменных
СтруктураРеквизитов=СтруктураРеквизитовДокумента(ДокументСсылка);
ЗначениеРеквизита="";
OOЗамена = OOДокумент.CreateReplaceDescriptor();
Для Каждого ЭлементСписка Из Список Цикл
// Если находится соответствие переменной из документа и шаблона то производим замену
Если СтруктураРеквизитов.Свойство(ЭлементСписка.Значение, ЗначениеРеквизита ) Тогда
OOЗамена.SearchString = "["+ЭлементСписка.Значение+"]";
OOЗамена.ReplaceString = Строка(ЗначениеРеквизита);
OOДокумент.ReplaceAll(OOЗамена);
Иначе
Сообщить("-> " + ЭлементСписка.Значение+" - Не найден в структуре документа");
// Заменим переменную на пустую строку
OOЗамена.SearchString = "["+ЭлементСписка.Значение+"]";
OOЗамена.ReplaceString = " ";
OOДокумент.ReplaceAll(OOЗамена);
КонецЕсли;
КонецЦикла;
OOДокумент.getCurrentController().getFrame().getContainerWindow().setFocus();
Исключение
Предупреждение(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Код 1C v 8.х //ДОПОЛНИТЕЛЬНО НЕОБХОДИМЫЕ ФУНКЦИИ
// Добавлем форматы представления полей и дополнительную информацию о полях
Процедура ДобавитьФорматы(ПереченьРеквизитов,Значение,пПредставлениеРеквизита, ДокументСсылка = Неопределено)
Если ТипЗнч(Значение) = Тип("Дата") Тогда // расширяем представление даты
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ДФddMMyyyy",Формат(Значение,"ДФ=dd.MM.yyyy"));
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ДЛФDD",Формат(Значение,"ДЛФ=DD"));
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда // расширяем представление числа
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ЧДЦ2ЧГ0",Формат(Значение,"ЧДЦ=2; ЧГ=0"));
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ЧДЦ2",Формат(Значение,"ЧДЦ=2"));
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ЧПропись",Значение);
ИначеЕсли (ТипЗнч(Значение) = Тип("СправочникСсылка.КонтактныеЛица")) или (ТипЗнч(Значение) = Тип("СправочникСсылка.ФизическиеЛица")) Тогда
// Расширяем выводимые поля для типов физ. лица, контакные лица сокращением инициалов
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ФИО",Строка(Значение));
КонецЕсли
КонецПроцедуры
Процедура ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,РеквизитСсылка,Реквизит,пПредставлениеРеквизита)
мГлубинаРекурсии = мГлубинаРекурсии+1;
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"Код",РеквизитСсылка["Код"]);
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"Наименование",РеквизитСсылка["Наименование"]);
Для Каждого ЭлементРеквизита Из Реквизит.Реквизиты Цикл
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+ЭлементРеквизита.Имя,РеквизитСсылка[ЭлементРеквизита.Имя]);
Если (Найти(ЭлементРеквизита.Тип,"Справочник ссылка")>0) И (мГлубинаРекурсии <=3) И (Найти(ЭлементРеквизита.Тип,",")=0) Тогда
///+++
ЗаполнитьРеквизиты(мГлубинаРекурсии, ПереченьРеквизитов,РеквизитСсылка[ЭлементРеквизита.Имя],РеквизитСсылка[ЭлементРеквизита.Имя].Метаданные(),пПредставлениеРеквизита+"_"+ЭлементРеквизита.Имя);
Иначе
ДобавитьФорматы(ПереченьРеквизитов,РеквизитСсылка[ЭлементРеквизита.Имя],пПредставлениеРеквизита+"_"+ЭлементРеквизита.Имя);
КонецЕсли
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСписокПеременных(ТекстШаблона)
СписокПеременных = Новый СписокЗначений();
ЕщеЕсть = Истина;
Пока ЕщеЕсть Цикл
ПервыйСимвол = Найти(ТекстШаблона,"[");
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти(ТекстШаблона,"]");
Если (ВторойСимвол > 0 И ВторойСимвол > ПервыйСимвол) Тогда
СписокПеременных.Добавить(Сред(ТекстШаблона,ПервыйСимвол + 1,ВторойСимвол - ПервыйСимвол - 1));
ТекстШаблона = Сред(ТекстШаблона,ВторойСимвол + 1);
Иначе
ЕщеЕсть = Ложь;
КонецЕсли;
Иначе
ЕщеЕсть = Ложь;
КонецЕсли;
КонецЦикла;
Возврат СписокПеременных;
КонецФункции
Функция СтруктураРеквизитовДокумента(ДокументСсылка) Экспорт
ПереченьРеквизитов = Новый Структура;
ПереченьРеквизитов.Вставить("Дата",ДокументСсылка["Дата"]);
ДобавитьФорматы(ПереченьРеквизитов,ДокументСсылка["Дата"],"Дата");
ПереченьРеквизитов.Вставить("Номер",ДокументСсылка["Номер"]);
Реквизиты = ДокументСсылка.Метаданные().Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
мГлубинаРекурсии = 1;
ПереченьРеквизитов.Вставить(Реквизит.Имя,ДокументСсылка[Реквизит.Имя]);
ДобавитьФорматы(ПереченьРеквизитов,ДокументСсылка[Реквизит.Имя],Реквизит.Имя,ДокументСсылка);
Если Найти(Реквизит.Тип,"Справочник ссылка")>0 Тогда
ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,ДокументСсылка[Реквизит.Имя],ДокументСсылка[Реквизит.Имя].Метаданные(),Реквизит.Имя);
Иначе
//ДобавитьФорматы(ПереченьРеквизитов,ДокументСсылка[Реквизит.Имя],Реквизит.Имя);
КонецЕсли;
КонецЦикла;
ТабличныеЧасти = ДокументСсылка.Метаданные().ТабличныеЧасти;
Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
// Сообщить(ТабличнаяЧасть); // Для таблицы характеристик отрабатываем свой код // с выводом табличной части как набора реквизитов
Если ТабличнаяЧасть.Имя = "Характеристики" Тогда
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть.Имя] Цикл
мПредставлениеРеквизита = "Характеристика"+"_"+СтрЗаменить(СтрокаТабличнойЧасти["ВидХарактеристики"], " ", "_");
мЗначение = СтрокаТабличнойЧасти["ЗначениеХарактеристики"];
ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,мЗначение);
ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита,ДокументСсылка);
Если Найти(ТипЗнч(мЗначение),"Справочник ссылка")>0 Тогда
ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,мЗначение,мЗначение.Метаданные(),мПредставлениеРеквизита);
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Перечень реквизитов табличной части
Реквизиты = ТабличнаяЧасть.Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть.Имя] Цикл
мГлубинаРекурсии = 1;
мПредставлениеРеквизита = "_"+СтрокаТабличнойЧасти.НомерСтроки+"_"+ТабличнаяЧасть.Имя+"_НомерСтроки";
ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,Строка(СтрокаТабличнойЧасти.НомерСтроки));
мПредставлениеРеквизита = "_"+СтрокаТабличнойЧасти.НомерСтроки+"_"+ТабличнаяЧасть.Имя+"_"+Реквизит.Имя;
мЗначение = СтрокаТабличнойЧасти[Реквизит.Имя];
ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,мЗначение);
ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита,ДокументСсылка);
Если Найти(ТипЗнч(мЗначение),"Справочник ссылка")>0 Тогда
ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,мЗначение,мЗначение.Метаданные(),мПредставлениеРеквизита);
Иначе
//ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита);
КонецЕсли;
КонецЦикла;
//Если реквизит числовой, то подсчитываем итог
Если Реквизит.Тип.СодержитТип(Тип("Число")) Тогда
мЗначение = ДокументСсылка[ТабличнаяЧасть.Имя].Итог(Реквизит.Имя);
мПредставлениеРеквизита = "Итог"+"_"+ТабличнаяЧасть.Имя+"_"+Реквизит.Имя;
ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,мЗначение);
ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита,ДокументСсылка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат ПереченьРеквизитов;
КонецФункции
Функция ИмяТабличнойЧастиВСтроке(Строка,ДокументСсылка)
ТабличнаяЧасть=Неопределено;
Если НЕ ПустаяСтрока(Строка) Тогда
ТабличнаяЧасть = ДокументСсылка.Метаданные().ТабличныеЧасти.Найти(Строка)
КонецЕсли;
Возврат ТабличнаяЧасть;
КонецФункции
//Получает первый кусок переменной до _
Функция ПолучитьСтартПеременной(ПереданнаяСтрока) Экспорт
СтартПеременной = "";
ПервыйСимвол = Найти(ПереданнаяСтрока,"[");
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти(ПереданнаяСтрока,"]");
Если (ВторойСимвол > 0) И (ВторойСимвол > ПервыйСимвол) Тогда
Переменная = (Сред(ПереданнаяСтрока,ПервыйСимвол+1,ВторойСимвол-ПервыйСимвол-1));
ВторойСимвол = Найти(Переменная,"_");
Если (ВторойСимвол > 0) И (ВторойСимвол > 1) Тогда
СтартПеременной = Сред(Переменная,1,ВторойСимвол-1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат СтартПеременной;
КонецФункции
// Получает переменную заключенную в скобки
Функция ПолучитьПеременнуюИзСтроки(ПереданнаяСтрока) Экспорт
Переменная = "";
ПервыйСимвол = Найти(ПереданнаяСтрока,"[");
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти(ПереданнаяСтрока,"]");
Если (ВторойСимвол > 0) И (ВторойСимвол > ПервыйСимвол) Тогда
Переменная = (Сред(ПереданнаяСтрока,ПервыйСимвол+1,ВторойСимвол-ПервыйСимвол-1));
КонецЕсли;
КонецЕсли;
Возврат Переменная;
КонецФункции// Идентифицирует табличную часть в строке
// Функция преобразует Windows имя файла в URL OpenOffice
Функция ПреобразоватьВURL(ИмяФайла)
Возврат "file:///" + СтрЗаменить(ИмяФайла, "\", "/");
КонецФункции
// Функция извлекает текст из документа
Функция ООПолучитьТекст(OOДокумент)
Текст = "";
oParEnum = OOДокумент.getText().createEnumeration();
Пока oParEnum.hasMoreElements() Цикл
oPar = oParEnum.nextElement();
Если oPar.supportsService("com.sun.star.text.Paragraph") ТОгда
Текст = Текст + oPar.getString();
ИначеЕсли oPar.supportsService("com.sun.star.text.TextTable") Then
//Сообщить(oPar.getString());
КонецЕсли;
КонецЦикла;
Для ТекущаяТаблица = 0 ПО OOДокумент.getTextTables().Count-1 Цикл
Для ТекущаяСтрока = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.Count-1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл
Текст = Текст + OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекущаяКолонка, ТекущаяСтрока).string;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Возврат Текст;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice Создание ярлыка файла программно На Рабочем столе
Код 1C v 8.х Shell = Новый COMОбъект("WScript.Shell");
РабочийСтол = Shell.SpecialFolders("Desktop");
Ярлык = Shell.CreateShortcut(РабочийСтол + "\\Regedit.lnk");
Ярлык.TargetPath = Shell.ExpandEnvironmentStrings("%windir%\\regedit.exe");
Ярлык.WorkingDirectory = Shell.ExpandEnvironmentStrings("%windir%");
Ярлык.WindowStyle = 1;
Ярлык.IconLocation = Shell.ExpandEnvironmentStrings("%windir%\\regedit.exe, 0");
Ярлык.Save ();
Код 1C v 7.x Shell = СоздатьОбъект("WScript.Shell");
РабочийСтол = Shell.SpecialFolders("Desktop");
Ярлык = Shell.CreateShortcut(РабочийСтол + "\\Regedit.lnk");
Ярлык.TargetPath = Shell.ExpandEnvironmentStrings("%windir%\\regedit.exe");
Ярлык.WorkingDirectory = Shell.ExpandEnvironmentStrings("%windir%");
Ярлык.WindowStyle = 1;
Ярлык.IconLocation = Shell.ExpandEnvironmentStrings("%windir%\\regedit.exe, 0");
Ярлык.Save ();
Категория:
COM-объекты, WMI, WSH Печать табличной части документа в Word'e Вот пример кода создания и заполнения таблиц(пример для 7.7, в 8.х заменить первую строку на МСВорд Новый COMОбъект("Word.Application")):
Код 1C v 7.x МСВорд = СоздатьОбъект("Word.Application");
Документ = МСВорд.Documents;
Документ.Add();
Документ = МСВорд.ActiveDocument();
Документ.Paragraphs.Add();
Диапазон = Документ.Paragraphs(Документ.Paragraphs.Count()).Range;
//Добавим таблицу фиксированного размера 3х2
Документ.Tables.Add(Диапазон,3,2);
Документ.Tables(1).Range.S_elect();
Выбор = МСВорд.S_election();
Выбор.Style = "Сетка таблицы";
//Установим ширину обоих колонок по 8 см
Документ.Tables(1).Columns(1).Width= МСВорд.CentimetersToPoints(8);
Документ.Tables(1).Columns(2).Width= МСВорд.CentimetersToPoints(8);
//Заполнение
Документ.Tables(1).Cell(1,1).Range.Text = "Это первая сирока, первая колонка";
Документ.Tables(1).Cell(2,1).Range.Text = "";
Документ.Tables(1).Cell(3,1).Range.Text = "";
Документ.Tables(1).Cell(1,2).Range.Text = "";
Документ.Tables(1).Cell(2,2).Range.Text = "";
Документ.Tables(1).Cell(3,2).Range.Text = "Это третья строка, вторая колонка";
//Добавим таблицу с произвольным количеством строк, для примера возьмем 4 колонки
//Сначала выведем заголовок таблицы
Документ.Paragraphs.Add();
Диапазон = Документ.Paragraphs(Документ.Paragraphs.Count()).Range;
Документ.Tables.Add(Диапазон,1,4);
Документ.Tables(2).Range.S_elect();
Выбор = МСВорд.S_election();
Выбор.Style = "Сетка таблицы";
Выбор.Rows.AllowBreakAcrossPages = 0;
//Зададим ширину колонок
Документ.Tables(2).Columns(1).Width= МСВорд.CentimetersToPoints(2);
Документ.Tables(2).Columns(2).Width= МСВорд.CentimetersToPoints(4);
Документ.Tables(2).Columns(3).Width= МСВорд.CentimetersToPoints(4);
Документ.Tables(2).Columns(4).Width= МСВорд.CentimetersToPoints(10);
//Заполнение шапки таблицы
Документ.Tables(2).Cell(1,1).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,1).Range.Text = "№";
Документ.Tables(2).Cell(1,2).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,2).Range.Text = "Колонка 2";
Документ.Tables(2).Cell(1,3).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,3).Range.Text = "Колонка 3";
Документ.Tables(2).Cell(1,4).Range.Paragraphs(1).Alignment = 1;
Документ.Tables(2).Cell(1,4).Range.Text = "Примечание";
//Для документа можно так цикл организовать:
//Предположим, что Док - это документ, тогда
Для А =1 По Док.КоличествоСтрок() Цикл
Док.ПолучитьСтрокуПоНомеру(А);
Выбор.I_nsertRowsBelow(1);
Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
Документ.Tables(2).Cell(А+1,2).Range.Text = Док.РеквизитТабличнойЧастиДокумента1;
Документ.Tables(2).Cell(А+1,3).Range.Text = Док.РеквизитТабличнойЧастиДокумента2;
Документ.Tables(2).Cell(А+1,4).Range.Text = Док.РеквизитТабличнойЧастиДокумента3;
КонецЦикла;
//или выведем таблицу по таблице значений
Для А = 1 По ТЗ.КоличествоСтрок() Цикл
//Добавим строку в таблицу
Выбор.I_nsertRowsBelow(1);
Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
Документ.Tables(2).Cell(А+1,2).Range.Text = ТЗ.ПолучитьЗначение(А,1);
Документ.Tables(2).Cell(А+1,3).Range.Text = ТЗ.ПолучитьЗначение(А,2);
Документ.Tables(2).Cell(А+1,4).Range.Text = ТЗ.ПолучитьЗначение(А,3);
КонецЦикла;
//Запишем Документ
Документ.Save As("ПутьИИмяДокумента",0);
Документ.Close();
ТЗ - это таблица значений.
Для документа можно так цикл организовать:
Предположим, что Док - это документ, тогда
Код 1C v 8.2 УП Для А =1 По Док.КоличествоСтрок() Цикл
Док.ПолучитьСтрокуПоНомеру(А);
Выбор.I_nsertRowsBelow(1);
Документ.Tables(2).Cell(А+1,1).Range.Text = Строка(А);//номер строки
Документ.Tables(2).Cell(А+1,2).Range.Text = Док.РеквизитТабличнойЧастиДокумента1;
Документ.Tables(2).Cell(А+1,3).Range.Text = Док.РеквизитТабличнойЧастиДокумента2;
Документ.Tables(2).Cell(А+1,4).Range.Text = Док.РеквизитТабличнойЧастиДокумента3;
КонецЦикла;
Категория:
Работа с Microsoft Office и OpenOffice Пример переноса данных из 1С 7.7 в 8.1 посредством XML файла Код 1C v 7.x xmldoc = CreateObject("Msxml2.DOMDocument");
xmlDoc.loadXML("<root/>");
nodeRoot = xmlDoc.documentElement;
расходы = xmlDoc.createElement("СправочникРасходы");
Спр = Создатьобъект("Справочник.Расходы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 цикл
расход = xmlDoc.createElement("Расход");
расход.setAttribute("Код",Спр.Код);
расход.setAttribute("Наименование",Спр.Наименование);
расход.setAttribute("Родитель",Строка(Спр.Родитель));
расход.setAttribute("Цена",Строка(Спр.Цена.Получить(ТекущаяДата())));
расход.setAttribute("Количество",Строка(Спр.Количество));
расход.setAttribute("ЭтоГруппа",Строка(Спр.ЭтоГруппа()));
расходы.appendChild(расход);
КонецЦикла;
nodeRoot.appendChild(расходы);
ДвижениеСчетов = xmlDoc.createElement("ДвижениеСчетов");
рег = СоздатьОбъект("Регистр.Счет");
рег.ВыбратьДвижения();
Пока Рег.ПолучитьДвижение()=1 цикл
Движение = xmlDoc.createElement("Движение");
Движение.setAttribute("Приход",Строка(Рег.Приход));
Движение.setAttribute("Дата",Строка(Рег.ТекущийДокумент().ДатаДок));
Движение.setAttribute("Описатель",Строка(Рег.Описатель));
Движение.setAttribute("СтатьяРасходов",Строка(Рег.СтатьяРасходов));
Движение.setAttribute("СтатьяПоступлений",Строка(Рег.СтатьяПоступлений));
Движение.setAttribute("Кто",Строка(Рег.Кто));
Движение.setAttribute("Кому",Строка(Рег.Кому));
Движение.setAttribute("Остаток",Строка(Рег.Остаток));
Движение.setAttribute("Количество",Строка(Рег.Количество));
ДвижениеСчетов.appendChild(Движение);
КонецЦикла;
nodeRoot.appendChild(ДвижениеСчетов);
xmlDoc.save ("C:\budjet.xml");
Код 1C v 8.х
Функция Кошель(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Счет;
КонецФункции
Функция Вал(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Валюта;
КонецФункции
Функция Дата1С(дат)
Возврат "20"+сред(дат,7,2)+сред(дат,4,2)+лев(дат,2);
КонецФункции
Процедура Загрузка(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "СправочникРасходы" тогда
Сообщить("нашли СправочникРасходы");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код");
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("Родитель");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
ТЗ.Колонки.Добавить("ЭтоГруппа");
Для Каждого Расход из nod.childNodes Цикл
Строка = ТЗ.Добавить();
Строка.Код = Расход.getAttribute("Код");
Строка.Наименование = Расход.getAttribute("Наименование");
Строка.Родитель = Расход.getAttribute("Родитель");
Строка.Цена = Число(Расход.getAttribute("Цена"));
Строка.Количество = Число(Расход.getAttribute("Количество"));
Строка.ЭтоГруппа = ?(Расход.getAttribute("ЭтоГруппа")="1",True,Ложь);
КонецЦикла;
//ТЗ.ВыбратьСтроку();
Для Каждого Стр из ТЗ Цикл
Родитель = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Родитель,истина);
Справ = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Наименование,истина);
Если Справ = Справочники.СтатьиЗатрат.ПустаяСсылка() тогда
Если Стр.ЭтоГруппа тогда
Справ = Справочники.СтатьиЗатрат.СоздатьГруппу();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Записать();
Иначе
Справ = Справочники.СтатьиЗатрат.СоздатьЭлемент();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Цена = Стр.Цена;
Справ.Количество = Стр.Количество;
Справ.Записать();
КонецЕсли;
Иначе
КонецЕсли;
КонецЦикла;
ИначеЕсли nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Приход");
ТЗ.Колонки.Добавить("Дата");
ТЗ.Колонки.Добавить("Описатель");
ТЗ.Колонки.Добавить("Статья");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
Для каждого движ из nod.childNodes цикл
Строка = ТЗ.Добавить();
Строка.Приход = ?(движ.getAttribute("Приход")="1",True,Ложь);
Строка.Дата = Дата(Дата1С(движ.getAttribute("Дата")));
Строка.Описатель = движ.getAttribute("Описатель");
Строка.Статья = Справочники.СтатьиЗатрат.НайтиПоНаименованию(движ.getAttribute(?(Строка.Приход,"СтатьяПоступлений","СтатьяРасходов")),истина);
Строка.Цена = Число(движ.getAttribute("Остаток"));
Строка.Количество = Число(движ.getAttribute("Количество"));
КонецЦикла;
ТЗ.ВыбратьСтроку();
Доки = Новый ТаблицаЗначений;
Доки.Колонки.Добавить("Док");
Доки.Колонки.Добавить("Дата");
Доки.Колонки.Добавить("КошелекС");
Доки.Колонки.Добавить("КошелекНа");
Доки.Колонки.Добавить("Статья");
Доки.Колонки.Добавить("ВалютаС");
Доки.Колонки.Добавить("ВалютаНа");
Доки.Колонки.Добавить("ЦенаС");
Доки.Колонки.Добавить("ЦенаНа");
Доки.Колонки.Добавить("Количество");
УжеЕстьДок=Ложь;
док=0;
Для Каждого Стр Из ТЗ цикл
Если Стр.Приход Тогда
Если УжеЕстьДок тогда
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
УжеЕстьДок=Ложь;
Иначе
Док = Доки.Добавить();
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Док.Док = "ПоступлениеСредств";
КонецЕсли;
Иначе
Док = Доки.Добавить();
Док.КошелекС = Кошель(Стр.Описатель);
Док.ВалютаС = Вал(Стр.Описатель);
Док.ЦенаС = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Если СокрЛП(Стр.Статья.Наименование)="Обмен валюты" тогда
Док.Док = "ОбменВалюты";
УжеЕстьДок=истина;
ИначеЕсли СокрЛП(Стр.Статья.Наименование)="Перевод средств" тогда
Док.Док = "ПереводСредств";
УжеЕстьДок=истина;
Иначе
Док.Док = "РасходСредств";
УжеЕстьДок=Ложь;
КонецЕсли;
КонецЕсли;
Док.Дата = Стр.Дата;
КонецЦикла;
Доки.ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
Для Каждого Док из Доки Цикл
Если Док.Док = "ПоступлениеСредств" тогда
Докум = Документы.ПоступлениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Статья = Док.Статья;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ПереводСредств" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ОбменВалюты" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
Докум.Сумма = Док.ЦенаС;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Докум = Документы.ОбменВалюты.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.ВалютаС = Док.ВалютаС;
Докум.ВалютаНа = Док.ВалютаНа;
Докум.СуммаС = Док.ЦенаС;
Докум.СуммаНа = Док.ЦенаНа;
Докум.Курс = Докум.СуммаС / Докум.СуммаНа;
Докум.Переключатель = 1;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Иначе
Докум = Документы.РасходСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
тч = Докум.Затраты.Добавить();
тч.Сумма = Док.ЦенаС;
тч.Статья = Док.Статья;
тч.Цена = Док.ЦенаС;
тч.Количество = Док.Количество;
Докум.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьТЗДанными(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТП1 = Новый ТаблицаЗначений;
ТП1.Колонки.Добавить("Описатель");
Типы = Новый Массив(1); Типы[0] = Тип("СправочникСсылка.Кошельки");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Счет",Тип);
Типы[0] = Тип("СправочникСсылка.Валюты");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Валюта",Тип);
Для каждого движ из nod.childNodes цикл
Описатель = движ.getAttribute("Описатель");
если ТП1.Найти(Описатель,"Описатель") = Неопределено тогда
стр = ТП1.Добавить();
Стр.Описатель = Описатель;
КонецЕсли;
КонецЦикла;
ТП2=ТП1;//ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF Использование программы rundll32.exe в 1С Программа rundll32.exe входит в стандартную поставку всех операционных систем семейства Windows и позволяет выполнять различные функции, описанные в библиотеках, драйверах или ActiveX-объектах, как будто они выполняются из программы. Также эта программа входит в состав новой операционной системы Windows Vista, поэтому обзор новой операционной системы, предназначенный для опытных пользователей, никак нельзя назвать законченным, если он не будет содержать описание команд rundll32.exe, доступных в Windows Vista.
Синтаксис использования программы rundll32.exe следующий: rundll32.exe «библиотека», «функция» «параметры». При этом очень важно понимать, что название функции, хранящейся в библиотеке, зависит от регистра, которым вы ее написали. То есть, например, функции MessageBox и messageBox, в понимании программы rundll32.exe, являются различными функциями, поэтому если в названии функции вы напишете вместо прописной буквы строчную, программа rundll32.exe выдаст ошибку. Название же самой программы rundll32.exe и название библиотеки можно указывать как строчными, так и прописными символами.
Пример:
Код 1C v 8.х //Emigachev Проверим дату на компе
Если ТекущаяДата()<Дата(2009,1,1) Тогда
Предупреждение("Установите правильную дату!");
//Открыть диалог установки Даты и Времени
ЗапуститьПриложение("rundll32 shell32,Control_RunDLL timedate.cpl");
КонецЕсли;
Приведу список наиболее значимых команд (в котором найдете ОЧЕНЬ интересные команды, ну а как их использовать, думайте сами!):
* rundll32 shell32.dll,Control_RunDLL hotplug.dll - диалоговое окно Отключение или извлечение аппаратного устройства
* rundll32 diskcopy,DiskCopyRunDll - вызов диалога "Копирование диска".
* rundll32 keyboard,disable - отключение клавиатуры, действует до следующей перезагрузки.
* rundll32 mouse,disable - отключение мыши вплоть до перезагрузки.
* rundll32 krnl386.exe,exitkernel - выгрузить ядро системы, выход из Windows.
* rundll32 mshtml.dll,PrintHTML "HtmlFileNameAndPath" - распечатать документ HTML, где "HtmlFileNameAndPath" - путь к файлу и его имя.
* rundll32 мсprint2.dll,RUNDLL_PrintTestPage - распечатать тестовую страницу на принтере.
* rundll32 netplwiz.dll,AddNetPlaceRunDll - вызов мастера подключения нового сетевого ресурса "Добавление в сетевое окружение".
* rundll32 rnaui.dll,RnaWizard - вызов мастера "Удаленный доступ к сети".
* rundll32 rnaui.dll,RnaWizard /1 - вызов мастера "Удаленный доступ к сети" без отображения начального окна.
* rundll32 shell,ShellExecute - открыть Проводник (папка "Рабочий стол").
* rundll32 shell32,Control_RunDLL - открыть в Проводнике папку "Панель управления".
* rundll32 shell32,Control_RunDLL appwiz.cpl,,n - вызов диалогового окна "Установка и удаление программ", в котором будет открыта вкладка с номером "n" (от 1 до 3).
* rundll32 shell32,Control_RunDLL main.cpl @0 - открыть диалог "Свойства мыши".
* rundll32 shell32,Control_RunDLL main.cpl @1 - открыть диалог "Свойства клавиатуры".
* rundll32 shell32,Control_RunDLL main.cpl @2 - открыть папку "Принтеры".
* rundll32 SHELL32,SHHelpShortcuts_RunDLL PrintersFolder - открыть папку "Принтеры" (другой способ).
* rundll32 shell32,Control_RunDLL main.cpl @3 - открыть папку "Шрифты".
* rundll32 SHELL32,SHHelpShortcuts_RunDLL FontsFolder - открыть папку "Шрифты" (другой способ).
* rundll32 SHELL32,Control_RunDLL modem.cpl, add - открыть диалог "Свойства модема".
* rundll32 shell32,Control_RunDLL timedate.cpl - открыть диалог "Дата и время".
* rundll32 shell32,OpenAs_RunDLL - вызвать диалог "Открыть с помощью...".
* rundll32 shell32,ShellAboutA WINHOWTO.RU - информация о версии Windows.
* rundll32 shell32,SHExitWindowsEx 0 - закрыть все программы, перегрузить оболочку.
* rundll32 shell32, SHExitWindowsEx 1 - выключить ПК.
* rundll32 SHELL32, SHExitWindowsEx -1 - перегрузить оболочку Windows.
* rundll32 shell32, SHExitWindowsEx 2 - перегрузить ПК.
* rundll32 shell32,SHExitWindowsEx 4 - принудительно закрыть все программы.
* rundll32 shell32,SHExitWindowsEx 8 - выход из Windows и выключение ATX-совместимого ПК.
* rundll32 shell32,SHFormatDrive - вызов диалога форматирования диска А:.
* rundll32 SHELL32,SHHelpShortcuts_RunDLL AddPrinter - запуск "Мастера установки принтера".
* rundll32 shell32,SHHelpShortcuts_RunDLL Connect - запуск мастера подключения сетевого диска.
* rundll32 SHELL32,SHHelpShortcuts_RunDLL PrintTestPage - распечатать тестовую страницу.
* rundll32 sysdm.cpl,InstallDevice_Rundll - вызов мастера установки оборудования.
* rundll32 url.dll,FileProtocolHandler %1 - открыть веб-страницу, где %1 - URL сайта (включая http://).
* rundll32 url.dll,MailToProtocolHandler %1 - создать новое письмо, где %1 - e-mail адресата.
* rundll32 user,CASCADECHILDWINDOWS - расположить все окна каскадом.
* rundll32 user,TILECHILDWINDOWS - расположить все окна по экрану.
* rundll32 user,disableoemlayer - сбой системы (!) - выключить все функции ввода-вывода
(клавиатура, дисплей, мышь). В результате будет черный экран с курсором и ни на что не реагирующая система, однако Windows продолжает работать.
* rundll32 user,ExitWindowsExec - быстрая перезагрузка Windows.
* rundll32 user,RepaintScreen - выполнить команду "Обновить".
* rundll32 user,SetCaretBlinkTime n - задать частоту мигания курсора, соответствующую значению параметра n.
* rundll32 user,SetCursorPos - переместить курсор мыши в верхний левый угол экрана.
* rundll32 user,SetDoubleClickTime n - задать скорость двойного нажатия левой кнопки мыши (Double Click), соответствующую параметру n.
* rundll32 user,SwapMouseButton - поменять местами клавиши мыши (обратная смена невозможна).
* rundll32 user,WNetConnectDialog - вызов диалога "Подключение сетевого диска".
* rundll32 user,WNetDisconnectDialog - вызов диалога "Отключение сетевого диска".
* rundll32 AppWiz.Cpl,NewLinkHere %1 - запуск мастера создания нового ярлыка, где %1 - путь к исходному файлу.
* rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL Connect. Вызвать мастер подключения сетевых дисков.
* rundll32.exe shell32.dll, ShellAboutA. Вызвать диалог, отображающий версию операционной системы Windows. Также данный диалог можно отобразить, выполнив команду winver.exe.
* rundll32.exe IEAKENG.dll, BrowseForFileA. Отображает дерево файловой системы жесткого диска компьютера.
* rundll32.exe ndfapi.dll, NdfRunDllHelpTopic «html-страница». Вызвать диалог HELP AND SUPPORT на указанной странице. Например, в качестве html-страницы можно использовать вызов mshelp://Windows/?id=33307acf-0698-41ba-b014-ea0a2eb8d0a8.
* rundll32.exe shell32.dll, OpenAs_RunDLL "путь и имя файла". Вызвать диалог OPEN AS… для открытия данного файла.
* rundll32.exe shell32.dll, Control_RunDLL Cliconfg.dll. Отображает диалог SQL Server Client Network Utility.
* rundll32.exe shell32.dll, Control_RunDLL Hotplug.dll. Отображает диалог удаления съемного устройства.
* rundll32.exe admparse.dll, CheckDuplicateKeysA "путь и имя файла". Переписывает содержимое данного файла.
* rundll32.exe IEAKENG.dll, BToolbar_
Save A "путь к папке". Создает папку. Если данная папка уже существует, тогда все ее содержимое будет удалено.
* rundll32.exe appwiz.cpl, GetProgramsOnline. Запускает браузер Internet Explorer и загружает страницу http://g.msn.com/WMHFUSEN/101724.
* rundll32.exe shell32.dll, ShellExec_RunDLL "команда". Выполняет команду.
* rundll32.exe url.dll, FileProtocolHandler "каталог". Открыть папку. Если вы не укажете папки, тогда будет открыта папка вашего профиля.
* rundll32.exe WININET.dll, RunOnceUrlCache "путь к папке". Удаляет все файлы указанной папки, имеющие атрибут FILEATTRIBUTETAGINFORMATION.
* rundll32.exe xwizards.dll, ProcessXMLFile "путь и имя xml-файла". Выполнить xml-файл.
* rundll32.exe user32.dll, mouse_event. Выполнить нажатие правой клавиши мыши.
* rundll32.exe user32.dll, SetCursorPos. Установить курсор в правый нижний угол экрана.
* rundll32.exe dfshim.dll, KillService. Остановить работу службы фонового обновления dfsvc.exe
* rundll32.exe IERNONCE.dll, RunOnceExProcess. Выполняет команды, описанные в ветви реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx (или в ветви корневого раздела HKCU).
Категория:
COM-объекты, WMI, WSH Параметры, ключи запуска 1Сv7 из командной строки Режим предназначен для выполнения конфигуратором административных функций без участия пользователя. Данный режим применяется в специальных случаях. Например, с его помощью можно организовать специальный ярлык на рабочем столе Windows для создания резервной копии информационной базы 1С:Предприятия. При этом пользователю не нужно будет выполнять никаких действий по выбору необходимой функции в конфигураторе и указанию параметров необходимых для сохранения информационной базы. Данный режим может использоваться для организации автоматического выполнения административных функций в определенный момент времени. Для этого используется любое программное обеспечение, имеющее возможность планирования и запуска задач в определенное время. Например, может быть организовано автоматическое создание резервной копии в ночное время суток
Пакетный режим предназначен для выполнения следующих действий:
-тестирование и исправление информационной базы;
-выгрузка данных;
-сохранение данных;
-автообмен распределенной информационной базы (режим доступен, если установлена компонента «Управление распределенными информационными базами»).
Запуск Конфигуратора в пакетном режиме
Для работы Конфигуратора в пакетном режиме следует в командной строке запуска 1С:Предприятия, кроме параметра CONFIG, указывающего на то, что система 1С:Предприятие запускается в режиме «Конфигуратор», указать параметр /@ФайлПакетногоРежима. ФайлПакетногоРежима - это имя файла, содержащего параметры пакетного запуска. Все необходимые функции, которые должны быть выполнены Конфигуратором в пакетном режиме, описываются в этом файле.
Имя файла может задаваться как абсолютным путем, так и относительным.
В случае задания относительным путем файл ищется программой сначала в рабочем каталоге пользователя, затем в каталоге информационной базы, а затем в том каталоге, из которого запускается 1С:Предприятие.Для того, чтобы при пакетном режиме не выдавался диалог запуска 1С:Предприятия и диалог авторизации, в строке запуска должны быть указаны все необходимые параметры:
-параметр CONFIG;
-каталог информационной базы (параметр /D);
-имя пользователя, если для данной информационной базы ведется список пользователей (параметр /N);
-пароль пользователя, если для пользователя задан пароль (параметр /Р).
Файл пакетного режима имеет по умолчанию расширение .prm, если используется другое расширение, то оно должно явно указываться в имени файла.
Ниже приведен пример строки запуска Конфигуратора в пакетном режиме:
c:\1cv7\bin\1cv7.exe CONFIG /Dc:\1cv7\db /NПопов /PSekret /@C:\lCV7\CMD\Backup
Структура файла пакетного режима.
Файл пакетного режима является текстовым файлом и может создаваться и модифицироваться любым текстовым редактором. Структура файла включает секции и параметры, определенные для каждой секции. Секция задается отдельной строкой с именем секции в прямоугольных скобках. Параметры задаются отдельными строками после строки соответствующей секции с указанием имени параметра и значением, отделенным знаком «=». Основная секция General, описывает общие параметры пакетного режима и необходимость выполнения отдельных функций пакетного режима. Остальные секции содержат параметры, описывающие особенности выполнения конкретных функций.
Секция General [General]
Данная секция предназначена для описания общих параметров пакетного режима и необходимости выполнения отдельных функций.
Output=Имя_файла
Указывает файл, в который будет дополнительно направляться вывод записей о выполняемых действиях в пакетном режиме. Имя файла может указываться как абсолютным путем, так и относительно каталога, в котором расположен файл параметров. Формат файла дополнительного вывода совпадает с форматом вывода в журнал регистрации. Если параметр не указан, то дополнительный вывод производиться не будет. В любом случае вывод производится в журнал регистрации
Quit=Значение
Указывает, нужно ли завершать выполнение Конфигуратора после выполнения действий пакетного режима.
Если задано Y или 1, после выполнения действий пакетного режима, программа будет завершена, а если 0 или N, то нет.
Если параметр не задан, то программа будет завершена.
CheckAndRepair=Значение
Указывает, нужно ли выполнять тестирование и исправление информационной базы.
Если задано Y или 1, тестирование и исправление будет выполняться, а если 0 или N, то нет.
Если параметр не задан, то тестирование и исправление выполняться не будет.
UnloadData =3начение
Указывает, нужно ли выполнять выгрузку информационной базы.
Если задано Y или 1, выгрузка будет выполняться, а если 0 или N, то нет.
Если параметр не задан, то выгрузка выполняться не будет.
Save Data=Значение
Указывает, нужно ли выполнять сохранение информационной базы.
Если задано Y или 1, сохранение будет выполняться, а если 0 или N, то нет.
Если параметр не задан, то сохранение выполняться не будет.
AutoExchange=Значение
Указывает, нужно ли выполнять автообмен в распределенной информационной базе.
Если задано Y или 1, автообмен будет выполняться, а если 0 или N, то нет.
Если параметр не задан, то автообмен выполняться не будет.
Подробное описание работы с распределенными информационными базами приведено в книге «Управление распределенными информационными базами».
Секция CheckAndRepair [CheckAndRepair]
Данная секция предназначена для описания выполнения тестирования и исправления информационной базы.
Repair=Значение
Параметр указывает, должно ли выполняться исправление информационной базы.
Если задано значение Y или 1, то будет выполняться тестирование и исправление обнаруженных ошибок в информационной базе.
Если задано значение N или 0, то будет производиться только тестирование.
Если параметр не задан, то будет производиться тестирование и исправление.
PhysicalIntegrity=Значение
Параметр указывает, следует ли производить проверку физической целостности таблиц информационной базы.
Если задано Y или 1, проверка будет производиться, если N или 0, то нет.
Если параметр не задан, проверка будет производиться.
Reindex=Значение
Параметр указывает, следует ли производить реиндексацию таблиц информационной базы.
Если задано Y или 1, реиндексация будет производиться, если N или 0, то нет.
Если параметр не задан, реиндексация будет производиться.
Если установлен режим исправления, то рекомендуется установить и режим реиндексации.
LogicalIntegrity=Значение
Параметр указывает, следует ли производить проверку логической целостности таблиц информационной базы.
Если задано Y или 1, проверка будет производиться, если N или 0, то нет.
Если параметр не задан, проверка будет производиться.
RecalcSecondaries=Значение
Параметр указывает, следует ли производить обновление (пересчет) вторичных данных информационной базы, то есть служебных данных, которые могут быть рассчитаны на основании другой информации, хранящейся в информационной базе.
Если задано Y или 1, обновление будет производиться, если N или 0 - то нет.
Если параметр не задан, обновление будет производиться.
RecalcTotals=Значение
Параметр указывает, следует ли производить пересчет итогов бухгалтерского и оперативного учета.
Если задано Y или 1, пересчет будет производиться, если N или 0 - то нет.
Если параметр не задан, пересчет будет производиться.
Pack=3начение
Параметр указывает, следует ли производить упаковку таблиц информационной базы, то есть освобождать место занятое удаленными записями.
Если задано Y или 1, упаковка будет производиться, если N или 0, то нет.
Если параметр не задан, упаковка не будет производиться.
Данный параметр имеет смысл, только если данные хранятся в формате DBF/CDX.
SkipUnresolved=Значение
Параметр указывает, следует ли пропускать неразрешенные ссылки, или их следует исправлять.
Если задано Y или 1, неразрешенные ссылки будет только диагностироваться, если N или 0, то ссылки будут разрешаться способом, задаваемым параметром CreateForUnresolved (см. ниже).
Если параметр не задан, ссылки будут исправляться.
Параметр имеет смысл только, если проводится тестирование и исправление информационной базы.
CreateForUnresolved=Значение
Параметр указывает способ разрешения неразрешенных ссылок.
Если задано Y или 1, для неразрешенной ссылки будет создан объект соответствующего типа, если N или 0, то ссылка будет очищена.
Если параметр не задан, будет создан объект.
Параметр имеет смысл только, если проводится тестирование и исправление информационной базы.
Reconstruct=Значение
Параметр указывает способ исправления информационной базы в случае, когда данные объекта частично потеряны. Если задано Y или 1, будет создан объект, заполненный имеющимися данными, если N или 0, то данные объекта будут удалены.
Если параметр не задан, будет создан объект.
Параметр имеет смысл только, если проводится тестирование и исправление информационной базы.
Секция UnloadData [UnloadData]
Данная секция предназначена для описания выполнения выгрузки данных информационной базы.
UnloadToFile=Имя_Файла
Параметр указывает имя файла переноса данных, в который будет производиться выгрузка. Может задаваться как абсолютно, так и относительно того каталога, в котором размещается файл параметров.
Параметр должен быть задан обязательно.
IncludeUserDef=Значение
Параметр указывает должен ли в файл переноса данных включаться список пользователей.
Если задано Y или 1, то список пользователей будет включен в файл переноса, если 0 или N, то нет.
Если параметр не задан, то список будет включен в файл переноса.
Password=Пароль
Параметр задает пароль, которым будет закрыт файл переноса данных.
Если параметр не задан, то файл переноса не будет закрыт паролем.
Секция Save Data [Save Data]
Данная секция предназначена для описания выполнения сохранения данных информационной базы.
Save ToFile=Имя_Файла
Параметр указывает имя файла, в который будет производиться сохранение данных. Может задаваться как абсолютно, так и относительно того каталога, в котором размещается файл параметров.
Параметр должен быть задан обязательно.
FileList=Список сохраняемых файлов
Задается как перечисление имен файлов, разделенных пробелами или запятыми. Длинные имена файлов, содержащие пробелы должны заключаться в кавычки "". В именах файлов могут использоваться символы «*» для обозначения групп файлов.
Если параметр не задан, то список сохраняемых файлов будет взят из файла 1CV7FILE.LST, так же как и в случае выполнения сохранения из пункта меню «Администрирование».
Работа в пакетном режиме
Выполнение указанных действий в пакетном режиме производится всегда в строго определенной последовательности, вне зависимости от порядка следования секций и параметров в файле пакетного режима:
1. тестирование и исправление информационной базы;
2. выгрузка данных;
3. сохранение данных;
4. автообмен распределенной информационной базы.
При работе Конфигуратора в пакетном режиме не выполняется выдача предупреждений и запросов, требующих подтверждения пользователя. При возникновении критических ошибок выполнение пакетного режима прекращается. Результаты выполнения пакетного режима можно просмотреть в журнале регистрации и в файле дополнительного вывода, если он был определен в файле параметров пакетного режима.
Пример пакетного файла:
[General]
Output="D:\Типовые конфигурации\1SBBDemo\log.txt"
Quit=1
Save Data=1
[Save Data]
Save ToFile="D:\Типовые конфигурации\1SBBDemo\arch.zip"
Ярлык для запуска базы и выполнения файла пакетного режима:
\\Server\1cv77\BIN\1cv7s.exe config /D "D:\Типовые конфигурации\1SBBDemo\" /@"D:\Типовые конфигурации\1SBBDemo\paket.txt"
Комментарий к файлу:
Во время работы будет сформирован лог-файл (Output="D:\Типовые конфигурации\1SBBDemo\log.txt"). Он будет здесь D:\Типовые конфигурации\1SBBDemo\log.tx.
Будет выполнено сохранение данных (Save Data=1) в файл arch.zip (Save ToFile="D:\Типовые конфигурации\1SBBDemo\arch.zip"). После выполения работы - конфигуратор будет закрыт (Quit=1). Информационная база хранится в D:\Типовые конфигурации\1SBBDemo\. Файл пакетного режима харанится в папке базы и называется paket.txt.
Пакетный режим является мощным инструментом. Чаще всего используется для создания архивных копий. Проблема только в том, что он архив делается всегда под одним именем. И чтобы не затирать старые архивы, требуется некоторая изворотливость с конфигурационным файлом пакетного режима. Но здесь огромное поле для фантазии, по этому предоставляю Вам возможность фантазировать.
Категория:
Администрирование Как выгрузиться в EXCEL со сводными таблицами Пошаговый рабочий алгоритм выгрузки в EXCEL на примере выгрузки отчетов производства за смену(Автор статьи:
Funny ):
(1) Нарисовать форму обработки и к кнопке запуска прицепить процедуру:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если ПроверкаДат() Тогда
Состояние("Запущена выгрузка данных");
ПолучитьДанныеВТаблице();
Если чОтчетов<>0 Тогда
СортироватьТаблицу();
ВыгрузитьТаблицуВФайл();
ЗакрытьСистему();
Состояние("Выгрузка завершена");
Иначе
//ЗакрытьСистемуАварийно();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
(2) Создадим функцию ПроверкаДат() корректного указания дат обработки
(3) Создадим процедуру ПолучитьДанныеВТаблице() выборки требуемых данных из документов в таблицу значений
(4) Создадим процедуру СортироватьТаблицу() для сортировки таблицы значений как нам нужно
(5) Создадим процедуру ВыгрузитьТаблицуВФайл() выгрузки ТЗ в Excel-файл:
Код 1C v 8.х Процедура ВыгрузитьТаблицуВФайл()
//1. Open Excel-file
Если FileOfReports = Неопределено Тогда
Попытка
FileOfReports = Новый COMОбъект("Excel.Application");
MyBook=FileOfReports.WorkBooks.Add(истина); //вместо истина можно вставить имя шаблона
FirstSheet=MyBook.Worksheets(1);
FirstSheet.Name = ОпределитьДату(НачПериода)+"-"+ОпределитьДату(КонПериода);
FirstSheet.Activate();
MyBook.Save As(КаталогDBF+"ОтчетыПроизводства.xls");
Исключение
Сообщить("ОШИБКА ЗАПИСИ В EXCEL-ФАЙЛ:"+ОписаниеОшибки());
Сообщить("Совет: Возможно файл, в который должна быть произведена запись, Вами открыт для просмотра");
Сообщить("Если это так, то закройте файл и запустите данную обработку повторно!");
КонецПопытки;
FileOfReports.Visible = 0;
Иначе
FileOfReports.Visible = 0;
//FileOfReports.Visible = 1;
КонецЕсли;
//2.=========================================================================
//Состояние("Анализ структуры файла...");
чОтчетов = ТаблицаОтчетов.Количество();
ЭлементыФормы.ИндикаторЗагрузки.МинимальноеЗначение = 0;
ЭлементыФормы.ИндикаторЗагрузки.МаксимальноеЗначение = чОтчетов;
ЭлементыФормы.Logo.Заголовок = "Выгружаю документы";
лСчетчикИндикатора = 0;
ВыгрузитьЗаголовокТаблицы(26);
//ВЫГРУЖАЮ ТАБЛИЦУ В ФАЙЛ ПО СТРОКАМ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
фСтарт=истина; //флаг первого прохода
чОт=2; //номер первой строки с данными
Пока чОтчетов >= 1 Цикл //Цикл по строкам Таблицы отчетов
чОтчетов = чОтчетов -1;
СтрокаОтчетов = ТаблицаОтчетов.Получить(чОтчетов);
Если (СтрокаОтчетов.ДатаВыпуска=ДатаВыпускаПред)
И (СтрокаОтчетов.Принадлежность=ПринадлежностьПред)
И (СтрокаОтчетов.Типоразмер=ТипоразмерПред)
И (СтрокаОтчетов.ТипОсновы=ТипОсновыПред)
Тогда
Иначе
ДатаВыпускаПред=СтрокаОтчетов.ДатаВыпуска;
ПринадлежностьПред=СтрокаОтчетов.Принадлежность;
ТипоразмерПред=СтрокаОтчетов.Типоразмер;
ТипОсновыПред=СтрокаОтчетов.ТипОсновы;
Если фСтарт Тогда
фСтарт = ложь; //Уже не первый проход
Иначе
чДо=глСчетчикСтрок;
ВыгрузитьСтрокуИтог(чОт,чДо,26);
КонецЕсли;
чОт=глСчетчикСтрок;
КонецЕсли;
ВыгрузитьСтрокуОтчетовВФайл(СтрокаОтчетов,26);
лСчетчикИндикатора = лСчетчикИндикатора + 1;
ЭлементыФормы.ИндикаторЗагрузки.Значение = лСчетчикИндикатора;
ОбработкаПрерыванияПользователя();
КонецЦикла;
чДо=глСчетчикСтрок;
ВыгрузитьСтрокуИтог(чОт,чДо,26);
//КОНЕЦ ВЫГРУЗКИ СТРОК В ФАЙЛ
Состояние("Данные файла выгружены");
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libСообщитьНК1("ИНФО: ШАГ 1 ВЫПОЛНЕН. Данные файла Отчеты.DBF успешно считаны",1);
//Состояние("Создание сводных таблиц");
ЭлементыФормы.Logo.Заголовок = "Создание сводных таблиц";
//РазделитьОбласти();
//Range("A2").S_elect
//ActiveWindow.FreezePanes = True
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"наим","Дата","Наим","","К");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"ЮВ","Дата","Наим,Каркас,Вид","","К");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"В пр(2)","Дата","Наим,Каркас,Основа","","К");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"В пр","Дата","Каркас,Основа","","К");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"Основа","Дата","Основа","","кг основы");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"Напыление","","Напылен","","кг напылен");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"Клей","","Дата","","кг клея");
КонецПроцедуры
Процедура СоздатьТаблицуЛист(стрДанные,стрСводнаяТаблица,стрПоле1,стрПоле2,стрПоле3,стрПоле4);
//Создает сводную таблицу стрСводнаяТаблица с полями (стрПоле4 - поле реквизита)
//и размещает ее на одноименном листе
//Заполняет сводную таблицу данными, взятыми с листа стрДанные
//Поле стрПоле2 может быть полем списка через запятую
//0. Вспомогательный разбор списка значений в стрПоле2 и определение числа значений
лПоля.Очистить(); //сбросим все значения, если таковые весели в памяти
стрПоля=стрПоле2;
i=1;//число значений в списке
Пока Найти(стрПоля,",")<>0 Цикл
n=Найти(стрПоля,",");
лПоля.Добавить(Сред(стрПоля,1,n-1));
стрПоля=Сред(стрПоля,n+1);
i=i+1;
КонецЦикла;
лПоля.Добавить(стрПоля);
//1. Установить диапазон выборки данных
FirstSheet.Activate();
дДиапазонДанных=FirstSheet.UsedRange.Address;
ДиапазонДанных=FirstSheet.Name+"!"+Строка(дДиапазонДанных);
//2. Создать кэш под сводную таблицу
// аргументы не переменные, а текст с именем переменных (crazy)
SourceType = xlDatabase;
SourceData = ДиапазонДанных;
Cache = MyBook.PivotCaches().Add(SourceType, SourceData);
//для отладки: FileOfReports.Visible = 1;
//3. Породить из кэша сводную таблицу с именем стрСводнаяТаблица
TableDestination="";
TableName=стрСводнаяТаблица;
Cache.CreatePivotTable(TableDestination,TableName);
//4. Определить представление данных в сводной таблице
//стрПоле1
Если СокрЛП(стрПоле1)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(стрПоле1).Orientation = 3; //xlRowField=1 то, что указывается справа у таблицы
КонецЕсли;
//стрПоле2
чНомер=0;
Пока чНомер<i Цикл
Если СокрЛП(лПоля[чНомер].Значение)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(лПоля[чНомер].Значение).Orientation = 1;
КонецЕсли;
чНомер = чНомер + 1;
КонецЦикла;
//стрПоле3
Если СокрЛП(стрПоле3)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(стрПоле3).Orientation = 2; //xlColumnField=2 то, что указывается в вепрхней части таблицы
КонецЕсли;
//стрПоле4
Если СокрЛП(стрПоле4)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(стрПоле4).Orientation = 4; //xlCount=4 data
КонецЕсли;
//5. Скрыть пустые строки в стрПоле2, предварительно проверив, что таковые СУЩЕСТВУЮТ!!!!
//стрПоле2
чНомер=0;
Пока чНомер<i Цикл
Если СокрЛП(лПоля[чНомер].Значение)<>"" Тогда
Если IfPivotItemExists(TableName,лПоля[чНомер].Значение,"(пусто)")Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(лПоля[чНомер].Значение).PivotItems("(пусто)").Visible = False;
КонецЕсли;
КонецЕсли;
чНомер = чНомер + 1;
КонецЦикла;
//6. Закрыть вспомогательные панели
MyBook.ShowPivotTableFieldList = False;
FileOfReports.CommandBars("PivotTable").Visible = False;
//7. Присвоить активному листу имя, заданное в параметрах процедуры
MyBook.ActiveSheet.Name = стрСводнаяТаблица;
//8. Сохранить файл
MyBook.Save ();
КонецПроцедуры
Функция IfPivotItemExists(strTableName,strFieldName,strItemName)
//Проверяет существование позиции поля сводной таблицы со значением strItemName
nItems = MyBook.ActiveSheet.PivotTables(strTableName).PivotFields(strFieldName).PivotItems().Count;
i = 1;
Пока i <= nItems Цикл
Если strItemName=MyBook.ActiveSheet.PivotTables(strTableName).PivotFields(strFieldName).PivotItems(i).Name Тогда
//Искомая позиция strItemName существует:
//Сообщить("Позиция "+strItemName+" найдена");
Возврат True;
КонецЕсли;
i=i+1;
КонецЦикла;
//Сообщить("Позиция "+strItemName+" не найдена");
Возврат False;
КонецФункции
Код 1C v 7.x РабочаяКнига = СоздатьОбъект("Excel.Application");
РабочаяКнига.SheetsInNewWorkbook = 1;
РабочаяКнига.Caption = "Отчет по договорам отгрузки";
NewBook = РабочаяКнига.Workbooks;
List = NewBook.Add;
СписокСтолбцов = СоздатьОбъект("СписокЗначений");
СписокСтолбцов.ДобавитьЗначение("Модель");
СписокСтолбцов.ДобавитьЗначение("Разнорядка");
СписокСтолбцов.ДобавитьЗначение("По договору");
СписокСтолбцов.ДобавитьЗначение("Отгрузили");
СписокСтолбцов.ДобавитьЗначение("Осталось");
//Заполним наименование столбцов: Модель, Разнорядка, Количество
Для Столбец = 1 По СписокСтолбцов.РазмерСписка() Цикл
Ячейка = РабочаяКнига.Cells(1,Столбец);
Ячейка.Value = СписокСтолбцов.ПолучитьЗначение(Столбец);
КонецЦикла;
//Формируем запрос по регистру
// //Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаНач по ДатаКон;
|Разнорядка = Регистр.УчетДоговоров.Разнорядка;
|Модель = Регистр.УчетДоговоров.Модель.Группа;
|Колво = Регистр.УчетДоговоров.Количество;
|Функция КолвоПриход = Приход(Колво);
|Функция КолвоРасход = Расход(Колво);
|Функция КолвоОст = КонОст(Колво);
|Группировка Разнорядка;
|Группировка Модель;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
НомерСтроки = 1;
Пока Запрос.Группировка("Разнорядка") = 1 Цикл
Пока Запрос.Группировка("Модель") = 1 Цикл
Модель = Запрос.Модель;
Разнорядка = Запрос.Разнорядка;
КолПоДоговору = Запрос.КолвоПриход;
КолОтгрузили = Запрос.КолвоРасход;
КолОсталось = Запрос.КолвоОст;
НомерСтроки = НомерСтроки + 1;
//Организум заполнение ячеек Excel
Для Ст = 1 По СписокСтолбцов.РазмерСписка() Цикл
Ячейка = РабочаяКнига.Cells(НомерСтроки,Ст);
Если Ст = 1 Тогда
Ячейка.Value = Модель;
ИначеЕсли Ст = 2 Тогда
Ячейка.Value = Строка(Разнорядка);
ИначеЕсли Ст = 3 Тогда
Ячейка.Value = КолПоДоговору;
ИначеЕсли Ст = 4 Тогда
Ячейка.Value = КолОтгрузили;
ИначеЕсли Ст = 5 Тогда
Ячейка.Value = КолОсталось;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
СводнаяТаблица = РабочаяКнига.ActiveSheet.PivotTableWizard;
//Метод СводнаяТаблица.Name возвращает имя сводной таблицы
//Можно задать имя таблицы СводнаяТаблица.Name = "МояТаблица"
СводнаяТаблица.SmallGrid = 0;
//Разворачивает макет сводной таблицы
//Обращение к ячейкам сводной таблицы возможно по номеру
//Например, СводнаяТаблица.PivotFields(1).Value
//возвращает значение "Модель"
//Попробуем с другого конца
//1 - Row
//2 - Column
//3 - Page
//4 - Data
СводнаяТаблица.PivotFields(1).Orientation = 1; //Модель
СводнаяТаблица.PivotFields(2).Orientation = 3; //Разнорядка
СводнаяТаблица.PivotFields(3).Orientation = 4; //По договору
СводнаяТаблица.PivotFields(4).Orientation = 4; //Отгрузили
СводнаяТаблица.PivotFields(5).Orientation = 4; //Осталось
//Пройдемся по форме отчета
СводнаяТаблица.Format(1);
//Попробуем закрыть панель инструментов сводной таблицы
РабочаяКнига.CommandBars("PivotTable").Visible = 0;
РабочаяКнига.Visible = 1;
Категория:
Работа с Microsoft Office и OpenOffice Функция проверяет орфографию переданного текста с помощью средств MS Word Код 1C v 8.х // Проверка орфоргафии переданного текста с помощью средств MS Word
// Параметры
// <Текст> – <Строка> – проверяемый текст
// <ДеревоЗначений> – <ДеревоЗначений> – возвращает дерево замен
// Возвращаемое значение:
// <Булево> – Истина, если текст не содержит ошибок
Функция ПроверитьОрфографию(Текст, ДеревоЗначений = Null) Экспорт
Попытка
Ворд = Новый COMОбъект("Word.Application"); //Создаем объект MS Word
Исключение
Предупреждение("Microsoft Word не установлен!",,"Ошибка!");
Возврат Ложь;
КонецПопытки;
ТекстБезОшибок = Ворд.CheckSpelling(Текст); //проверяем нашу строку на ошибки
Если ТекстБезОшибок Тогда // Нет ошибок
Возврат Истина;
Иначе // Обнаружены ошибки, будем проверять по словам
Если ДеревоЗначений <> Null Тогда
Ворд_Активен = Ворд.Visible; //Запомним, был ли Word активен
ВремДок = Ворд.Documents.Add(); //Добавляем к открытым документам
МояОбласть = ВремДок.Range(0, 0); //Получаем пустую область в начале документа
МояОбласть.I_nsertBefore(Текст); //Добавляем в эту область нашу строку
ЧислоСлов = МояОбласть.Words.Count; //Подсчитываем число слов в области
ДеревоЗначений = Новый ДеревоЗначений; //сюда будем записывать слова и варианты их замен
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка"));
ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
ДеревоЗначений.Колонки.Добавить("Слово", ОписаниеТипов, "Слово/Замена",);
wdSpellword=0; //константа Word, указывающая на то, что при при вызове проверки орфографии возвращается множество замен
wdDoNotSave Changes=0; //константа Word, указывающая на то, что при закрытии не надо сохранять изменения в закрываемом документе
Для НомерСлова = 1 По ЧислоСлов Цикл
ОбработкаПрерыванияПользователя();
ПровОбласть = МояОбласть.Words(НомерСлова); //выбираем очередное слово
ПровСлово = СокрЛП(ПровОбласть.Text);
СловоБезОшибок = Ворд.CheckSpelling(ПровСлово); //проверяем наше слово на ошибки
Если НЕ СловоБезОшибок Тогда //получаем варианты замен (их может и не быть!)
Если ДеревоЗначений.Строки.Найти(ПровСлово, "Слово") = Неопределено Тогда
НоваяСтрока = ДеревоЗначений.Строки.Добавить();
НоваяСтрока.Слово = ПровСлово;
Замены = ПровОбласть.GetSpellingSuggestions( ,1, ,wdSpellword); //проверяем орфографию, укзав, что возвращать надо множество замен
ЧислоЗамен = Замены.Count; //получаем число возможных замен
Если ЧислоЗамен > 0 Тогда //заносим варианты замен в таблицу значений
Для НомерЗамены = 1 По ЧислоЗамен Цикл
СловоЗамены = СокрЛП(Замены.Item(НомерЗамены).Name);
НоваяПодСтрока = НоваяСтрока.Строки.Добавить();
НоваяПодСтрока.Слово = СловоЗамены;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ВремДок.Close(wdDoNotSave Changes,,);
Если Не Ворд_Активен Тогда
Ворд.Quit();
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецЕсли;
КонецФункции
Пример использования:
Код 1C v 8.х
Перем ДеревоЗначений;
Состояние("Идет проверка орфографии. Пожалуйста ждите...");
Текст = ЭлементыФормы.ПолеТекстовогоДокумента.ПолучитьТекст(); // Получаем текст
Если ПроверитьОрфографию(Текст, ДеревоЗначений) Тогда // Проверяем орфографию
Предупреждение("Текст ошибок не содержит!!!", 5, "OK");
Иначе
Если ДеревоЗначений.Строки.Количество() > 0 Тогда
// Создаем и открываем форму автозамен...
ФормаВыбора = ЭтотОбъект.ПолучитьФорму("ФормаВыбора");
Для каждого СтрокаДЗ Из ДеревоЗначений.Строки Цикл
Строка = ФормаВыбора.ДеревоЗначений.Строки.Добавить();
Строка.Слово = СтрокаДЗ.Слово;
Для каждого ПодСтрокаДЗ Из СтрокаДЗ.Строки Цикл
ПодСтрока = Строка.Строки.Добавить();
ПодСтрока.Слово = ПодСтрокаДЗ.Слово;
КонецЦикла;
КонецЦикла;
Если ФормаВыбора.ОткрытьМодально() = "OK" Тогда
// Производим автозамены в тексте
Для каждого СтрокаДЗ Из ФормаВыбора.ДеревоЗначений.Строки Цикл
Для каждого ПодСтрокаДЗ Из СтрокаДЗ.Строки Цикл
Если ПодСтрокаДЗ.Пометка Тогда
Текст = СтрЗаменить(Текст, ПодСтрокаДЗ.Родитель.Слово, ПодСтрокаДЗ.Слово);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ЭлементыФормы.ПолеТекстовогоДокумента.УстановитьТекст(Текст); //Вставим в поле исправленный текст
КонецЕсли;
Иначе
Предупреждение("В тексте найдены ошибки, но вариантов автозамены не нашлось!!!", 5, "Ошибка");
КонецЕсли;
КонецЕсли;
Категория:
Работа с Microsoft Office и OpenOffice Запуск макроса в MS Word из 1С Код 1C v 8.х //Пример показывает как из 1С вызывается MS Word, вставляется макрос и запускается!
//Макрос пишет на листе Добрый день!, https://helpf.pro и сохраняет файл в D:/primer.doc
ПримерМакроса = "Sub VBAprimer()
|S_election.TypeText Text:=""Добрый день!""
|Application.Keyboard (1033)
|S_election.TypeText Text:="": https://helpf.pro""
|S_election.TypeParagraph
|S_election.MoveUp Unit:=wdLine, Count:=2
|S_election.EndKey Unit:=wdLine, Extend:=wdExtend
|S_election.Style = ActiveDocument.Styles(""Заголовок 1"")
|S_election.MoveDown Unit:=wdLine, Count:=1
|S_election.HomeKey Unit:=wdLine
|S_election.EndKey Unit:=wdLine, Extend:=wdExtend
|S_election.Style = ActiveDocument.Styles(""Заголовок 2"")
|ActiveDocument.Save As FileName:=""D:/primer.doc"", FileFormat:= _
| wdFormatDocument, LockComments:=False, Password:="""", AddToRecentFiles:= _
| True, WritePassword:="""", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
| False, Save NativePictureFormat:=False, Save FormsData:=False, _
| Save AsAOCELetter:=False
|End Sub";
// Создание объекта
Word = Новый COMОбъект("Word.Application");
Word.Documents.Add();
//VBComponents = Word.VBE.ActiveVBProject.VBComponents;
VBComponents = Word.ActiveDocument.VBProject.VBComponents;
Count = VBComponents.Count();
VBComponents.Add(1);
VBComponents.Item(Count + 1).CodeModule.I_nsertLines(1, ПримерМакроса);
Word.Application.Run(VBAprimer");
Word.Quit();
Word = Неопределено;
Код 1C v 7.x // Если не будет работать - возможно установлен высокий уровень безопасности. Понизьте до среднего ...
Процедура Сформировать()
Попытка
W=СоздатьОбъект("Word.Application");
Исключение
Возврат;
КонецПопытки;
W.Documents.Add();
i = W.VBE.ActiveVBProject.VBComponents.Count();
W.VBE.ActiveVBProject.VBComponents.Add (1);
W.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.I_nsertLines (1, "Sub Golif()");
W.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.I_nsertLines (2, "MsgBox " + """" + "Работает" + """");
W.VBE.ActiveVBProject.VBComponents.Item(i + 1).CodeModule.I_nsertLines (3, "End Sub");
W.Application.Run ("Golif");
W="";
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Получения курса валют из Интернет Код 1C v 8.х Соединение = Новый HTTPСоединение("export.rbc.ru"); //готовим соединение
ИмяФайла = ПолучитьИмяВременногоФайла(".txt");
//строка-образец
//http://export.rbc.ru/free/cb.0/free.fcgi?period=DAILY&tickers=USD&d1=18&m1=01&y1=2009&d2=17&m2=02&y2=2009&lastdays=30&separator=TAB&data_format=BROWSER&header=1
//http://export.rbc.ru/free/cb.5/free.fcgi?period=DAILY&tickers=USDEUR_BASKET&d1=08&m1=07&y1=2009&d2=22&m2=07&y2=2009&lastdays=14&separator=TAB&data_format=BROWSER&header=1
СтрокаСоединения="/free/"+Источник+"/free.fcgi?period=DAILY&tickers="+Валюта1+"&d1="+День1+"&m1="+Месяц1+"&y1="+Год1+"&d2="+День2+"&m2="+Месяц2+"&y2="+Год2+"&separator=%7C&data_format=BROWSER";
СтрокаСоединения=СтрЗаменить(СтрокаСоединения," ","");
Попытка //соединяемся
Соединение.Получить(СтрокаСоединения,ИмяФайла);
Исключение
Сообщить("Невозможно получить курс по адресу http://export.rbc.ru"+СтрокаСоединения);
КонецПопытки;
КурсыТекст=Новый ТекстовыйДокумент; //читаем результат запроса
КурсыТекст.Прочитать(ИмяФайла);
Код 1C v 8.х // еще пример
Функция ПолучитьКакСтроку(Адресс)
соминет = Новый COMОбъект("MSXML2.XMLHTTP");
соминет.open ("GET", Адресс, Ложь);
соминет.send();
Возврат соминет.responseText;
КонецФункции
Функция ПреобразоватьДату(дат)
// Медот преобразования даты времен 1Сv7
//Т=Строка(Дат);
//Возврат Сред(Т,7,4)+"/"+Сред(Т,4,2)+"/"+Лев(Т,2);
Возврат Формат(Дат,"ДФ=""гггг/ММ/дд""");
КонецФункции
Процедура КнопкаЗагрузитьКурсы(Элемент)
//Список - список валют
Для А = 1 по Список.Количество() цикл
Если Список[а-1].Пометка тогда
Сообщить("Загружаем курсы для "+Строка(Список[а-1].Значение));
Код = Строка(Список[а-1].Значение.Код);
Дат = ПериодС;
Пока Дат <= ПериодПо цикл
Стр = ПолучитьКакСтроку("http://cbrates.rbc.ru/tsv/"+Код+"/"+ПреобразоватьДату(Дат)+".tsv");
Поз = Найти(Стр,Символы.Таб);
Если Поз = 0 Тогда
Дат = Дат + 86400;
Продолжить;
КонецЕсли;
Кратность = Число(СокрЛП(Лев(стр,Поз-1)));
курс = Число(СокрЛП(Сред(Стр,Поз+1,СтрДлина(Стр)-Поз)));
Сообщить("Дата="+Строка(Дат)+" Курс="+Строка(курс)+" Кратность="+Строка(Кратность));
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = Дат;
Запись.Валюта = Список[а-1].Значение.Ссылка;
Запись.Курс = Курс;
Запись.Кратность = Кратность;
Запись.Записать(Истина);
Дат = Дат + 86400;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Код 1C v 7.x // Взято с http://www.1c-club.kz IUnknown
//Небольшая обработка для получения курса валют размещенной на странице Национального Банка РК.
//Внимание: работоспособность данной обработки может быть нарушена, если дизайнеры сайта НБ РК изменят формат страницы с //официальным курсом валюта. Но не большой анализ нового формата и работоспособность обработки будет восстановлена.
// шаблон для отображаемой на форме таблице значения
перем тзПустышка;
//*******************************************
// ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
//
// Параметры:
// стрНазвание - Строка. Наименование реквизита формы инициюрующей
// вызов процедуры.
// чисФлаг - Число. Флаг станадартной обработки иницации нажатия
// кнопки выбора значения.
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Переопределенная процедура инициирующая при нажатии кнопки
// выбора значения реквизита формы.
//
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
// Если инициировали из реквизита "стрУРЛа"
если стрНазвание = "стрУРЛа" тогда
// откроем страницу с введенным URL
запуститьприложение(стрУРЛа);
конецесли;
конецпроцедуры
//*******************************************
// кнПолучить()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Процедура получающая курсы валют с URL находящегося в
// строковом реквизите формы "стрУРЛа". Пытается по указаноому URL
// получить страницу и распарсить ее.
//
// ПРЕДУПРЕЖДЕНИЕ:
// В случае измения формата данных представленных на странице, возможно
// будет работать не правильно.
//
процедура кнПолучить()
// сгенирим имя файла для временного хранения содержимого
// страницы курса валют Национального банка
стрИмяФайла = каталогпользователя() + "$$$$.###";
// создадим объект XMLHttpRequest
олеХМЛ = создатьобъект("Microsoft.XMLHTTP");
// иницируем его типом запроса и нужным нам URL
олеХМЛ.Open("GET", стрУРЛа, 0);
// отправим запрос для обработки серверу
олеХМЛ.Send();
// создадим "поток" через ADODDB для работы с данными
олеАДО = создатьобъект("ADODB.Stream");
// зададим тип и режим потока
олеАДО.Mode = 3;
олеАДО.Type = 1;
// откроем его
олеАДО.Open();
// создадим объект для управления скриптами
олеШелл = создатьобъект("MSScriptControl.ScriptControl");
// установим язык сценариев
олеШелл.Language = "vbscript";
// добавим созданные объекты
олеШелл.AddObject("oleADO", олеАДО);
олеШелл.AddObject("oleXML", олеХМЛ);
// с помощью скрипта запишем в поток ADO данные из
// объекта XMLHttpRequest
// то есть содержимое страницы
олеШелл.Eval("oleADO.Write(oleXML.ResponseBody)");
// запишем данные во временный файл
олеАДО.Save ToFile(стрИмяФайла, 2);
// закроем данный поток
олеАДО.Close();
// для ускорения парсера занесем весь файл в строковую
// переменую с разделителем строк
// для этого инициализуруем поток установкой
// соотвествующим режимом и типом
олеАДО.Mode= 3;
олеАДО.Type = 2;
// так как страница курса валют НБК имеет формат
// символов UTF-8, то установим соотвествующий набор
олеАДО.CharSet="UTF-8";
// откроем поток
олеАДО.Open();
// загрузим содержимое нашего файла в поток
олеАДО.LoadFromFile(стрИмяФайла);
// обнулим временную строковую переменную
стрТемп = "";
// в цикле получим из потока все строки
пока олеАДО.EOS() = 0 цикл
// и запишем их во временную переменую, добавив разделитель строк
стрТемп = стрТемп + олеАДО.ReadText(-2) + разделительстрок;
конеццикла;
// закроем поток
олеАДО.Close();
// удалим временный файл
фс.УдалитьФайл(стрИмяФайла);
// найдем в строке позицию начала блока с данными о курсе
чисПозиция = найти(стрТемп, "Официальные курсы валют на");
если чисПозиция = 0 тогда
// если позиции нет ... то мы имем другую страницу
// или другой формат страницы...
предупреждение("Не получилось получить курсы валют");
иначе
// создаим временную таблицу значений
// для более шустрого заполения из-за отстуствия вызова
// функции перерисовки таблицы при изменении данных
тзТемп = создатьобъект("ТаблицаЗначений");
// установим для нее нужный формат
тзПустышка.Выгрузить(тзТемп);
// отрежем все лишнее
стрТемп = сред(стрТемп, чисПозиция);
// получим дату курса
дтКурса = дата(стрзаменить(стрполучитьстроку(стрТемп, 2), "/", "."));
// первая строка с курсом валюты находится на 18 строке от начала
// после удаления мусора
чисПозиция = 18;
// узнаем сколько всего строк в многострочке
чисКоличествоСтрок = стрколичествострок(стрТемп);
// получим строку
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
// если в строке есть подстрока ... то значит это наверное очередная валюта
пока найти(стрТекущая, "input type=""checkbox"" name=""idval""") > 0 цикл
// добавляем новую строку
тзТемп.НоваяСтрока();
// получаем строку со смещением 1 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 1);
// используя фичу 1С по преобразованию, получим число
// за сколько единиц валюты имеем курс в тенге
тзТемп.Количество = число(стрТекущая);
// путем убирания "мусора" получаем наименование валюты
тзТемп.Наименование = сокрлп(стрзаменить(стрзаменить(стрТекущая, тзТемп.Количество, ""), "</td>", ""));
// получаем строку со смещением 2 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 2);
// убираем html мусор
стрТекущая = сокрлп(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// получаем код валюты
тзТемп.Код1 = лев(стрТекущая, 3);
// получаем код валюты "Тенге"
тзТемп.Код2 = прав(стрТекущая, 3);
// получаем строку со смещением 5 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 5);
// очищаем от мусора и преобразуем в число... получаем курс
тзТемп.Курс = число(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// увеличиваем позицию на 17 ...
чисПозиция = чисПозиция + 17;
если чисПозиция > чисКоличествоСтрок тогда
// если позици дальше имеющихся строк
// то все курсов больше нет
стрТекущая = "";
иначе
// получаем очередную строку для разбора
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
конецесли;
конеццикла;
// сформированую таблицу копируем в таблицу на форме
тзТемп.Выгрузить(тзКурсов);
конецесли;
конецпроцедуры
//*******************************************
// установим значение реквизита текущим URL по которому можно получить курс валют
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF82ECF77C1D";
// формируем формат таблицы
тзПустышка = создатьобъект("ТаблицаЗначений");
тзПустышка.НоваяКолонка("Количество", "число", 3, 0, "", 5);
тзПустышка.НоваяКолонка("Наименование", "строка", , , "Наименование", 70);
тзПустышка.НоваяКолонка("Код1", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Код2", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Курс", "число", 7, 2, "Курс", 10);
// копируем получившийся формат в таблицу на форме
тзПустышка.Выгрузить(тзКурсов);
Категория:
COM-объекты, WMI, WSH