Преобразование XLS в MXL Конвертация таблиц из Excel в MXL - скачать Converter Excel v MXL:
Для 8.х -
Скачивать файлы может только зарегистрированный пользователь!
Для 7.7 -
Скачивать файлы может только зарегистрированный пользователь!
Код 1C v 8.х // Выбор файла Microsoft Excel
Procedure FileNameStartChoice(Element, StdProcessing)
StdProcessing = False;
DialogFile = New FileDialog(FileDialogMode.Open);
DialogFile.Filter = "Файлы Microsoft Excel (*.xls)|*.xls";
DialogFile.DefaultExt = "xls";
If DialogFile.Choose() Then
FileName = DialogFile.FullFileName;
End If;
End Procedure // FileNameStartChoice()
// Получить список листов текущей книги
Function GetSheets(ExcelApplication)
ListS_electSheet = New ValueList;
ListS_electSheet.Add(0, "Все листы");
NumberSheet = 0;
For FirstSheet = 1 To ExcelApplication.Worksheets.Count Do
NumberSheet = NumberSheet + 1;
ListS_electSheet.Add(
NumberSheet, ExcelApplication.WorkSheets(NumberSheet).Name
);
End Do;
Return ListS_electSheet;
End Function // GetSheets()
// Преобразование XLS в MXL
Procedure ButtonExecuteClick()
If IsBlankString(FileName) Then
DoMessageBox("Не указано имя файла");
Return;
End If;
Try
ExcelApplication = GetCOMObject(FileName); // Excel.Application
Except
DoMessageBox("Ошибка чтения файла: " + FileName + " возможно защищен паролем.");
Return;
End Try;
S_electSheet = 0;
S_electSheet = GetSheets(ExcelApplication).ChooseItem("Выберите лист", S_electSheet);
If S_electSheet = Undefined Then
Return;
End If;
S_electNumberSheet1 = S_electSheet.Value;
S_electNumberSheet2 = S_electNumberSheet1;
If S_electNumberSheet1 = 0 Then
S_electNumberSheet1 = 1;
S_electNumberSheet2 = ExcelApplication.Worksheets.Count
End If;
frmProgressBar = GetForm("FormProgressBar");
frmProgressBar.Caption = "Обрабатывается файл: " + FileName;
frmProgressBar.Controls.ProgressBarAll.MaxValue = S_electNumberSheet2;
frmProgressBar.Controls.ProgressBarAll.Value = 0;
For NumberSheet = S_electNumberSheet1 To S_electNumberSheet2 Do
frmProgressBar.Open();
SprDoc = New SpreadsheetDocument;
Try
WorkSheet = ExcelApplication.Sheets(NumberSheet).UsedRange;
Except
DoMessageBox(ErrorDescription());
Return;
End Try;
AllStrings = WorkSheet.Rows.Count; // Всего строк
AllColumns = WorkSheet.Columns.Count; // Всего колонок
AllCells = AllStrings * AllColumns; // Все ячейки
frmProgressBar.Controls.InfoProgressBarAll.Value = "Обрабатывается лист № " +
NumberSheet + " из " +
S_electNumberSheet2;
frmProgressBar.Controls.ProgressBarAll.Value = frmProgressBar.Controls.ProgressBarAll.Value + 1;
If AllCells < 2 Then
Continue; // Пустой лист
End If;
frmProgressBar.Controls.ProgressBarCur.MaxValue = AllStrings;
frmProgressBar.Controls.ProgressBarCur.Value = 0;
For CurrentString = 1 To AllStrings Do
For CurrentColumn = 1 To AllColumns Do
frmProgressBar.Controls.InfoProgressBarCur.Value = "Обрабатывается строка №: " +
TrimAll(CurrentString) +
" из " + AllStrings +
", колонка №: " +
TrimAll(CurrentColumn) +
" из " + AllColumns;
Try
CurrentCell = WorkSheet.Cells(
CurrentString,
CurrentColumn
);
SlcCell = SprDoc.Area(
CurrentString,
CurrentColumn,
CurrentString,
CurrentColumn
);
SlcCell.RowHeight = CurrentCell.RowHeight;
SlcCell.ColumnWidth = CurrentCell.ColumnWidth;
// Горизонтальное положение
SlcCell.HorizontalAlign = mListHorizontalAlign.Get(
Format(CurrentCell.HorizontalAlignment, "NG=0")
);
// Вертикальное положение
SlcCell.VerticalAlign = mListVerticalAlign.Get(
Format(CurrentCell.VerticalAlignment, "NG=0")
);
// Размещение текста
SlcCell.TextPlacement = ?(
CurrentCell.WrapText = 0,
SpreadsheetDocumentTextPlacementType.Auto,
SpreadsheetDocumentTextPlacementType.Wrap
);
FontCell = CurrentCell.Font;
// Цвет фона
SlcCell.BackColor = mColorRGB(
CurrentCell.Interior.Color
);
// Цвет текста
SlcCell.TextColor = mColorRGB(
FontCell.Color
);
SlcCell.Font = New Font(
FontCell.Name,
Number(FontCell.Size),
?(Number(FontCell.Bold) = 0,
False, True),
?(Number(FontCell.Italic) = 0,
False, True),
?(Format(Number(FontCell.Underline),"NG=0") = "-4142",
False, True),
?(FontCell.Strikethrough, // Зачеркнутый шрифт
True, False)
);
SlcCell.Text = CurrentCell.Value;
// Рамка
Try
SlcCell.LeftBorder = mStyleBorder(CurrentCell, 7);
SlcCell.TopBorder = mStyleBorder(CurrentCell, 8);
SlcCell.RightBorder = mStyleBorder(CurrentCell, 10);
SlcCell.BottomBorder = mStyleBorder(CurrentCell, 9);
Except
End Try;
SlcCell.Details = CurrentCell.Formula;
// Объединение ячеек
If (CurrentCell.MergeCells <> 0) and
(Find(CurrentCell.MergeArea.Rows.Address(,, 2),
CurrentCell.Address(,, 2)) = 1) Then
SlcCell = SprDoc.Area(
CurrentString,
CurrentColumn,
(CurrentString + CurrentCell.MergeArea.Rows.Count - 1),
(CurrentColumn + CurrentCell.MergeArea.Columns.Count - 1)
);
SlcCell.Merge();
End If;
Except
Message(ErrorDescription());
End Try;
End Do;
frmProgressBar.Controls.ProgressBarCur.Value = frmProgressBar.Controls.ProgressBarCur.Value + 1;
UserInterruptProcessing(); // Прерывание пользователя Ctrl+Break
End Do;
SprDoc.Show("" + TrimAll(FileName) + ", лист " + NumberSheet,"");
End Do;
frmProgressBar.Close();
ExcelApplication = "";
End Procedure // ButtonExecuteClick()
Категория:
Работа с Microsoft Office и OpenOffice Как в 1C загрузить из Word текст? Как в 1C из Microsoft Office Word 2007 внести текст?
Код получения текста из файла word:
Код 1C v 8.х Wk = Новый COMОбъект("Word.Application");
//Покажем открываемый документ
Wk.Visible = Истина; Wk.Documents.Open("D:\file.doc");
Документ = Wk.ActiveDocument();
// перебирая строки выводим текст
Для н = 1 по Документ.Sentences.Count Цикл
Текст=Документ.Sentences(н).Text;
Сообщить(Текст);
КонецЦикла;
Документ.Close();
Wk.Quit();
Рассмотрим приёмы получения статистической информации о документе, его составе и т.д.:
'получить общее количество символов в активном документе
' (буквы, цифры, пробелы, переход на новую строку и т.д)
WordApp.ActiveDocument.Characters.Count
'получить символ по его индексу
WordApp.ActiveDocument.Characters(14).Text
'изменить символ по его индексу
WordApp.ActiveDocument.Characters(14).Text="е" 'можно несколько "еёе"
Только не забывайте, что заменив один символ несколькими, вы измените общее количество символов в документе. Поэтому осторожнее при применении циклов. Это также касается и следующего кода.
'получаем количество слов в документе
'(переход на новую строку считается словом)
DocWord.Words.Count
'получить слово по его индексу
DocWord.Words(2).Text
'изменить слово по его индексу
DocWord.Words(2).Text="текст" 'можно несколько слов "Новый текст"
'получить количество параграфов (абзацев) в документе
WordApp.ActiveDocument.Paragraphs.Count
'получить текст параграфа по его индексу
WordApp.ActiveDocument.Paragraphs(2).Range.Text
'изменить текст параграфа по его индексу
WordApp.ActiveDocument.Paragraphs(2).Range.Text="Много текста. Много " & _
" предложений. И так далее!"
'получить количество предложений в документе
WordApp.ActiveDocument.Sentences.Count
'получить текст предложения по его индексу
WordApp.ActiveDocument.Sentences(1).Text
'получить количество предложений во втором параграфе
WordApp.ActiveDocument.Paragraphs(2).Range.Sentences.Count
'получить текст предложения 1 в параграфе 2
WordApp.ActiveDocument.Paragraphs(2).Range.Sentences(1).Text
'получить текст слова 2, в предложении 1,в параграфе 2
WordApp.ActiveDocument.Paragraphs(2).Range.Sentences(1).Words(2).Text
'добавить новую секцию (раздел)
'создаёт новый раздел на новом листе
DocWord.Sections.Add
'создаёт новый раздел на текущем листе
DocWord.Application.S_election.I_nsertBreak (wdSectionBreakContinuous) '(3)
'получить количество секций в документе
DocWord.Sections.Count
'получить текст слова 2, в предложении 1,в параграфе 2, в секции 1.
DocWord.Sections(1).Range.Paragraphs(1).Range.Sentences(1).Words(2).Text
Используя Встроенные_Свойства_Документа получаем его статистические данные.
'получаем количество страниц (листов) в документе
WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyPages) '(14)
'получаем количество строк в документе
WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyLines) '(23)
'получаем количество слов в документе
WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyWords) '(15)
'получаем количество параграфов (абзацев) в документе
WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyParas) '(24)
'и т.д.
Рассмотрим примеры кода для передвижения по документу, а также поиска и замены текста.
Метод .GoTo (перейти к) позволяет вам переместиться на нужную позицию в документе. Он при прямом вызове возвращает новую позицию курсора.
'переход на лист с именем "1"
'если не указать в конце .S_elect, то код просто выдаст положение курсора
DocWord.Application.S_election.GoTo(wdGoToPage, , , "1").S_elect
wdGoToSection (0) - перейти к секции ; wdGoToPage (1) - перейти к листу ;
wdGoToTable (2) - перейти к таблице ; wdGoToLine (3) - перейти к строке ;
wdGoToFootnote (4) - перейти к сноске ; wdGoTo
End note (5) - к примечанию ;
wdGoToComment (6) - к комментарию ; wdGoToField (7) - к полю ;
wdGoToHeading (11) - к заголовку ;
wdGoToSpellingError (13) - к орфографической ошибке ;
wdGoToGrammaticalError (14) - к грамматической ошибке.
'переход на лист с индексом 1
DocWord.Application.S_election.GoTo(3, , 1, "").S_elect
'переход в начало строки с индексом 1
DocWord.Application.S_election.GoTo(3, , 1, "").S_elect
'переход в начало следующей строки (аналогично текущий_индекс+1)
DocWord.Application.S_election.GoTo(3, wdGoToNext, 1, "").S_elect
wdGoToNext (2) - на следующий ; wdGoToPrevious (3) - на предыдущий.
Поиск и замена:
'находим первое вхождение текста и выделяем его
WordApp.Application.S_election.Find.Text = "строка"
WordApp.Application.S_election.Find.Execute
'находим первое вхождение текста
WordApp.Application.S_election.Find.Text = "строка"
' и заменяем только его
WordApp.Application.S_election.Find.Replacement.Text = "1 строчка"
WordApp.Application.S_election.Find.Wrap = wdFindContinue
WordApp.Application.S_election.Find.Execute Replace:= wdReplaceOne '(1)
'или тоже самое, но другим способом (при повторном выполнении кода, заменится следующее слово)
WordApp.ActiveDocument.Content.Find.Execute _
FindText:="текста", ReplaceWith:="hello", Replace:= wdReplaceOne '(1)
Для замены всех вхождений текста применяйте wdReplaceAll (2).
Категория:
Работа с Microsoft Office и OpenOffice Обмен данными 1Сv8 Управление Торговлей 10.1 и virtuemart Задача: создать обмен 1с v8 управление торговлей 10.1 и virtuemart .
Что такое VM можно почитать тут www.virtuemart.ru, вкраце - это компонент интернет магазина/каталога товаров к известному CMS движку Joomla.
Код 1C v 8.х Процедура СнятиеФлагаПустыхГрупп(Кнопка)
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=хххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
RSIDProduct= Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
Сообщить (Строка (ТекущаяДата()) + " обновляем флаг пустых групп");
Запрос =Новый Запрос;
ЗАпрос.Текст ="ВЫБРАТЬ РАЗЛИЧНЫЕ
| Номенклатура.ЭтоГруппа,
| Номенклатура.НеОтображатьWeb,
| Номенклатура.НеОтображатьНикогда,
| Номенклатура.Код КАК Код,
| Номенклатура.Артикул,
| Номенклатура.ПустойОстаток
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ИСТИНА";
// | И (Номенклатура.ПустойОстаток = ИСТИНА
// | ИЛИ Номенклатура.НеОтображатьWeb = ИСТИНА
// | ИЛИ Номенклатура.НеОтображатьНикогда = ИСТИНА)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ПустойОстаток ИЛИ Выборка.НеОтображатьНикогда ИЛИ Выборка.НеОтображатьWEB Тогда
АпдейтГрупп = "UPD ATE jos_vm_category SET category_publish='N' WHERE category_description='"+Выборка.Код+"'" ;
Иначе
АпдейтГрупп = "UPD ATE jos_vm_category SET category_publish='Y' WHERE category_description='"+Выборка.Код+"'" ;
КонецЕсли;
Command.CommandText = АпдейтГрупп;
Command.CommandType = 1;
Попытка
РекордСет = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура КнопкаВыполнитьНажатие(Кнопка)
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=ххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
RSIDProduct= Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
// выберем запросом все группы товаров
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.ПометкаУдаления,
| Номенклатура.Предопределенный,
| Номенклатура.Родитель,
| Номенклатура.ЭтоГруппа,
| Номенклатура.Код,
| Номенклатура.Наименование,
| Номенклатура.НеОтображатьWeb,
| Номенклатура.НеОтображатьНикогда,
| Номенклатура.Артикул,
| Номенклатура.ПустойОстаток
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ИСТИНА";
// | И Номенклатура.Родитель = &Родитель";
// Запрос.УстановитьПараметр("Родитель",Справочники.Номенклатура.ПустаяСсылка());
Результат = Запрос.Выполнить();
Выборка= Результат.Выбрать();
ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Выборка.Количество();
н=0;
Пока Выборка.Следующий() Цикл
н=н+1;
// запрос существования товара в базе виртуемарта
query = "
|SEL ECT category_id
|FR OM jos_vm_category WHERE category_description='"+Выборка.Код+"' limit 1";
RSIDProduct.CursorType = 3;
RSIDProduct.Open(query, Connection);
Если RSIDProduct.EOF() И RSIDProduct.BOF() Тогда
СтрН = СтрЗаменить(Строка(н)," ","");
//пишем группы верхнего уровня
// если группа имеет признак того что-бы ее не выгружать на web то отменим публикацию // необходимо для оптимизации добавить рекурсию по родительскому каталогу
Если Выборка.НеОтображатьWeb или Выборка.НеОтображатьНикогда или Выборка.Родитель.НеОтображатьНикогда или Выборка.Родитель.НеОтображатьWeb или Выборка.ПустойОстаток
Тогда
query = "ins ert into jos_vm_category (vend or_id , category_name ,category_description, category_publish , category_browsepage , products_per_row , category_flypage, list_order )
|values ('1' , '"+Выборка.НАИМЕНОВАНИЕ+"' ,'"+Выборка.Код+"', 'N', 'managed' , '1' , 'flypage.tpl', '1')";
// иначе публикуем
Иначе
query = "ins ert into jos_vm_category (
|vend or_id ,
|category_name ,
|category_description,
|category_publish ,
|category_browsepage ,
|products_per_row ,
|category_flypage,
|list_order )
|values ('1' , '"+Выборка.НАИМЕНОВАНИЕ+"' ,'"+Выборка.Код+"', 'Y', 'managed' , '1' , 'flypage.tpl', '1')";
КонецЕсли;
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
Сообщить (Выборка.Код);
Сообщить (Формат (н,"ЧГ=0"));
КонецПопытки;
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.Код+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИДГруппы = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
query = "ins ert into jos_vm_category_xref ( `category_parent_id` , `category_child_id` )
|values ( '"+0+"' , '"+Формат(ИДгруппы,"ЧГ=0")+"' )";
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (Выборка.Код);
Сообщить(ОписаниеОшибки());
КонецПопытки;
ОбработкаПрерыванияПользователя();
// Состояние("Обновляем группу товаров " + Выборка.Наименование);
КонецЕсли;
Индикатор1=н;
RSIDProduct.Close();
КонецЦикла;
Сообщить ("обновлено " + н+ " групп");
// обновим статус публикацию групп
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.ПометкаУдаления,
| Номенклатура.Предопределенный,
| Номенклатура.Родитель.Код КАК КодРодителя,
| Номенклатура.ЭтоГруппа,
| Номенклатура.Код,
| Номенклатура.Наименование,
| Номенклатура.НеОтображатьWeb,
| Номенклатура.НеОтображатьНикогда
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ИСТИНА
| И (НЕ Номенклатура.Родитель = &Родитель)";
Запрос.УстановитьПараметр("Родитель",Справочники.Номенклатура.ПустаяСсылка());
Результат = Запрос.Выполнить();
Выборка= Результат.Выбрать();
ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Выборка.Количество();
н=0 ;
Сообщить ("Строим структуру...");
Пока Выборка.Следующий() Цикл
н=н+1;
// Если не Выборка.Ссылка.Уровень=0 тогда
//1 найдем айди родителя и категории в виртуамарте
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.КодРодителя+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИДРодителя = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.Код+"' limit 1";
RS.Open(query, Connection);
Попытка
RS.MoveFirst();
Исключение
Сообщить (Выборка.Код);
КонецПопытки;
Пока RS.EOF() = 0 Цикл
ИДГруппы = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
//найдем и завалим запись в категории
query = "delete fr om jos_vm_category_xref where category_child_id='"+Формат(ИДгруппы,"ЧГ=0")+"'";
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (Выборка.Код);
Сообщить(ОписаниеОшибки());
КонецПопытки;
// добавим запись в категорию
query = "ins ert into jos_vm_category_xref ( category_parent_id , category_child_id)
|values ( '"+Формат(ИДРодителя,"ЧГ=0")+"' , '"+Формат(ИДгруппы,"ЧГ=0")+"' )";
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (Выборка.Код);
Сообщить(ОписаниеОшибки());
КонецПопытки;
Индикатор1=н;
// КонецЕсли;
КонецЦикла;
Сообщить ("обновлена структура " + н+ " групп");
// RS.Close();
Connection.Close();
КонецПроцедуры
Процедура ОсновныеДействияФормыОчистьТАблицыSQL(Кнопка)
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=ххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
query ="
|DELETE FR OM jos_vm_category";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_category_xref";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_product";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_product_category_xref";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_product_price";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
// RS.Close();
Connection.Close();
КонецПроцедуры
Процедура ОсновныеДействияФормыОбновитьТовары(Кнопка)
Сообщить (Строка (ТекущаяДата()) + " обновляем группы товаров...");
КнопкаВыполнитьНажатие(1);
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=ххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
RSIDProduct = Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
Склад = Константы.СкладРозница.Получить();
Сообщить (Строка (ТекущаяДата()) + " распубликовываем отсутсвующие товары");
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Остаток,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Артикул КАК Артикул,
| ЕСТЬNULL(ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0), 0) КАК ДоступноеКоличество,
| ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) КАК Заказы
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&КонецДня, СкладКомпании = &Склад) КАК ОстаткиТоваровКомпанииОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки(&КонецДня, ) КАК ЗаказыПокупателейОстатки
| ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЗаказыПокупателейОстатки.Номенклатура
|ГДЕ
| ОстаткиТоваровКомпанииОстатки.Заказ = &ПустойЗаказ
| И ЕСТЬNULL(ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0), 0) > 0
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр = 0)
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр2 = 0)";
Запрос.УстановитьПараметр("ПустойЗаказ", Документы.ЗаказПокупателя.ПустаяСсылка());
Запрос.УстановитьПараметр("Склад",Склад );
Запрос.УстановитьПараметр("КонецДня",КонецДня (ТекущаяДата()));
// Запрос.УстановитьПараметр("Артикул",Артикул);
ТЗостатоков = Запрос.Выполнить().Выгрузить();
// ТЗостатоков.ВыбратьСтроку();
query = "
|SEL ECT product_sku, product_id
|FR OM jos_vm_product";
RS.Open(query, Connection);
Если (НЕ RS.EOF()) И (НЕ RS.BOF()) Тогда
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
Артикул = RS.Fields("product_sku").Value;
ПродуктИД = RS.Fields("product_id").Value;
// Если Выборка.Количество()= 0 Тогда
Если ТЗостатоков.Найти(Артикул,"Артикул")= Неопределено Тогда
АпдейтВиртмарта = "UPD ATE jos_vm_product SET product_in_stock= '0',product_publish='N' WHERE product_sku='"+Артикул+"'" ;
Command.CommandText = АпдейтВиртмарта;
Command.CommandType = 1;
Попытка
РекордСет = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
RS.MoveNext();
КонецЦикла;
КонецЕсли;
RS.Close();
//** модуль обновление цен
Сообщить (Строка (ТекущаяДата()) + " начинаем обновление цен на сайте...");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Остаток,
| ОстаткиТоваровКомпанииОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Код КАК Код,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Артикул КАК Артикул,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Наименование КАК Наименование,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.Код КАК РодительКОД,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.Артикул КАК РодительАртикул,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр КАК WEbЦЕнаУПР,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр2 КАК WEbЦЕнаУПР2,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.НеВыводитьНаСайт КАК НеВыводитьНаСайт,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.НеОтображатьWeb КАК НеОтображатьWeb,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.НеОтображатьНикогда КАК НеОтображатьНикогда,
| ЕСТЬNULL(ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0), 0) КАК ДоступноеКоличество,
| ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) КАК Заказы
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&КонецДня, СкладКомпании = &Склад) КАК ОстаткиТоваровКомпанииОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки(&КонецДня, ) КАК ЗаказыПокупателейОстатки
| ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЗаказыПокупателейОстатки.Номенклатура
|ГДЕ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток > 0
| И ОстаткиТоваровКомпанииОстатки.Заказ = &ПустойЗаказ
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр = 0)
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр2 = 0)";
Запрос.УстановитьПараметр("ПустойЗаказ", Документы.ЗаказПокупателя.ПустаяСсылка());
Запрос.УстановитьПараметр("Склад", Справочники.СкладыКомпании.НайтиПоКоду("00002"));
Запрос.УстановитьПараметр("КонецДня",КонецДня(ТекущаяДата()));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Выборка.Количество();
н=0 ;
ЗапросКурса = Новый Запрос;
ЗапросКурса.Текст = "ВЫБРАТЬ
| КурсыВалютСрезПоследних.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&ТекущаяДата, ) КАК КурсыВалютСрезПоследних
|ГДЕ
| КурсыВалютСрезПоследних.Валюта = &Валюта";
ЗапросКурса.УстановитьПараметр("Валюта", Константы.ВалютаУправленческогоУчетаКомпании.Получить());
ЗапросКурса.УстановитьПараметр("ТекущаяДата",КонецДня(ТекущаяДата()));
ВыборкаКурса = ЗапросКурса.Выполнить().Выбрать();
Пока ВыборкаКурса.Следующий() Цикл
Курс = ВыборкаКурса.Курс;
КонецЦикла;
Пока Выборка.Следующий() Цикл
н=н+1;
// Если Выборка.ДоступноеКоличество < 0 Тогда ДОступноеКоличество=0; Иначе ДОступноеКоличество=Выборка.ДоступноеКоличество; КонецЕсли;
ДОступноеКоличество=Выборка.ДоступноеКоличество;
// Сообщить (Выборка.Номенклатура.Наименование + " " + ДОступноеКоличество);
флагсуществования=Ложь;
// убираем непорядочные символы
Наименование = СтрЗаменить(Выборка.Наименование,"'"," "); //уберем символ '
// запрос существования товара в базе виртуемарта
query = "
|SEL ECT *
|FR OM jos_vm_product WHERE product_sku='"+Выборка.Артикул+"' limit 1";
RSIDProduct.Open(query, Connection);
Если RSIDProduct.EOF() И RSIDProduct.BOF() Тогда
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьНикогда=Ложь; Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьWeb=Ложь Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
Если ПРО2 Тогда Цена = ВЫборка.WEbЦЕнаУПР2; Иначе Цена = Выборка.WEbЦЕнаУПР; КонецЕсли;
Если Выборка.НеВыводитьНаСайт Тогда
// флаги отображения на сайте
//Если Выборка.НеВыводитьНаСайт или Выборка.НеОтображатьНикогда или Выборка.НеОтображатьWeb Тогда
query = "ins ert into jos_vm_product ( vend or_id , product_parent_id , product_sku , product_s_desc , product_publish , product_special , product_discount_id , product_name , product_unit , quantity_options, product_order_levels, product_in_stock, product_sales,product_url )
|values ( '1', '0', '"+Выборка.Артикул+"', '"+наименование+"', 'N', 'N', '0', '"+наименование+"', 'шт.', 'none,0,0,1', '0,0','"+Формат (ДОступноеКоличество, "ЧГ=0")+"','"+Формат (Цена*Курс,"ЧГ=0")+"','http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"')";
Иначе
query = "ins ert into jos_vm_product ( vend or_id , product_parent_id , product_sku , product_s_desc , product_publish , product_special , product_discount_id , product_name , product_unit , quantity_options, product_order_levels, product_in_stock, product_sales, product_url )
|values ( '1', '0', '"+Выборка.Артикул+"', '"+наименование+"', 'Y', 'N', '0', '"+наименование+"', 'шт.', 'none,0,0,1', '0,0','"+Формат (ДОступноеКоличество, "ЧГ=0")+"','"+Формат (Цена*Курс,"ЧГ=0")+"','http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"')";
КонецЕсли;
// запишем номенклатуру
// Сообщить (query);
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
RSIDProduct.Close();
флагсуществования =Ложь;
Иначе
флагсуществования=Истина;
// выполним пока не нужный запрос /// данные об изменении в номенклатуре
//RSIDProduct.MoveFirst();
//Пока RSIDProduct.EOF() = 0 Цикл
// ИД = RSIDProduct.Fields("product_id").Value;
// RSIDProduct.MoveNext();
//КонецЦикла;
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьНикогда=Ложь; Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьWeb=Ложь Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
Если ПРО2 Тогда Цена = ВЫборка.WEbЦЕнаУПР2; Иначе Цена = Выборка.WEbЦЕнаУПР; КонецЕсли;
Если Выборка.НеВыводитьНаСайт Тогда
query = "UPD ATE jos_vm_product SET product_sku='"+Выборка.Артикул+"', product_s_desc= '"+наименование+"',product_in_stock= '"+Формат (ДОступноеКоличество, "ЧГ=0")+"',product_sales='"+Формат (Цена*Курс,"ЧГ=0")+"',product_url='http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"',product_publish='N' WHERE product_sku='"+Выборка.Артикул+"'" ;
Иначе
query = "UPD ATE jos_vm_product SET product_sku='"+Выборка.Артикул+"', product_s_desc= '"+наименование+"',product_in_stock= '"+Формат (ДОступноеКоличество, "ЧГ=0")+"',product_sales='"+Формат (Цена*Курс,"ЧГ=0")+"',product_url='http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"',product_publish='Y' WHERE product_sku='"+Выборка.Артикул+"'" ;
КонецЕсли;
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
RSIDProduct.Close();
КонецЕсли;
// Попытка записать Данные о товаре
Попытка
// запрос ID родителя товара
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.РодительКод+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИДгрупы = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
//Обновление группы
// запрос айди товара в мускуле виртуемарта
// Сообщить (Выборка.Номенклатура.Артикул);
query = "
|SEL ECT *
|FR OM jos_vm_product WHERE product_sku='"+Выборка.Артикул+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИД = RS.Fields("product_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
Если НЕ флагсуществования Тогда
query = "ins ert into jos_vm_product_category_xref (category_id , product_id ) values ( '"+Формат(ИДгрупы,"ЧГ=0")+"' , '"+Формат(ИД,"ЧГ=0")+"' )";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
Иначе
query = "UPD ATE jos_vm_product_category_xref SET category_id='"+Формат(ИДгрупы,"ЧГ=0")+"' WHERE product_id='"+Формат(ИД,"ЧГ=0")+"'";
// "UPD ATE jos_vm_product_category_xref SET category_id='"+Формат(ИДгрупы,"ЧГ=0")+"', product_id='"+Формат(ИД,"ЧГ=0")+"' WHERE product_id='"+Формат(ИД,"ЧГ=0")+"' " ;
// Сообщить (query);
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
КонецЕсли;
// прибьем ценник товара
query = "delete fr om jos_vm_product_price WHERE product_id='"+Формат(ИД,"ЧГ=0")+"' " ;
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
// все поля важны !
query = "I_nsert into jos_vm_product_price (
|product_id,
|product_price,
|product_currency,
|product_price_vdate,
|product_price_edate,
|cdate,
|mdate,
|shopper_group_id,
|price_quantity_start,
|price_quantity_end )
|values ( '"+Формат(ИД,"ЧГ=0")+"' , '"+Формат (Цена*Курс,"ЧГ=0")+"','RUB',0,0,1222792314,1222792314,'5',0,0 )";
// Сообщить(Формат(ИД,"ЧГ=0"));
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Исключение
Сообщить (ОписаниеОшибки());
Сообщить (Выборка.Наименование);
КонецПопытки;
ОбработкаПрерыванияПользователя();
// Состояние("Обновляем товары " + Выборка.Номенклатура.Наименование);
Индикатор1 = н;
КонецЦикла;
Сообщить ("Выгружено " + н + " объектов");
Сообщить(Строка (ТекущаяДата()) + " обновление завершено");
КонецПроцедуры
Процедура Автомат ()
ОсновныеДействияФормыОбновитьТовары(1);
КонецПроцедуры
Процедура ПустыеГруппы()
СнятиеФлагаПустыхГрупп(1);
КонецПроцедуры
Процедура ОсновныеДействияФормыАвтомат(Кнопка)
ЭтаФорма.ПодключитьОбработчикОжидания("автомат", 3600);
ЭтаФорма.ПодключитьОбработчикОжидания("ПустыеГруппы", 5400);
ЭтаФорма.ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Автомат.Доступность = Ложь;
КонецПроцедуры
d.snissarenko Категория:
Конвертация данных, Обмен, Перенос Создание писем, событий и задач в MS Outlook из 1С Отправка писем из 1С Предприятия – одна из самых необходимых функций, отсутствующая в штатном функционале платформы. Один из вариантов реализации – это подключение к MS Outlook по технологии OLE. В статье приведены примеры создания писем, событий и задач в MS Outlook из 1С. Автоматическое создание событий и задач используется не часто, но порой бывает очень удобно.
Для 1С 8.х замените
Код 1C v 7.x Outlook = СоздатьОбъект("Outlook.Application");
на
Код 1C v 8.х Outlook = Новый COMОбъект("Outlook.Application");
так же посмотрите:
Отправка почтового сообщения на локальный MS Office Outlook с вложенным файлом
Создание сообщения
Код 1C v 7.x //создать новое сообщение из 1С в MS Outlook
Процедура СоздатьПисьмо(Адрес,ПутьКВложению)
Попытка
Outlook = СоздатьОбъект("Outlook.Application");
ЕстьОшибка = 0;
Исключение
Предупреждение("Не удалось создать объект Outlook.Application");
ЕстьОшибка = 1;
КонецПопытки;
Если ЕстьОшибка = 0 Тогда
Письмо = Outlook.CreateItem(0);
Письмо.Subject = "Тема письма";
Письмо.Body = "Текст письма";
Письмо.Recipients.Add(Адрес);
Если ФС.СуществуетФайл(ПутьКВложению)=1 Тогда
Письмо.Attachments.Add(ПутьКВложению);
КонецЕсли;
Письмо.Display();
Иначе
Тема = "Тема письма";
ТекстПисьма = "Текст письма";
СтрокаЗапуска = "mailto:" + Адрес + "?subject=" + Тема + "&body=" + ТекстПисьма;
ЗапуститьПриложение(СтрокаЗапуска);
КонецЕсли;
КонецПроцедуры
Создание события
Код 1C v 7.x //создать запись в календаре событий из 1С в MS Outlook
Процедура СоздатьСобытие()
Попытка
Outlook = СоздатьОбъект("Outlook.Application");
Исключение
Предупреждение("Не удалось создать объект Outlook.Application");
Возврат;
КонецПопытки;
Событие = Outlook.CreateItem(1);
Событие.Subject = "Название события";
Событие.Start = "15.01.2010 15:00:00";
Событие.End = "15.01.2010 16:00:00";
Событие.Body = "Описание события";
Событие.Location = "Место события";
Событие.ReminderMinutesBeforeStart = 15;
Событие.BusyStatus = 0;
Событие.MeetingStatus = 0;
Событие.Sensitivity = 2;
Событие.Save();
Сообщить("Событие в календаре создано успешно","i");
КонецПроцедуры
Создание задачи
Код 1C v 7.x //создать новую задачу из 1С в MS Outlook
Процедура СоздатьЗадачу(ДатаСтартаЗадачи)
Попытка
Outlook = СоздатьОбъект("Outlook.Application");
Исключение
Предупреждение("Не удалось создать объект Outlook.Application");
Возврат;
КонецПопытки;
Задача = Outlook.CreateItem(3);
Задача.Subject = "Название задачи";
Задача.StartDate = ДатаСтартаЗадачи;
Задача.Body = "Описание задачи";
Задача.Status = 0;
Задача.Display();
Задача.Importance = 2;
Задача.ReminderSet = 1;
Задача.ReminderTime = "" + ДатаСтартаЗадачи + " 9:00:00";
//Задача.Save();
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Имитация (программное) нажатия Клавиш В системе "1С:Предприятие" часто возникает ситуация, когда нужно закрыть окно сообщений, появляющееся при вызове метода Сообщить. Стандартно это окно закрывается при нажатии комбинации клавиш <Ctrl>+<Shift>+<Z>, но можно сделать это и программно.
Код 1C v 8.х //В ходе выполнения некоторого кода открывается окно сообщений
Сообщить("Сегодня: " +ТекущаяДата());
//Выполнение другой части кода
//Теперь нам необходимо закрыть окно сообщений
Wsh = Новый СОМОбъект("Wscript.shell");
//Wsh - переменная. Можно было дать любое другое имя, например Окно
Wsh.Send Keys("^+z"); //имитируем нажатие Ctrl+Z
Wsh.Send Keys("^+я"); //для случая, если текущей является русская раскладка клавиатуры
В результате выполнения данного кода окно сообщений будет закрыто. Теперь поясним работу этого небольшого куска программы. S
end Keys(String) - имитируется нажатие клавиши или последовательности клавиш, указанных в параметре String. В качестве параметра можно указывать как алфавитно-цифровые символы, так и символы специальных клавиш, например "Enter", "Tab", "F1", "Alt", "Shift", "Ctrl" и т.д. Для указания клавиш "Alt", "Shift", "Ctrl" существуют специальные коды:
· "Shift" - +;
· "Ctrl" - ^;
· "Alt" - %.
Если возникнет необходимость передать специальные символы именно как символы, а не команды, нужно заключать их в фигурные скобки, например {+}.
Категория:
COM-объекты, WMI, WSH Как получить Срез Последних значений на Каждую Дату Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
ЗаказПокупателя.Дата КАК Дата,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДокумента,
ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента
{ВЫБРАТЬ
ЗаказПокупателя.*,
Дата,
ВалютаДокумента.*,
СуммаДокумента}
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
{ГДЕ
ЗаказПокупателя.Ссылка.* КАК ЗаказПокупателя,
ЗаказПокупателя.СуммаДокумента}
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х ВЫБРАТЬ
&Дата КАК Дата,
КурсыВалютСрезПоследних.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс КАК Курс,
КурсыВалютСрезПоследних.Кратность КАК Кратность
{ВЫБРАТЬ
Дата,
Валюта.*,
Курс,
Кратность}
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
{ГДЕ
КурсыВалютСрезПоследних.Курс,
КурсыВалютСрезПоследних.Кратность}
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Defend er aka LINN
Как получить Срез Последних на Каждую Дату
То же самое простым запросом Категория:
Схема Компоновки Данных Как из скрипта VBS запустить 1C, чтобы окно программы не видно было? Код 1C v 8.х WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(СтрокаЗапуска, 0, Истина)
Код VBS Set WshShell=CreateObject("WScript.Shell")
WshShell.Run """C:\Program Files\1cv81\bin\1cv8.exe"" ENTERPRISE /Sserver\base",0,0
Код VBS On Error Resume Next
Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process")
'WScript.Echo "Запускаем"
Res = objClass.Create("C:\Program Files\1CV8PDA\1Cv8pSRV.exe ""Параметры""", Null, Null, PID)
If Res <> 0 Then
WScript.Echo "Код ошибки: " & Res
WScript.Quit
End If
Категория:
Администрирование Выбор оптимального алгоритма для разбора строки в массив Столкнулся с проблемой: ПолучитьСтрокуПоНомеру() медленно отрабатывает на входных данных >100 000 строк. Как сделать бытсрее?
Код 1C v 8.х // Пример Defend er aka LINN
ВремяНачала = ТекущаяДата();
Сообщить("Обработка начата: " + ВремяНачала);
ТЗ = Новый ТаблицаЗначений;
Текст = ПолучитьМакет("Макет").ПолучитьТекст();
RE = New COMObject("VBScript.RegExp");
RE.Global = Истина;
RE.IgnoreCase = Истина;
RE.Multiline = Истина;
RE.Pattern = "^.*$";
Строки = RE.Execute(Текст);
RE.Pattern = "([^\|]+?|\|)(?=\|)";
ДобавитьКолонки = Истина;
Для Каждого СтрокаТекста из Строки Цикл
СтрокаДляРазбора = СтрокаТекста.Value;
Результат = RE.Execute(СтрокаДляРазбора);
Если ДобавитьКолонки Тогда
НомерКолонки = 0;
Для Каждого Совпадение Из Результат Цикл
НомерКолонки = НомерКолонки + 1;
ТЗ.Колонки.Добавить("Колонка" + НомерКолонки);
КонецЦикла;
ДобавитьКолонки = Ложь;
КонецЕсли;
НоваяСтрока = ТЗ.Добавить();
НомерКолонки = 0;
Для Каждого Совпадение Из Результат Цикл
Значение = Совпадение.Value;
НоваяСтрока[НомерКолонки] = ?(Значение = "|", "", Значение);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
КонецЦикла;
ВремяОкончания = ТекущаяДата();
Сообщить("Обработка завершена: " + ВремяОкончания + ", время обработки: " + Формат('00010101' + (ВремяОкончания-ВремяНачала), "ДФ=мм:сс"));
Сообщить("Количество строк: " + ТЗ.Количество());
Код 1C v 8.х // Пример aleks-id
Функция InitRegExp(Разделитель = "|")
RegExp = Новый COMОбъект("VBScript.RegExp");
//Параметры:
RegExp.MultiLine = Истина; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Истина; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = Ложь; // истина — игнорировать регистр строки при поиске
RegExp.Pattern = "[^\" + Разделитель + "]+";
Возврат RegExp;
КонецФункции
Функция РазложитьСтрокуВМассив(RegExp, Строка)
Matches = RegExp.Execute (Строка);
Массив = Новый Массив;
Для Сч = 0 По Matches.Count - 1 Цикл
Массив.Добавить(Matches.Item(Сч).Value);
КонецЦикла;
Возврат Массив;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
Текст = Новый ЧтениеТекста("C:\aktivy.txt", КодировкаТекста.ANSI);
RegExp = InitRegExp();
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
масс = РазложитьСтрокуВМассив(RegExp, Стр);
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
RegExp = Неопределено;
КонецПроцедуры
Категория:
Регулярные выражения Прямые запросы к SQL серверу. Как то возникла ситуация, когда в справочник, с включенной проверкой на уникальность кода, из вне приходят элементы с такими же кодами. Отключать проверку нельзя. Пришлось делать затычку.
Подключение к SQL в общем то широко описано:
Код 1C v 8.х Функция Подключение(Сервер,БД)
cnn = Новый COMОбъект("ADODB.Connection");
cnn.ConnectionTimeOut = 0;
cnn.CommandTimeOut = 0;
cnn.connectionString = "SERVER="+Сервер+"; Database="+БД+"; DRIVER=SQL Server; UID=sa; PWD=*****;";
cnn.Open();
if cnn.State()=0 then
Сообщить("Не удалось соединиться с сервером");
cnn = 0;
Возврат Ложь;
end if;
cnn.Execute("SET NOCOUNT ON");
Возврат cnn;
КонецФункции
Сервер и БД можно получить и программно, но муторно. Эти данные можно взять из свойств БД на сервере 1С.
Название таблицы и полей в SQL можно получить с помощью команды 1С:
Цитата Глобальный контекст
ПолучитьСтруктуруХраненияБазыДанных (GetDBStorageStructureInfo)
Синтаксис:
ПолучитьСтруктуруХраненияБазыДанных(<Объекты метаданных>, <Имена базы данных>)
Параметры:
<Объекты метаданных> (необязательный)
Тип: Массив. Массив имен объектов метаданных или массив объектов метаданных, для которых требуется получить структуру таблиц базы данных.
<Имена базы данных> (необязательный)
Тип: Булево. Определяет, в каких терминах выдается информация о структуре хранения.
Истина - в терминах СУБД
Ложь - в терминах SDBL.
Значение по умолчанию: Ложь
Возвращаемое значение:
Тип: ТаблицаЗначений. Возвращает таблицу значений с описаниями структуры таблиц, индексов и полей базы данных в терминах SDBL или используемой СУБД, в зависимости от значения параметра "Имена базы данных".
Если параметр не используется, то возвращаемая таблица значений содержит информацию о структуре таблиц базы данных всех объектов метаданных.
Таблица значений включает следующие колонки:
ИмяТаблицыХранения(StorageTableName) – имя таблицы SDBL или базы данных;
ИмяТаблицы(TableName) – имя таблицы в терминах языка запросов (для тех у кого оно есть);
Метаданные(Metadata) – полное имя объекта метаданных;
...
Дальше нам нужно новый элемент справочника все ж таки записать, ну например :
Код 1C v 8.х
Попытка
спр.Записать();
Исключение
Сообщить("Не уникальный код "+стр.Код+" у элемента "+стр.Наименование);
Спр.УстановитьНовыйКод();
Спр.Записать();
КонецПопытки;
Все, делаем подмену.
Код 1C v 8.х подключение=Подключение(Сервер,База);
ТекстЗапроса="UPDATE Номенклатура
|SET Номенклатура._Code="+Формат(КодНужный,"ЧГ=0")+"
|FROM _Reference57 AS Номенклатура
|WHERE (CAST(Номенклатура._Folder AS int)=1)
|AND (Номенклатура._Code="+Формат(Спр.Код,"ЧГ=0")+")
|";
подключение.Execute(ТекстЗапроса);
Сообщить("Код "+КодБыл+" подменен на "+КодНужный);
Категория:
Запросы Отправка sms из 1C через avisosms.ru. Столкнулся с задачей отправки sms из 1С. Спасибо Якову за напутствие в решении данной задачи и указание сервиса avisosms.ru.
На сайте сервиса предоставлена документация по работе с ним. В частности сервис предлагает следующие варианты работы:
* JSON протокол
* email2SMS протокол
* HTTP GET протокол
* Удаленный доступ к телефонной книге
* XML протокол
После проб и ошибок с протоколом email2sms (ну не любит мой провайдер через smtp слать письма на не очень красивые адреса относя их к спаму и блокируя) был выбран вариант решения с JSON протоколом. Для краткой демонстрации работы сервера приведена небольшая конфигурация. Конфигурация написана на 1С Предприятие 8.2 с поддержкой работы веб-клиента. Для работы конфигурации необходимо заполнить константы:
* ПользовательСМС – Ваш логин в систему;
* ПарольСМС – Ваш пароль в систему;
* ПодписьСМС – Ваш адрес отправителя, который был создан в личном кабинете.
Конфигурация позволяет:
* Отправлять смс контрагенту, номер которого записан в соответствующем реквизите (номер пишем в формате 380ХХХХХХХХХХ);
* Получать статусы отправленных смс.
Ниже приведу код формирования запроса на отправку смс
Код 1C v 8.2 УП &НаСервере
Функция ОтправитьСервер()
УспешнаяОтправка = Ложь;
ПараметрJSON = "{'username': '" + Константы.ПользовательСМС.Получить() + "'";
ПараметрJSON = ПараметрJSON + ",'password': '" + Константы.ПарольСМС.Получить() + "'";
ПараметрJSON = ПараметрJSON + ",'request_type': 'send _message'";
ПараметрJSON = ПараметрJSON + ",'destination_address': '" + Объект.Контрагент.НомерТелефона+ "'";
ПараметрJSON = ПараметрJSON + ",'message': '" + Объект.ТекстСМС+ "'";
ПараметрJSON = ПараметрJSON + ",'source_address': '" + Константы.ПодписьСМС.Получить() + "'";
ПараметрJSON = ПараметрJSON + ",flash:'0'}";
Попытка
WinHttp=Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"Windows-1251");
WinHttp.Open("POST","http://api.avisosms.ru/sms/json/",0);
WinHttp.SetRequestHeader("Accept-Language", "ru");
WinHttp.SetRequestHeader("Accept-Charset","Windows-1251");
WinHttp.setRequestHeader("Content-Language", "ru");
WinHttp.setRequestHeader("Content-Charset", "Windows-1251");
WinHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=Windows-1251");
WinHttp.Send (ПараметрJSON);
ТекстОтвет = WinHttp.ResponseText();
Если Найти(ТекстОтвет, "OK_Operation_Completed") Тогда
УспешнаяОтправка = Истина;
КонецЕсли;
Исключение
Сообщить("Ошибка соединения:");
Сообщить(ОписаниеОшибки());
КонецПопытки;
//Запись отправленной смс в историю
Если УспешнаяОтправка Тогда
ПозицияКодаНачало = Найти(ТекстОтвет, "messageId") + СтрДлина("messageId")+3;
ПозицияКодаКонец = Найти(ТекстОтвет, "}");
КодСМС = Сред(ТекстОтвет, ПозицияКодаНачало, ПозицияКодаКонец-ПозицияКодаНачало-1);
СМСРассылка.ЗаписатьСМСВИсторию(Объект.Контрагент, Объект.ТекстСМС, КодСМС);
Иначе
Сообщить("Отправка смс не состоялась. Текст ошибки: " + ТекстОтвет);
КонецЕсли;
Возврат УспешнаяОтправка;
КонецФункции
Источник Категория:
COM-объекты, WMI, WSH Обновление платформы на клиентских машинах и восстановление списка информационных баз пользователей Периодически сталкиваюсь с проблемой обновления платформы на клиентских машинах, + периодически пользователи удаляют, изменяют или добавляют какие-то новые информационные БД.
В случае 8.2 новые релизы платформы стали штамповать чуть ли не каждый месяц, что меня повергло в уныние, разбираясь в этом вопросе понял: у кого есть домен могут легко реализовать с помощью доменных политик..Те же кто лишен домена и работает в рабочих группах, может прибегнуть к помощи кривоватого скрипта от 1С (текст скрипта приведен в руководстве администратора 8.2 стр. 185
Но как быть, если нужно одновременно снести старую платформу и поставить новую + что б еще у всех пользователей был одинаковый список информационных БД, Да и лучше, что б по ссылке вообще автоматом выбиралась нужна ИБ!
Для решения нам нужно какое-нибудь общедоступное сетевое пространство, куда мы кладем дистрибутивы платформ и нужный нам список баз (отредактированный файлик ibases.v8i)
Итак, пишем скрипт от меня с любовью и комментариями
Код VBS Option Explicit
Const Server = "62.76.65.113" ' Здесь мы зададим ip нашего общего ресурса (можно задать через имя компьютера)
If Ping (Server) = True Then ' проверим доступно ли место
Dim ProductCod 'код продукта (Смотри в каталоге каждого дистрибутива платформы в файле setup.ini
Dim DistrFolder 'каталог в которм находится дистрибутив платформы
Dim cmdLine 'Параметры запуска дистрибутива
'Деинсталируем предыдущие платформы
cmdLine = "REMOVE=ALL"
ProductCod = "{375C3BB1-6F1E-4D93-9AF7-6A379133CA81}"
DistrFolder= "\\" & Server & "\1s\8.2.10.73\"
If Ustanovlena(ProductCod) Then ' Здесь и далее идет проверка на наличие установленной данной версии платформы
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
'Иногда папка остается в каталоге installer после удаления - исправим это
UdalitFolder ProductCod
End If
ProductCod = "{8150646B-4F88-4415-AF2A-F96199E3DA37}"
DistrFolder= "\\" & Server & "\1s\8.2.10.77\"
If Ustanovlena(ProductCod) Then
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
'Установим текущую платформу
ProductCod = "{3D5173F0-371D-4B5D-B96A-9340D7F30431}"
DistrFolder= "\\" & Server & "\1s\8.2.10.82\"
cmdLine = "TRANSFORMS=adminstallrelogon.mst;1049.mst DESIGNERALLCLIENTS=0 THICKCLIENT=0 THINCLIENTFILE=1 THINCLIENT=1 WEBSERVEREXT=0 SERVER=0 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=0 LANGUAGES=RU"
'В данном случае мне нужны только установленные тонкие клиенты, если надо больше - поменяйте на 1, то что надо установить
If Not Ustanovlena(ProductCod) Then ' Если текущая версия не установлена - установим ее
SdelatEto ProductCod, DistrFolder + "1CEnterprise 8.2.msi", cmdLine
End If
ScopirovatSpisokBaz ' В любом случае обновим список ИБ (Вдруг или мы или пользователи, что-то поменяли)
End If
Sub SdelatEto (ByVal productCode, ByVal msiPackage, ByVal CmdLine)
On Error Resume Next
Dim installer
Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
installer.UILevel = 2 'молчаливая установка (варианты смотрите в Руководстве администратора 8.2 стр.185
installer.InstallProduct msiPackage,cmdLine
Set installer = Nothing
End Sub
Sub UdalitFolder (ProductCod)
On Error Resume Next
Dim fso1, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.DeleteFolder WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod, True
End Sub
'Создаем список баз данных (копируем наш фал с сервера на клиент
Sub ScopirovatSpisokBaz
On Error Resume Next
Dim fso1, WSH1
Set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
fso1.CopyFile "\\" & Server & "\1s\1CEStart\ibases.v8i",WSH1.ExpandEnvironmentStrings("%AppData%") & "\1C\1CEStart\ibases.v8i", True
End Sub
'создание ярлыка
Sub createShurtcut
Dim WshShell, oShellLink, ServerBD, NameBD
ServerBD = "IZO-NoteBook"
NameBD = "1C_Dec_82"
Set WshShell = WScript.CreateObject("WScript.Shell")
Dim strDesktop : strDesktop = WshShell.SpecialFolders("Desktop")
Set oShellLink = WshShell.CreateShortcut(strDesktop & "\" & shortcutName & ".lnk")
oShellLink.TargetPath = WSHShell.ExpandEnvironmentStrings("%ProgramFiles%") & "\1cv82\Common\1cestart.exe /S" & ServerBD & "\" & NameBD 'Если не указывать параметры, то будет появлятся стандартное окно выбора ИБ, если укажем, то сразу имя пользователя-пароль
oShellLink.WindowStyle = 1
oShellLink.Description = shortcutName
oShellLink.Save
Set oShellLink = Nothing
Set WshShell = Nothing
End Sub
Function Ustanovlena(ProductCod)
On Error Resume Next
Dim fso1, oFolders, WSH1
set WSH1 = WScript.CreateObject("WScript.Shell")
Set fso1 = WScript.CreateObject("Scripting.FileSystemObject")
Set oFolders = Nothing
Set oFolders = fso1.GetFolder(WSH1.ExpandEnvironmentStrings("%systemroot%") & "\Installer\" & ProductCod)
If OFolders Is Nothing Then
Ustanovlena = False
Else
Ustanovlena = True
End If
End Function
Function Ping(strHost)
' Просто пингуем наш компутер, проверяя включен ли он
Dim objPing, objRetStatus
Set objPing = GetObject("winmgmts:\\.\root\CIMV2").ExecQuery _
("S_elect * FROM Win32_PingStatus WHERE address = '" & strHost & "'")
for Each objRetStatus in objPing
if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 Then
Ping = False
Else
Ping = True
End If
Next
End Function
Напоминаю, что создать исполняющий скрипт не сложно, берем обычный текстовый файл, вставляем туда текст скрипта, сохраняем файл, меняем ему расширение с txt на vbs и можно скрипт исполнять
Источник Категория:
Администрирование Автоматическая архивация баз 1С 8.х для файлового и клиент-серверного варианта Данный способ архивации подходит для файловых и SQL версий баз 1С:
И так:
1. Создаем скрипт vbs и сохраняем его в
C:\Backup\ZUP.vbs
Код VBS
Set WshShell = CreateObject("WScript.Shell")
dim d,m,y
d = day(date())
if d < 10 then
d = "0" & d
end if
m = month(date())
if m < 10 then
m = "0" & m
end if
y = year(date())
h = Hour(Time())
if h < 10 then
h = "0" & h
end if
Min = Minute(Time())
if Min < 10 then
Min = "0" & Min
end if
S = Second(Time())
if S < 10 then
S = "0" & S
end if
'Формируется полное имя файлов выгрузки и лога
s = d & "_" & m & "_" & y & "_" & h & "_" & Min & "_" & S
'Путь к файлу выгрузки
BackupPath = "/DumpIB \\Server1CBackup\SQL_Backup\1c_backup\ZUP\BACKUP\ZUP_" & s & ".dt"
'Путь к логу
LogPath = "/Out \\Server1CBackup\SQL_Backup\1c_backup\ZUP\log\ZUP_Log_" & s & ".log -NoT_runcate"
'Путь к фалу запуска программы 1С
one1CPath = """%systemdrive%\Program Files\1cv81\bin\1cv8.exe"""
'Параметры запуска базы (SQL) имя кластера\имя базы пользователь пароль
Paramters = "DESIGNER /S Server1C\ZUP /N UserAdmin1C /P PassWordUserAdmin1C /DisableStartupMessages"
Set fs = CreateObject("Scripting.FileSystemObject")
'Запуск
WshShell.Run one1CPath & " " & Paramters& " " & LogPath & " " & BackupPath, 0, True
2. На Server1C создаем Назначенные задания с параметрами как на рисунках ниже:
3. В итоге получаем архивные файлы выгрузок 1С и логи:
Категория:
Администрирование Используем диалог открытия файлов Word в 1С,возможен множественный выбор Код 1C v 7.x oWord=СоздатьОбъект("Word.Application");
oWord.WindowState = 1;
oWord.Height = 0;
oWord.Width = 0;
myopend ial = oWord.FileDialog(3);
myopend ial.AllowMultiSelect = -1;
myopend ial.Title = "Выбирайте файлы...";
Для i = 1 По myopend ial.Filters.Count Цикл
myopend ial.Filters.Delete();
КонецЦикла;
myopend ial.Filters.Add("1С файлы", "*.ert; *.mxl; *.txt", 1);
oWord.Visible=-1;
oWord.Activate();
myopend ial.Show();
Для i = 1 По myopend ial.SelectedItems.Count Цикл
Сообщить(myopend ial.SelectedItems.Item(i));
КонецЦикла;
oWord.Quit();
Категория:
Работа с Microsoft Office и OpenOffice Работа с буфером обмена средствами 1С Копировать из 1С в буфер обмена( без ВК):
Код 1C v 8.х ЭлементыФормы.Добавить(Тип("ПолеHTMLДокумента"), "Поле_HTML_Документа_acb123", Ложь);
Окно = ЭлементыФормы.Поле_HTML_Документа_acb123.Документ.ParentWindow;
Окно.ClipboardData.SetData("Text", ТекстПисьма);
ЭлементыФормы.Удалить(ЭлементыФормы.Индекс(ЭлементыФормы.Найти("Поле_HTML_Документа_acb123")));
Вставить в 1С из буфера обмена:
Код 1C v 8.х ЭлементыФормы.Добавить(Тип("ПолеHTMLДокумента"), "Поле_HTML_Документа_acb123", Ложь);
Окно = ЭлементыФормы.Поле_HTML_Документа_acb123.Документ.ParentWindow;
СодержимоеБуфера = Окно.ClipboardData.GetData("Text");
ЭлементыФормы.Удалить(ЭлементыФормы.Индекс(ЭлементыФормы.Найти("Поле_HTML_Документа_acb123")));
ТекстПисьма = ТекстПисьма + СодержимоеБуфера;
При определенных настройках политики безопасности, способ с ПолеHTMLДокумента НЕ работает, используйте:
Код 1C v 8.х
Функция ПолучитьТекстБуфераОбмена() Экспорт
#Если Клиент Тогда
Объект = Новый COMОбъект("htmlfile");
Возврат Объект.ParentWindow.ClipboardData.Getdata("Text");
#КонецЕсли
КонецФункции
Функция УстановитьТекстВБуферОбмена(Текст) Экспорт
#Если Клиент Тогда
Объект = Новый COMОбъект("htmlfile");
Объект.ParentWindow.ClipboardData.Setdata("Text", Текст);
Возврат Текст;
#КонецЕсли
КонецФункции
Для 7.7:
Код 1C v 7.x Set objHTM = CreateObject("htmlfile");
Текст = "Помощь в 1С";
objHTM.ParentWindow.ClipboardData.Setdata("Text", Текст);
Текст = objHTM.ParentWindow.ClipboardData.GetData("text");
Используя
WSH :
Код 1C v 8.х // через Send Keys передаем Ctrl-C и Ctrl-V
wsh=Новый COMОбъект("WScript.Shell");
// Скопировать текст
wsh.Send Keys("^c");
// Вставить текст
wsh.Send Keys("^v");
Код 1C v 7.x // через Send Keys передаем Ctrl-C и Ctrl-V
wsh=СоздатьОбъект("WScript.Shell");
// Скопировать текст
wsh.Send Keys("^c"); // или так: wsh.Send Keys("^(C)");
// Вставить текст
wsh.Send Keys("^v"); // или так: wsh.Send Keys("^(V)");
//Объект Clipboard
WshExtra = СоздатьОбъект("WshExtra.Clipboard");
// Скопировать текст
WshExtra.Copy("Запись в буфер обмена")
// Вставить текст
Текст = WshExtra.Paste();
Категория:
Полезные, Универсальные Функции Пример построения в 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.End Key();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.End Key();
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода 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.End Key();
// В области закладки 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.End Key(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