Как открыть документ Word без возможности редактирования и копирования Как открыть из 1С документ Word без возможности его редактирования и копирования?
Код 1C v 8.х Если НЕ РольДоступна("ПолныеПрава") Тогда
Word.Application.ActiveDocument.Protect(2,ИСТИНА,Строка(Код),Ложь,ИСТИНА);//пароль на редактрование - код текущего объекта
ВордВасик=Word.WordBasic;
Сообщить(ВордВасик.MsgBox("Документ открыт только для чтения!",));
ДобавитьОбработчик Word.DocumentBeforeSave, ОбработкаСохраненияДокумента;
КОнецЕсли;
....
Процедура ОбработкаСохраненияДокумента(Doc, SaveAsUI, Cancel)
Cancel = True;
ВордВасик=Word.WordBasic;
Сообщить(ВордВасик.MsgBox("Вам запрещено сохранять документ!",));
КонецПРоцедуры
// Печать соответственно DocumentBeforePrint
Категория:
Работа с Microsoft Office и OpenOffice Преобразование 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;
EndIf;
EndProcedure // 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
);
EndDo;
Return ListS_electSheet;
EndFunction // GetSheets()
// Преобразование XLS в MXL
Procedure ButtonExecuteClick()
If IsBlankString(FileName) Then
DoMessageBox("Не указано имя файла");
Return;
EndIf;
Try
ExcelApplication = GetCOMObject(FileName); // Excel.Application
Except
DoMessageBox("Ошибка чтения файла: " + FileName + " возможно защищен паролем.");
Return;
EndTry;
S_electSheet = 0;
S_electSheet = GetSheets(ExcelApplication).ChooseItem("Выберите лист", S_electSheet);
If S_electSheet = Undefined Then
Return;
EndIf;
S_electNumberSheet1 = S_electSheet.Value;
S_electNumberSheet2 = S_electNumberSheet1;
If S_electNumberSheet1 = 0 Then
S_electNumberSheet1 = 1;
S_electNumberSheet2 = ExcelApplication.Worksheets.Count
EndIf;
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;
EndTry;
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; // Пустой лист
EndIf;
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.Int erior.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
EndTry;
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();
EndIf;
Except
Message(ErrorDescription());
EndTry;
EndDo;
frmProgressBar.Controls.ProgressBarCur.Value = frmProgressBar.Controls.ProgressBarCur.Value + 1;
UserInt erruptProcessing(); // Прерывание пользователя Ctrl+Break
EndDo;
SprDoc.Show("" + TrimAll(FileName) + ", лист " + NumberSheet,"");
EndDo;
frmProgressBar.Close();
ExcelApplication = "";
EndProcedure // ButtonExecuteClick()
Категория:
Работа с Microsoft Office и OpenOffice Разложение значения Цвета на состовляющие RGB Периодически могут возникать ситуации, когда необходимо разложить числовое значение цвета на его RGB-составлящие. Например, если говорить о платформе 1С 8, то для задания цвета шрифта, цвета области табличного документа и т.п. мы можем использовать либо web-цвета, либо цвета стилей, либо абсолютный цвет, который задается через RGB-составляющие:
Код 1C v 8.х Цвет = Новый Цвет(R,G,B);
где R,G,B - числовое значение цвета от 0 до 255 (красный, зеленый и синий соответственно)
В тоже время некоторые приложения, например Excel, возвращают значение цвета одним десятичным числом, которое формируется из всех трех составляющих по определенному алгоритму. И если нам необходимо, например, скопировать формат ячейки Excel в ячейку табличного документа 1С, то возникает вопрос, как нам разложить числовое представление цвета на его RGB-составляющие?
Чтобы разобраться в этом вопросе, давайте посмотрим, по какой формуле формируется числовое представление цвета. Формула достаточно проста:
Цвет = R + G * 256 + B * 65535
где R,G,B - числовое значение цвета от 0 до 255 (красный, зеленый и синий соответственно)
Если представить коэффициенты немного в другом виде, то наша формула преобразуется к следующему виду:
Цвет = R*(256^0) + G*(256^1) + B*(256^2)
То есть наше числовое представление цвета есть ни что иное, как трехзначное число по основанию 256. Поэтому, чтобы получить требуемые составляющие, нам надо всего лишь преобразовать значение цвета из 10-тичной системы в систему по основанию 256. Каждое из трех полученных значений и будет искомым значением составляющих цвета.
На примере переноса цвета ячейки Excel код будет вылядеть так:
Код 1C v 8.х ЦветRGB = ЯчЕксел.Int erior.Color;
R = ЦветRGB%256;
G = (Цел(ЦветRGB/256))%256;
B = (Цел(ЦветRGB/65535))%256;
Яч.ЦветФона = Новый Цвет(R,G,B);
Источник:
lessons1c Категория:
Полезные, Универсальные Функции Обмен данными 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 int o jos_vm_category (vendor_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 int o jos_vm_category (
|vendor_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 int o 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 int o 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 int o jos_vm_product ( vendor_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 int o jos_vm_product ( vendor_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 int o 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 int o 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 Категория:
Конвертация данных, Обмен, Перенос Получение списка принтеров и Подключение сетевого принтера Для работы с сетевыми ресурсами в WSH предназначен объект WshNetwork. Из "1С:Предприятие" можно напрямую управлять сетевыми ресурсами, в том числе и принтерами.
Получить список принтеров
Код 1C v 8.х Функция ПолучитьСписокПринтеров()
СписокПринтеров = Новый СписокЗначений;
СписокПринтеров.Очистить();
Принтеры = Новый COMОбъект(«WScript.Network»);
Prn = Принтеры.EnumPrint erConnections();
й = 0;
Пока й < Prn.Count() – 1 Цикл
СписокПринтеров.Добавить(Prn.Item(й + 1));
й = й + 2;
КонецЦикла;
Принтер = СписокПринтеров.ВыбратьЭлемент();
//даём пользователю выбрать принтер
Если Принтер <> Неопределено Тогда
……
Сообщить(Принтер.Значение); // например
……
КонецЕсли;
КонецФункции
Подключение сетевого принтера
Код 1C v 8.х //Создаём новый СОМ-объект
Сеть = Новый СОМОбъект("Wscript.Network");
Попытка
//устанавливаем принтер
Сеть.AddWindowsPrint erConnection("\\ИмяСервера\ИмяПринтера");
//делаем этот принтер принтером по умолчанию
Сеть.SetDefaultPrint er("\\ИмяСервера\ИмяПринтера");
Исключение
//в случае неудачного подключения принтера
Сообщить("Невозможно произвести подключение");
КонецПопытки;
Объект WshNetwork позволяет определить список подключенных сетевых принтеров. Для этого используется метод EnumPr
int erConnections, который возвращает коллекцию принтеров. Данную коллекцию можно перебрать с помощью конструкции
Код 1C v 8.х Для каждого... из... Цикл...КонецЦикла
Категория:
COM-объекты, WMI, WSH Использование регулярных выражений (RegExp) в 1С Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в 1С - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии Windows (начиная с Windows 98), и устанавливать дополнительно ничего не нужно.
Приведенные ниже примеры были протестированы в 1С:Предприятие 7.7; для 1С:Предприятие 8.x изменяется способ создания объекта:
Код 1C v 8.х RegExp = Новый COMОбъект("VBScript.RegExp");
Кроме того, там уже есть логические константы Истина и Ложь - объявлять их не нужно.
Более подробное описание самой технологии RegExp (что означают те или иные значки или скобочки, или какие шаблоны поиска или замены можно использовать в типичных ситуациях) можно найти в специальной литературе (например Бен Форта "Освой самостоятельно регулярные выражения (regexp) за 10 минут") или на сайтах в сети
Int ernet.
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Поиск вхождений подстроки
Процедура RegExp_Exec()
//Для 1С 7.7:
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern = "<[^>]*>"; //Ищем теги HTML
Matches=RegExp.Execute("Это <hr> строка <br> с тегами HTML");
ЧислоВхождений=Matches.Count();
Если ЧислоВхождений>0 Тогда
Для к = 0 По ЧислоВхождений-1 Цикл
Match = Matches.Item(к);
Сообщить("Найден тег:"+ Match.Value);
КонецЦикла;
Иначе
Сообщить("Вхождений шаблона не найдено");
КонецЕсли;
//Выдаст в окно сообщений:
//Найден тег:<hr>
//Найден тег:<br>
КонецПроцедуры
Более продвинутый пример разбора HTML использует подвыражения (SubMatches) и позволяет находить как сами теги, так и текст между ними.
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Поиск вхождений подстроки с использованием подвыражений
Процедура RegExp_Exec1()
//Для 1С 7.7:
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = Ложь; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Ложь; //Многострочный режим
RegExp.Pattern = "([^<]*)(<[^>]*>)([^<]*)"; //Ищем теги HTML, а также текст до и после тега
Matches=RegExp.Execute(" <tr><td id=aaa>Дятел <td> долбит <td> сосну </tr>");
ЧислоВхождений=Matches.Count();
Если ЧислоВхождений>0 Тогда
Для к = 0 По ЧислоВхождений-1 Цикл
Match = Matches.Item(к);
SubMatches = Match.SubMatches;
ЧислоПодвыражений=SubMatches.Count();
Для н = 0 По ЧислоПодвыражений-1 Цикл
SubMatch=SubMatches.Item(н);
Если SubMatch="" Тогда
Продолжить;
КонецЕсли;
Сообщить("Подстрока: "+SubMatch);
КонецЦикла;
КонецЦикла;
Иначе
Сообщить("Вхождений шаблона не найдено");
КонецЕсли;
КонецПроцедуры
//Выводит в окно сообщений:
//Подстрока:
//Подстрока: <tr>
//Подстрока: <td id=aaa>
//Подстрока: Дятел
//Подстрока: <td>
//Подстрока: долбит
//Подстрока: <td>
//Подстрока: сосну
//Подстрока: </tr>
Часто регулярные выражения используются для тестирования строк, например пользовательского ввода.
Этот пример позволяет узнать, является ли строка целым числом.
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Проверка подстроки
Процедура RegExp_Test()
RegExp = CreateObject("VBScript.RegExp");
RegExp.Pattern = "^\d+$"; //Шаблон, который соответствует целому числу
стр="12345";//Строка, которую тестируем
Если RegExp.Test(стр)=0 Тогда
Сообщить("Это не целое число");
Иначе
Сообщить("Это целое число");
КонецЕсли;
//Выдаст в окно сообщений:
//"Это целое число"
КонецПроцедуры
Регулярные выражения поддерживают не только поиск, но и замену текста. При этом найденные подвыражения (в круглых скобках) могут быть представлены в строке замены как $1, $2 и т. д.
(знак доллара используется в VBScript.RegExp; в других средах программирования, например в JavaScript, используемый для этой цели символ может отличаться).
Код 1C v 7.x ///////////////////////////////////////////////////////////////////////
//Замена текста в подстроке
Процедура RegExp_Replace()
//Строка, где мы будем производить замены
стр="Дятел долбил сосну";
Истина=-1;
Ложь=0;
RegExp = CreateObject("VBScript.RegExp");
RegExp.IgnoreCase = Истина; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Истина; //Многострочный режим
RegExp.Pattern = "(долбил)";
стр=RegExp.Replace(стр, "про$1");
Сообщить(стр);
//Выдаст в окно сообщений:
//"Дятел продолбил сосну"
КонецПроцедуры
Источник Категория:
Регулярные выражения Прямые запросы к 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;
Возврат Ложь;
endif;
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(ТекстЗапроса);
Сообщить("Код "+КодБыл+" подменен на "+КодНужный);
Категория:
Запросы Выгрузка в PDF из 1С (Средствами OpenOffice) Возникла задача отправлять счета почтой. PDFcreator не подошёл поскольку не удалось вместить счёт на одну страницу по ширине. Решил попробовать OpenOffice. Как сохранять в PDF нашёл быстро, а вот как уместить счёт на одну страницу вширь искал долго.
В версии 1С 8.2.232 появилась возможность сохранять табличный документ в xls файл на сервера под линуксом. А вот работать с Опеном офисом из-под линукса пока не получается. Собственно комментари ненужны. Вот весь код. Самое интересное это бодание со стилями страниц в Опене Офисе. Жаль что этот фрагмент работает только на клиенте. На сервере вопрос не решается *08
Код 1C v 8.2 УП Процедура КнопкаВыполнитьНажатие(Кнопка)
Если Письмо.Основание.Пустая() Тогда
Возврат
КонецЕсли;
// Открыть OpenOffice
Попытка
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Исключение
Возврат // опен офис не установлен :-(
КонецПопытки;
// получим печатную форму и запишем её во временный XLS файл
Заказ = Письмо.Основание.ПолучитьОбъект();
//Получим печатную форму
Расшифровка=Новый Структура;
Расшифровка.Вставить("СсылкаНаВнешнююОбработку",Константы.ПФСчетаДляКлиента.Получить());
Расшифровка.Вставить("ВидПечатнойФормы",Перечисления.ВидыДополнительныхВнешнихОбработок.ПечатнаяФорма);
Расшифровка.Вставить("НомерСтроки",1);
тд = УниверсальныеМеханизмы.НапечататьВнешнююФорму(Заказ, Расшифровка);
ВременныйФайл =ПолучитьИмяВременногоФайла();
ВременныйФайлXLS =ВременныйФайл + ".xls";
ВременныйФайлPDF =ВременныйФайл + ".pdf";
тд.Записать(ВременныйФайлXLS, ТипФайлаТабличногоДокумента.XLS97);
// Преобразовываем временный xls файл В PDF
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
НастройкиОткрытия = Новый COMSafeArray("VT_VARIANT", 1);
PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
PropertyValue.Name = "Hidden";
PropertyValue.Value = Истина;
НастройкиОткрытия.SetValue(0, PropertyValue);
ВременныйФайлXLS_какУРЛ = "file:///" + СтрЗаменить(ВременныйФайлXLS, "\", "/"); // приводим путь к файлу из виндового формата в опен офисный
// Откроем файл в опене офисе
ОпенОфис = Desktop.LoadComponentFromURL(ВременныйФайлXLS_какУРЛ, "_blank", 0, НастройкиОткрытия);
//ПараметрыСтраницы = ОпенОфис.createInstance("com.sun.star.style.PageStyle");
//ПараметрыСтраницы.ScaleToPagesX = 1;
//
// Установим масштаб, чтобы счёт помещался на одной странице вширь
// страниц почему-то много, поэтому устанавливаем масштаб для всех
Стили = ОпенОфис.StyleFamilies.getByName("PageStyles");
Для поз = 0 по Стили.count - 1 Цикл
МойСтиль = Стили.getByIndex(поз);
МойСтиль.ScaleToPagesX = 1; // уместить на одной странице вширь
//МойСтиль.PageScale = 50; // масштаб 50%
КонецЦикла;
НастройкиСохранения = Новый COMSafeArray("VT_VARIANT", 1);
PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
PropertyValue.Name = "FilterName";
PropertyValue.Value = "calc_pdf_Export";
НастройкиСохранения.SetValue(0, PropertyValue);
ВременныйФайлPDF_какУРЛ = "file:///" + СтрЗаменить(ВременныйФайлPDF, "\", "/"); // приводим путь к файлу из виндового формата в опен офисный
ОпенОфис.storeToURL(ВременныйФайлPDF_какУРЛ, НастройкиСохранения); // сохранили PDF файл
ОпенОфис.close(-1);
ОпенОфис = Неопределено;
// С опеном офисом разобрались. Прикрепляем вложение к письму и удаляем временные файлы.
//Файл = Новый Файл(ВременныйФайлPDF);
объектПисьмо = Письмо.ПолучитьОбъект();
стрВложение = объектПисьмо.Вложения.Добавить();
стрВложение.ИмяФайла = "Счёт " + Строка(Заказ.Номер) + ".pdf";
стрВложение.Файл = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ВременныйФайлPDF));
объектПисьмо.Записать();
Попытка
УдалитьФайлы(ВременныйФайлXLS);
УдалитьФайлы(ВременныйФайлPDF);
Исключение
КонецПопытки;
КонецПроцедуры
Автор:
Трактор
Функция позволяющая выполнить выгрузку табличного документа в PDF средствами OpenOffice
Код 1C v 8.х // Функция превращает табличный документ в PDF документ
// Возвращаемое значение: тип "Строка" - имя созданного PDF файла, 0 - в случае ошибки
// Параметры: ДанныеВыгрузки - Табличный или текстовый документ, который нужно выгрузить в PDF
// ПутьВыгрузки - тип "Строка", путь для сохраниения PDF файла (без имени и расширения файла)
// ИмяФайлаБезРасширения - тип "Строка", имя для вновь сформированного PDF файла
// Тестировалось на OpenOffice 3.x
Функция ВыгрузитьТабличныйДокументВPDF(ДанныеВыгрузки, ПутьВыгрузки, ИмяФайлаБезРасширения)
Если НЕ ЗначениеЗаполнено(ПутьВыгрузки) Тогда
ПутьВыгрузки = КаталогВременныхФайлов();
КонецЕсли;
ПутьВыгрузки = ?(Прав(ПутьВыгрузки, 1) = "\", ПутьВыгрузки, ПутьВыгрузки + "\");
РасширениеXSL = ".xls";
РасширениеPDF = ".pdf";
ПолноеИмяФайлаXLS = ПутьВыгрузки + ИмяФайлаБезРасширения + РасширениеXSL;
//Выгрузка данных печати в файл XLS
#Если Клиент Тогда
Состояние("Создание временного файла...");
#КонецЕсли
Попытка
Если ТипЗнч(ДанныеВыгрузки) = Тип("ТабличныйДокумент") Тогда
ДанныеВыгрузки.Записать(ПолноеИмяФайлаXLS, "XLS");
ИначеЕсли ТипЗнч(ДанныеВыгрузки) = Тип("ТекстовыйДокумент") Тогда
ДанныеВыгрузки.Записать(ПолноеИмяФайлаXLS, "XLS");
Иначе
#Если Клиент Тогда
Сообщить("Данные для выгрузки переданы в неподдерживаемом формате. Дальнейшее выполнение невозможно." + Символы.ПС + ОписаниеОшибки());
#КонецЕсли
Возврат 0;
КонецЕсли;
Исключение
#Если Клиент Тогда
Сообщить("Произошла ошибка при выгрузке временного файла. Возможно ошибка доступа к папке, в которую происходит запись." + Символы.ПС + ОписаниеОшибки());
#КонецЕсли
Возврат 0;
КонецПопытки;
Попытка
#Если Клиент Тогда
Состояние("Открытие компоненты OpenOffice...");
#КонецЕсли
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.AddObject("OpenOffice", ServiceManager);
//Открытие временного файла без отображения его окна
#Если Клиент Тогда
Состояние("Открытие временного файла...");
#КонецЕсли
Скрипт.eval("Массив=new Array()");
Массив = Скрипт.eval("Массив");
Скрипт.eval("Массив[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
Скрипт.eval("Массив[0].Name = 'Hidden'");
Скрипт.eval("Массив[0].Value = true");
Скрипт.AddCode("function SetItem(ind,val){Массив[ind]=val}");
Скрипт.AddObject("ServiceManager",ServiceManager);
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
Document = Desktop.LoadComponentFromURL("file:///" + ПолноеИмяФайлаXLS, "_blank", 0, Массив);
//Сохранение в PDF встроенными средствами OpenOffice
#Если Клиент Тогда
Состояние("Запись в PDF...");
#КонецЕсли
Скрипт.eval("Массив2=new Array()");
Массив2 = Скрипт.eval("Массив2");
Скрипт.eval("Массив2[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
Скрипт.eval("Массив2[0].Name = 'FilterName'");
Скрипт.eval("Массив2[0].Value = 'writer_pdf_Export'");
ПолноеИмяФайлаPDF = "file:///" + СтрЗаменить(ПолноеИмяФайлаXLS, РасширениеXSL, РасширениеPDF);
ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, ВРег(РасширениеXSL), РасширениеPDF);
ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, "\", "/");
Document.storeToURL(ПолноеИмяФайлаPDF, Массив2);
Document.close(-1); //Закрыть документ
//Контрольная очистка переменных
Document = Неопределено;
Desktop = Неопределено;
//Удаление временного файла
#Если Клиент Тогда
Состояние("Удаление временного файла...");
#КонецЕсли
Попытка
УдалитьФайлы(ПолноеИмяФайлаXLS);
Исключение
#Если Клиент Тогда
Сообщить("Произошла ошибка при удалении временного файла. Возможно, потребуется удалить его вручную." + Символы.ПС + ОписаниеОшибки());
#КонецЕсли
КонецПопытки;
ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, "file:///", "");
ПолноеИмяФайлаPDF = СтрЗаменить(ПолноеИмяФайлаPDF, "/", "\");
#Если Клиент Тогда
Состояние("Выгрузка выполнена.");
Предупреждение("Выгрузка выполнена." + Символы.ПС + ПолноеИмяФайлаPDF);
#КонецЕсли
Возврат ПолноеИмяФайлаPDF;
Исключение
Document.close(-1);
#Если Клиент Тогда
Предупреждение(ОписаниеОшибки());
#КонецЕсли
Возврат 0;
КонецПопытки
КонецФункции
Автор:
doom_2001 Категория:
Работа с Microsoft Office и OpenOffice 1C и Google Maps была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было решено использовать геокодирование сервиса Google и Google Visualization для отображение элементов на карте.
Геокодирование – процесс преобразования адресов·(Украина, Киевская область, Киев, Крещатик 20) в географические координаты (широта 37.423021 и долгота -122.083739), которые можно использовать для размещения маркеров или расположения карты. Подробно про геокодирование можно почитать
тут .
Для работы с геокодированием необходимо
зарегистрировать ключ API карт Google .
Важный момент: если у вас программа работает в локальной сети и в
Int ernet, то вам необходимо регистрировать два ключа. В зависимости от того, с какого места подключается пользователь к базе подставлять тот или иной ключ.
И так, собственно программная реализация.
В конфигурации есть две общих формы:
* Форма подбора координат. Данная форма формирует запрос на геокодирование и обрабатывает результат.
* Форма отображения объектов. Данная форма использует
API визуализации Google . В частности данная форма использует визуализацию
Map .
Запрос и обработка результата геокодирования.
Формирование запроса происходит с ключом output=csv, для вывода результата запроса в csv файл. После выполнения запроса проверяется код результата запроса и разбор csv файла на широту и долготу.
Код 1C v 8.2 УП #НаСервере
Процедура ОтправитьЗапросНаПоискКоординат()
Город = Параметры.ОбъектПодбора.Город.Наименование;
Страна = Параметры.ОбъектПодбора.Город.Владелец.Владелец.Наименование;
Адрес = Параметры.ОбъектПодбора.Адрес;
ПараметрПоиска = Страна + " " + Город + " " + Адрес;
АдресOutput = ПолучитьИмяВременногоФайла();
Ключ = Константы.КлючКарта.Получить();
ТекстСсылки = "maps/geo?q=" + EncodeURL(ПараметрПоиска)+"&output=csv&oe=utf8&sensor=false&key=" + Ключ;
ПроксиСервер = Неопределено;
HTTPСервис = Новый HTTPСоединение("maps.google.com",,,,ПроксиСервер,Ложь);
ПравильностьВыполнения = Истина;
Попытка
HTTPСервис.Получить(ТекстСсылки, АдресOutput);
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
ПравильностьВыполнения = Ложь;
КонецПопытки;
Если ПравильностьВыполнения Тогда
// Распарсить результат ответа поиска
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(АдресOutput);
РезультатПоиска = Текст.ПолучитьСтроку(1);
КодРезультата = Лев(РезультатПоиска,3);
РезультатПоиска = Сред(РезультатПоиска, 7, СтрДлина(РезультатПоиска));
Если КодРезультата <> "200" Тогда
Возврат;
КонецЕсли;
Широта = Число(Сред(РезультатПоиска,0,10));
Долгота = Число(Сред(РезультатПоиска,12,10));
КонецЕсли;
КонецПроцедуры
Формирование карты отображения
При формировании отображения объекта на карте к стандартному коду визуализации добавлен следующий:
Код 1C v 8.х if(!google.visualization) setTimeout(checkIfGoogleLoad, 1000);
else drawMap();
Это связано с тем, что платформа не хочет сразу обновлять фрейм поля html документа.
Код 1C v 8.2 УП #НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СсылкаНаБазу = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
APIГугла = Константы.КлючКарта.Получить();
ТаблицаОбъектовДляВывода = Новый ТаблицаЗначений;
ТаблицаОбъектовДляВывода.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка"));
ТаблицаОбъектовДляВывода.Колонки.Добавить("Город",Новый ОписаниеТипов("Строка"));
ТаблицаОбъектовДляВывода.Колонки.Добавить("Адрес",Новый ОписаниеТипов("Строка"));
ТаблицаОбъектовДляВывода.Колонки.Добавить("Широта",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));
ТаблицаОбъектовДляВывода.Колонки.Добавить("Долгота",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));
Если Параметры.ОтображатьСОтветственными Тогда
ТаблицаОбъектовДляВывода.Колонки.Добавить("Ответственный",Новый ОписаниеТипов("Строка"));
КонецЕсли;
Для Каждого ТекЭлемент Из Параметры.ОбъектыДляОтображения Цикл
КоординатыОбъекта = ОбщийМодульКартаСервер.ПолучитьКоординатыОбъекта(ТекЭлемент.Значение.ОбъектПосещения);
Если КоординатыОбъекта = Неопределено Тогда
Продолжить;
Иначе
НоваяСтрока = ТаблицаОбъектовДляВывода.Добавить();
НоваяСтрока.Наименование = ТекЭлемент.Значение.ОбъектПосещения.Наименование;
НоваяСтрока.Город = ТекЭлемент.Значение.ОбъектПосещения.Город.Наименование;
НоваяСтрока.Адрес = ТекЭлемент.Значение.ОбъектПосещения.Адрес;
НоваяСтрока.Широта = КоординатыОбъекта[0];
НоваяСтрока.Долгота = КоординатыОбъекта[1];
Если Параметры.ОтображатьСОтветственными Тогда
НоваяСтрока.Ответственный = ТекЭлемент.Значение.Ответственный.Наименование;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ТекстСкрипта = "data.addRows(" + Строка(ТаблицаОбъектовДляВывода.Количество()) + ");";
Сч = 0;
Для Каждого ТекСтрока Из ТаблицаОбъектовДляВывода Цикл
ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 0, " +СтрЗаменить(Строка(ТекСтрока.Широта),",",".") + ");";
ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 1, " +СтрЗаменить(Строка(ТекСтрока.Долгота),",",".") + ");";
ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 2, '" +Строка(ТекСтрока.Наименование) + " "
+ Строка(ТекСтрока.Город) + " " + Строка(ТекСтрока.Адрес) + " " + ?(Параметры.ОтображатьСОтветственными, ".Ответственный: " + Строка(ТекСтрока.Ответственный), "") + " " + "');";
Сч = Сч + 1;
КонецЦикла;
СтраницаХТМЛ = "<html>
| <head>
| <script src=""http://maps.google.com/maps?file=api&v=2&key=" + APIГугла + """ type=""text/javascript""></script>
| <script type=""text/javascript"" src=""http://www.google.com/jsapi""></script>
| </head>
|
| <body>
| <div id=""map_div"" style=""width: 800px; height: 550px""></div>
| <script type=""text/javascript"">
|
| google.load(""visualization"", ""1"", {packages:[""map"">);
| google.setOnLoadCallback(drawMap);
| function checkIfGoogleLoad() {
| if(!google.visualization) setTimeout(checkIfGoogleLoad, 1000);
| else drawMap();
| }
| function drawMap() {
| var data = new google.visualization.DataTable();
| data.addColumn('number', 'Lat');
| data.addColumn('number', 'Lon');
| data.addColumn('string', 'Name');" + ТекстСкрипта + "
| var map = new google.visualization.Map(document.getElementById('map_div'));
| map.draw(data, {showTip: true, mapType: 'normal'});
| }
| checkIfGoogleLoad();
| </script>
| </body>
|</html>";
КонецПроцедуры
Андрей Данилюк Категория:
COM-объекты, WMI, WSH Настройка веб-браузеров для работы в веб-клиенте 8.2 Microsoft Int ernet Explorer
Для работы с веб-клиентом в операционной системе Windows XP SP 2 требуется наличие системной библиотеки jscript.dll версии 5.6.0.8834 или выше. Библиотека находится в каталоге system32 операционной системы. Если на вашем компьютере установлена более раняя версия библиотки, то возможно значительное замедление работы веб-клиента. Для обновления версии необходимо скачать пакет обновлений. Находящийся по адресу
http://support.Microsoft.com/kb/942840/en-us .
Для начала работы необходимо выполнить следующие настройки подключения:
· открыть браузер, в меню Сервис (Tools) выбрать пункт Свойства обозревателя (
Int ernet Options).
· в открывшемся окне перейти на закладку Безопасность (Security).
· нажать кнопку Другой (Custom level…).
· в открывшемся окне в разделе Сценарии (Scripting) для параметра Активные сценарии (Active scripting) установить Разрешить или Включить (Enable) и нажать ОК.
· перейти на закладку Конфиденциальность (Privacy) и с помощью регулятора выбрать уровень использования cookies умеренный или Средний (Medium) (рекомендуется не выше Умеренно высокий (Medium High).
· на этой же закладке в разделе Блокирование всплывающих окон (Pop-up Bloker) снять флажок Блокировать всплывающие окна или Включить блокирование всплывающих окон (Blok Pop-ups или Turn on Pop-up Blocker).
Mozilla Firefox - Настройки подключения
Для начала работы необходимо выполнить следующие настройки:
· Открыть браузер. В меню Инструменты (Tools) выбрать пункт Настройки (Options).
· В открывшемся окне перейти в раздел Содержимое (Content).
· Снять флажок Блокировать всплывающие окна (Block pop-up Windows).
· Установить флажок Использовать JavaScript (Enable JavaScript).
· Перейти в раздел Приватность (Privacy) и установить флажок Принимать cookies с сайтов (Assept cookies from sites).
Автоматическая аутентификация
Для браузера Mozilla Firefox имеется возможность сконфигурировать веб-браузер для использования автоматической аутентификации ОС. Для этого необходимо выполнить следующие настройки:
· в адресной строке браузера набрать Aboutconfig
· затем на странице настроек в строке фильтра ввести название параметра.
Данная настройка осуществляется для трех параметров:
a) network.automatic-ntlm-auth.trusted-uris,
b) network.negotiate-auth.delegation-uris,
c) network.negotiate-auth.trusted-uris.
· Далее задать список веб-серверов, через которые будет осуществляться работа с базой «1С-Предприятия».
Источник Категория:
Администрирование Создание и работа с БД MySQL из 1С Появилась необходимость выложить часть данных из 1С в открытый доступ большому числу пользователей.
Что бы не нарушать условий лицензирования и обеспечить безопасность данных, было принято решение развернуть новую базу на MySQL. Так как особо модерировать ее никто не хочет, пришлось сделать управление MySQL-ной БД из 1С, и начал с создания структуры БД. Итак:
Создаем 2 справочника неирархических, один подчинен другому.
а.
Таблицы
б.
Колонки
Таблицы - реквизиты:
Автокод - Булево (Определяет необходимость нумеровать запись уникальным кодом, или отдать нумерование на откуп MySQL)
Таблицы - колонки:
ТипДанных - Число (в коде определим тип хранящихся данных по числу)
Длина - Число (длина хранящихся данных)
МожетБытьНоль - булево (может ли хранится пустое значение)
Связь - СсылкаНа таблицу (С которой есть связь все к одному)
Заполняем значениями справочники...
Теперь подключаемся:
Код 1C v 8.х Connection = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "DRIVER={MySQL ODBC 5.1 Driver};OPTION=3;DATABASE=" + константы.lk_БД.Получить() + ";PWD=" + константы.lk_Пароль.Получить() + ";PORT=3306;SERVER=" + константы.lk_Сервер.Получить() + ";UID=" + константы.lk_Пользователь.Получить() + ";";
Connection.Open(СокрЛП(СтрокаПодключения));
Сначала удалим таблицы если они есть:
Код 1C v 8.х Результат = Новый COMОбъект("ADODB.Command");
Результат.ActiveConnection = Connection; // работаем через это соединение
Результат.CommandTimeOut = Connection.CommandTimeOut; // таков тайм-аут
Результат.CommandType = "adCmdText";
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Таблицы.Наименование КАК Таблица
| ИЗ
| Справочник.Таблицы КАК Таблицы";
ВыборкаТаблиц = Запрос.Выполнить().Выбрать();
Пока ВыборкаТаблиц.Следующий() Цикл
Результат.CommandText = " D_rop TABLE IF EXISTS " + ВыборкаТаблиц.Таблица + " ;";
Результат.Execute();
КонецЦикла;
Теперь приступим к созданию таблиц БД:
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Таблицы.Наименование КАК Таблица,
| Колонки.Наименование КАК Колонка,
| Колонки.ТипДанных,
| Колонки.Длина,
| Колонки.МожетБытьНоль,
| Колонки.Связь.Наименование КАК Связь
|ИЗ
| Справочник.Колонки КАК Колонки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Таблицы КАК Таблицы
| ПО Колонки.Владелец = Таблицы.Ссылка
|
|ИТОГИ ПО
| Таблица";
ВыборкаТаблиц = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаТаблиц.Следующий() Цикл
Скрипт = " CREATE TABLE " + ВыборкаТаблиц.Таблица + " ( " + символ(13) +
" " + ПолучитьКолонкуID(ВыборкаТаблиц.Таблица) + " int (11) NOT NULL " + ?(Справочники.Lk_Таблицы.НайтиПоНаименованию(ВыборкаТаблиц.Таблица).АвтоКод,"auto_increment","") + "," + символ(13);
Выборка = ВыборкаТаблиц.Выбрать();
Строчека = "" ;
Ключики = "";
Пока Выборка.Следующий() цикл
Строчека = Строчека + "`" + Выборка.Колонка + "` " + ПолучитьПродолжениеСкрипта(Выборка.ТипДанных,Выборка.длина,Выборка.МожетБытьНоль) + "," + символ(13);
ЕСли ЗначениеЗаполнено(Выборка.Связь) Тогда
Ключики = Ключики + ", KEY `FK_" + ВыборкаТаблиц.Таблица + "-" + Выборка.Колонка + "` (`" + Выборка.Колонка + "`),
| CONSTRAINT `FK_" + ВыборкаТаблиц.Таблица + "-" + Выборка.Колонка + "` FOREIGN KEY (`" + Выборка.Колонка + "`) REFERENCES `" + Выборка.Связь + "` (`" + ПолучитьКолонкуID(Выборка.Связь) + "`)" + Символ(13) ;
КонецЕсли;
КонецЦикла;
Скрипт = Скрипт + Строчека;
Скрипт = Скрипт + " PRIMARY KEY (" + ПолучитьКолонкуID(ВыборкаТаблиц.Таблица) + ") " + символ(13) + Ключики +
" ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
Сообщить("Таблица создана: " + ВыборкаТаблиц.Таблица);
Результат.CommandText = скрипт;
Результат.Execute();
КонецЦикла;
Connection.Close();
И под закуску недостающие функции, использованные в основном тексте:
Код 1C v 8.х Функция ПолучитьКолонкуID(зн) экспорт
ПрефиксКончился = Ложь;
Колонка = "";
Для сч = 1 по СтрДлина(зн) Цикл
Символик = Mid(зн,Сч, 1);
Если ПрефиксКончился Тогда
Колонка = Колонка + Символик;
КонецЕсли;
Если Символик = "_" Тогда
ПрефиксКончился = Истина;
КонецЕсли;
КонецЦикла;
Если Колонка = "" Тогда
Колонка = зн;
КонецЕсли;
Колонка = Колонка + "ID";
Возврат Колонка;
КонецФункции
Предполагается что название таблиц идут с префиксом например: prefix_NameTable
Код 1C v 8.х Функция ПолучитьПродолжениеСкрипта(ТипД,ДлинаД,Ноль) экспорт
Если ТипД = 1 тогда //строка
Зн = " varchar(" + Строка(ДлинаД) + ") " + ?(Ноль, "null","NOT NULL");
ИначеЕсли ТипД = 2 Тогда //число
Зн = " int (11) " + ?(Ноль, "null","NOT NULL");
ИначеЕсли ТипД = 3 Тогда //смаллчисло
Зн = " smallint (6) " + ?(Ноль, "null","NOT NULL");
ИначеЕсли типД = 4 тогда //текст
Зн = " text";
ИначеЕсли ТипД = 5 тогда // дата
Зн = " date " + ?(Ноль, "null","NOT NULL");
ИначеЕсли ТипД = 6 Тогда //смаллчисло
Зн = " bit(1) " + ?(Ноль, "null","NOT NULL");
ИначеЕсли ТипД = 7 Тогда // Дата и время
Зн = " dateTime " + ?(Ноль, "null","NOT NULL");
КонецЕсли;
Возврат Зн;
КонецФункции
Источник Категория:
COM-объекты, WMI, WSH Печать в PDF Столкнулся с вопросом печати счета на оплату сразу в pdf.
Решение: установка виртуального принтера
bioPDF скачать можно тут. И прописывание в 1с следующего кода:
Код 1C v 8.х
Попытка
ПДФ_принтер = Новый COMОбъект("bioPDF.PDFPrint erSettings");
Исключение
#Если Клиент Тогда
Предупреждение("Не удалось подключиться к PDF-принтеру!", 60);
#КонецЕсли
Возврат;
КонецПопытки;
ПДФ_принтер_имя = ПДФ_принтер.GetPrint erName();
ИмяФайла = Константы.КаталогФайловПДФ.Получить() +"" + Заголовок + ".pdf";
ПДФ_принтер.SetValue("output", ИмяФайла);
ПДФ_принтер.SetValue("ConfirmOverwrite", "yes");
ПДФ_принтер.SetValue("ShowSaveAS", "never");
ПДФ_принтер.SetValue("ShowSettings", "never");
ПДФ_принтер.SetValue("ShowPDF", "no");
ПДФ_принтер.SetValue("Target", "print er");
ПДФ_принтер.SetValue("Subject", "Report generated at " + ТекущаяДата());
ПДФ_принтер.SetValue("UseThumbs", "yes");
ПДФ_принтер.SetValue("Zoom", "100");
ПДФ_принтер.SetValue("WatermarkFontSize", "10");
ПДФ_принтер.SetValue("WatermarkTransparency", "50");
ПДФ_принтер.SetValue("WatermarkVerticalPosition", "bottom");
ПДФ_принтер.SetValue("WatermarkHorizontalPosition", "right");
ПДФ_принтер.SetValue("WatermarkVerticalAdjustment", "3");
ПДФ_принтер.SetValue("WatermarkHorizontalAdjustment", "1");
ПДФ_принтер.SetValue("WatermarkRotation", "90");
ПДФ_принтер.SetValue("WatermarkColor", "#ff0000");
ПДФ_принтер.SetValue("WatermarkOutlineWidth", "1");
ПДФ_принтер.WriteSettings(True);
ПечатныйДокумент.ИмяПринтера = ПДФ_принтер_имя;
ПечатныйДокумент.АвтоМасштаб = Истина;
ПечатныйДокумент.Напечатать();
Как выяснилось во время печати в pdf есть проблема с передачей прозрачности картинки. Если вставлять прозрачную печать в счет поверх подписи, то в pdf-документе печать будет непрозрачной и затрет все собой. У меня был частный случай, когда печать находилась на одном и том же месте документа и за ней постоянно было одно и то же. Решением в данном случае стала генерация картинки печати с фоном, на котором она должна быть и вставка её в макет.
Так же решением может быть печать не в pdf а xps документ. Там с прозрачностью все нормально.
Автор:
Андрей Данилюк
Экспорт печатных форм и любых данных из 1С в BMP, JPEG, PCX, PDF, PNG и TIFF. Категория:
COM-объекты, WMI, WSH Выгрузка данных в Excel с установкой разных параметров Код 1C v 8.х // Процедура выгружает из указанного справочника данные в режиме экспорта в файл в формате Microsoft Excel
// с указанным именем, используя преобразование данных к типу число и типу строка;
Процедура ОсновныеДействияФормыЭкспорт(Кнопка)
Попытка
Попытка
// Загрузка объекта Microsoft Excel
Состояние("Выгрузка данных из 1С в Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Ошибка при запуске Microsoft Excel."
+ Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
// Создадим книгу, по умолчанию в ней уже есть листы
Книга = ExcelПриложение.WorkBooks.Add();
// Используем первый лист книги Excel
Лист = Книга.WorkSheets(1);
// Сформировать шапку документа в первой строке листа
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Лист.Cells(1, Колонка).Value = стр.НазваниеРеквизита;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
// Выгрузить данные справочника
выборка = Справочники[ИмяСправочника].Выбрать();
СтрокаЛиста = 2;
Пока выборка.Следующий() Цикл
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Попытка
// Установить значение в строке и колонке
Если ТипЗнч(выборка[стр.НазваниеРеквизита])=Тип("Число") Тогда
// Установить формат для типа Число
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "0,00";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Формат(выборка[стр.НазваниеРеквизита],"ЧГ=0");
иначе
// Для всех других типов установим формат "Текстовый"
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "@";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Строка(выборка[стр.НазваниеРеквизита]);
КонецЕсли;
исключение
// в случае ошибки вывести номер строки и колонки
Сообщить("Ошибка установки значения для: " +
выборка[стр.НазваниеРеквизита]);
Сообщить("Стр: " +СтрокаЛиста+ " Кол: " +
Колонка+ " Рек: " + стр.НазваниеРеквизита);
КонецПопытки;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
СтрокаЛиста = СтрокаЛиста + 1;
Состояние("Экспорт из 1С в Excel " + СтрокаЛиста);
КонецЦикла;
// Сохраним созданную книгу в файл xls
Книга.SaveAs(имяФайла);
// Обязательно закроем соединение с COM объектом для освобождения памяти
ExcelПриложение.Quit();
Сообщить("Файл выгружен успешно: " + имяФайла );
Исключение
// Обработка ошибок экспорта данных из 1С в Excel
Сообщить("Ошибка записи данных файла :" + имяФайла);
Сообщить(ОписаниеОшибки());
Попытка
ExcelПриложение.Quit();
Исключение
КонецПопытки;
КонецПопытки;
КонецПроцедуры
Код 1C v 7.x //Простейший пример вывода из 1С:Предприятия 7.7 в MS Excel. Обеспечение наличия у рабочей книги единственного листа,
//установка размера, жирности и цвета шрифта, ширины колонок, рамок и заливки ячеек. Выравнивание текста
//ячеек, группировка строк, установка числового формата ячеек, закрепление области.
Процедура Вывод()
Попытка
Application=СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки(),"!!!");
Сообщить("Возможно, MS Excel не установлен на этом компьютере.");
Возврат;
КонецПопытки;
//Создание рабочей книги
WorkBook=Application.WorkBooks.Add();
//Получение окна
Window=WorkBook.Windows(1);
//Установка невидимости окна для убыстрения вывода
Window.Visible=0;
//Обеспечение наличия у рабочей книги единственного листа
Если WorkBook.Worksheets.Count=0 Тогда
WorkBook.Worksheets.Add();
Иначе
Application.DisplayAlerts=0;//не выдавать предупреждений
Пока WorkBook.Worksheets.Count>1 Цикл
WorkBook.Worksheets(1).Delete();
КонецЦикла;
Application.DisplayAlerts=-1;//восстановление флага выдачи предупреждений
КонецЕсли;
//Получение рабочего листа
Worksheet=WorkBook.Worksheets(1);
//Задание имени рабочего листа
Worksheet.Name="Пример вывода";
//Заголовок документа
Worksheet.Range("A1").Value="Пример вывода из 1С:Предприятия в MS Excel";
Worksheet.Range("A2").Value="сегодня "+ТекущаяДата();
Worksheet.Range("A1:A2").Font.Size=14;//размер шрифта
Worksheet.Range("A1:A2").Font.Bold=-1;//жирный шрифт
//Задание ширины колонок
Worksheet.Columns(1).ColumnWidth=60;
Worksheet.Columns(2).ColumnWidth=15;
Worksheet.Columns(3).ColumnWidth=15;
//Шапка документа
Worksheet.Range("A4").Value="Первая колонка";
Для ы=7 по 10 Цикл//рамки
Worksheet.Range("A4").Borders(ы).LineStyle=1;
Worksheet.Range("A4").Borders(ы).Weight=-4138;//xlMedium
КонецЦикла;
Worksheet.Range("A4").Int erior.ColorIndex=15;//заливка серым
Worksheet.Range("A4").HorizontalAlignment=-4108;//выравнивание текста по центру
Worksheet.Range("B4").Value="Вторая";
Для ы=7 по 10 Цикл
Worksheet.Range("B4").Borders(ы).LineStyle=1;
Worksheet.Range("B4").Borders(ы).Weight=-4138;
КонецЦикла;
Worksheet.Range("B4").Int erior.ColorIndex=15;
Worksheet.Range("B4").HorizontalAlignment=-4108;
Worksheet.Range("C4").Value="Третья";
Для ы=7 по 10 Цикл
Worksheet.Range("C4").Borders(ы).LineStyle=1;
Worksheet.Range("C4").Borders(ы).Weight=-4138;
КонецЦикла;
Worksheet.Range("C4").Int erior.ColorIndex=15;
Worksheet.Range("C4").HorizontalAlignment=-4108;
//Для группировки строк:
Worksheet.Outline.SummaryRow=0;//"итоговые" строки отображать сверху (если снизу, то 1)
//Вывод строк
Worksheet.Range("A5").Value="Объект аналитики";
Worksheet.Range("A5").Font.ColorIndex=5;//цвет шрифта - синий
Worksheet.Range("B5").Value=123.45;
Worksheet.Range("B5").Font.ColorIndex=5;
Worksheet.Range("C5").Value=678.9;
Worksheet.Range("C5").Font.ColorIndex=5;
Worksheet.Range("A6").Value="Объект аналитики";
Worksheet.Range("A6").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B6").Value=123.45;
Worksheet.Range("B6").Font.ColorIndex=3;
Worksheet.Range("C6").Value=678.9;
Worksheet.Range("C6").Font.ColorIndex=3;
Worksheet.Range("A7").Value="Объект аналитики";
Worksheet.Range("B7").Value=123.45;
Worksheet.Range("C7").Value=678.9;
Worksheet.Range("A8").Value="Объект аналитики";
Worksheet.Range("B8").Value=123.45;
Worksheet.Range("C8").Value=678.9;
Worksheet.Range("A9").Value="Объект аналитики";
Worksheet.Range("A9").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B9").Value=123.45;
Worksheet.Range("B9").Font.ColorIndex=3;
Worksheet.Range("C9").Value=678.9;
Worksheet.Range("C9").Font.ColorIndex=3;
Worksheet.Range("A10").Value="Объект аналитики";
Worksheet.Range("B10").Value=123.45;
Worksheet.Range("C10").Value=678.9;
Worksheet.Range("A11").Value="Объект аналитики";
Worksheet.Range("B11").Value=123.45;
Worksheet.Range("C11").Value=678.9;
Worksheet.Range("A12").Value="Объект аналитики";
Worksheet.Range("A12").Font.ColorIndex=5;//цвет шрифта - синий
Worksheet.Range("B12").Value=123.45;
Worksheet.Range("B12").Font.ColorIndex=5;
Worksheet.Range("C12").Value=678.9;
Worksheet.Range("C12").Font.ColorIndex=5;
Worksheet.Range("A13").Value="Объект аналитики";
Worksheet.Range("A13").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B13").Value=123.45;
Worksheet.Range("B13").Font.ColorIndex=3;
Worksheet.Range("C13").Value=678.9;
Worksheet.Range("C13").Font.ColorIndex=3;
Worksheet.Range("A14").Value="Объект аналитики";
Worksheet.Range("B14").Value=123.45;
Worksheet.Range("C14").Value=678.9;
Worksheet.Range("A15").Value="Объект аналитики";
Worksheet.Range("B15").Value=123.45;
Worksheet.Range("C15").Value=678.9;
Worksheet.Range("A16").Value="Объект аналитики";
Worksheet.Range("A16").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B16").Value=123.45;
Worksheet.Range("B16").Font.ColorIndex=3;
Worksheet.Range("C16").Value=678.9;
Worksheet.Range("C16").Font.ColorIndex=3;
Worksheet.Range("A17").Value="Объект аналитики";
Worksheet.Range("B17").Value=123.45;
Worksheet.Range("C17").Value=678.9;
Worksheet.Range("A18").Value="Объект аналитики";
Worksheet.Range("B18").Value=123.45;
Worksheet.Range("C18").Value=678.9;
//Установка рамок
Для НомСтр=5 по 18 Цикл
Для ы=7 по 10 Цикл
Worksheet.Range("A"+НомСтр).Borders(ы).LineStyle=1;
Worksheet.Range("B"+НомСтр).Borders(ы).LineStyle=1;
Worksheet.Range("C"+НомСтр).Borders(ы).LineStyle=1;
КонецЦикла;
КонецЦикла;
//Группировка строк
Worksheet.Range("7:8").Rows.Group();
Worksheet.Range("10:11").Rows.Group();
Worksheet.Range("14:15").Rows.Group();
Worksheet.Range("17:18").Rows.Group();
Worksheet.Range("6:11").Rows.Group();
Worksheet.Range("13:18").Rows.Group();
//Свёртка группировок до первого уровня
Worksheet.Outline.ShowLevels(1);
//Установка числового формата
Попытка
Worksheet.Range("B5:C18").NumberFormat="# ##0.00";
Исключение
Попытка
Worksheet.Range("B5:C18").NumberFormat="# ##0,00";
Исключение
КонецПопытки;
КонецПопытки;
//Установка видимости приложения и его окна
Application.Visible=-1;
Window.Visible=-1;
//Закрепление области
Worksheet.Range("A5").S_elect();
Window.FreezePanes = -1;
КонецПроцедуры //Вывод
Категория:
Работа с Microsoft Office и OpenOffice Как связать 1C, PHP , MySQL? В современном мире люди используют Интернет не только для поиска информации, но и для приобретения каких либо товаров и услуг. Поэтому организации, например имеющие статус среднего бизнеса, стараются разместить свои прайс-листы в интернете или даже создать Интернет-магазин. Создать его не так-то просто. Если вы имеете «реальный» бизнес и используете определенную систему учета товаров (или услуг), нужно учитывать несколько немаловажных факторов:
* Каждый уважающий себя Интернет-магазин должен показывать остаток товара на складе, а также не показывать тот товар, которого уже нет в наличии. (а может быть что товар есть на разных региональных складах)
* Цены не должны расходиться с ценами в реальном магазине. Не учитывая доставку, хотя и это уже давно стало бесплатным практически везде.
Я привел только 2 факта, в действительности их может быть гораздо больше, всё зависит от того, какую цель вы ставите перед своим Интернет-проектом.
Многие организации для ведения учета товаров или оказанных услуг используют ПО «1С» и как показывает практика, большая часть организаций работает с версией 7.7, и не торопятся перейти на 8.х. так как это влечет за собой накладные расходы.
Для Реализации работы с WEB в 1С7.7 есть прекрасное решение - WEB-расширение, но оно работает только с Microsoft
Int ernet Information Server (IIS). IIS используют не все хостинг – провайдеры, да и те кто использует вряд ли разрешат подключить свой сервер к чужой БД.
А держать «у себя» IIS сервер достаточно накладно для организаций среднего бизнеса (оборудование + интернет канал + лицензии ОС и ПО = увеличение стоимости товара).
Другое дело «свободное» ПО и ОС: Linux, Apache, PHP, MySQL. Эти четыре продукта использует большинство хостинг – провадеров, поэтому их использование как платформы для создания Интернет-проектов наиболее оптимально.
Как связать 1С 7.7 с MySQL? Можно использовать внешнюю компоненту MySQL,dll, но её использование не всегда возможно, особенно если ваш Веб-сервер находиться удаленно или вы покупаете хостинг у сторонней организации, так как не безопасно открывать доступ к БД из Интернета.
Для решения этой задачи я использовал технологию передачи данных через URL.
Возможно, звучит это немного дико, и многие подумают, что это неправильное решение. Однако эта система работает и работает достаточно хорошо и корректно.
И сейчас я бы хотел поделиться с коллегами приобретенным опытом реализации это технологии.
Кратко о принципе:
Выглядит это так: из 1С вызывается url и через него же передаются данные PHP-скрипу, который в свою очередь делает с ними все, что необходимо.
Например, нам нужно передать остаток товара на складе: из 1С должен будет сформироваться url: http://www.server.com/script.php?good=201&count=302&date=2009-06-09, где:
* http://www.server.com – адрес сервера
* script.php – исполняющий скрипт
* good=201 – переменная и код товара
* count=302 – переменная и количество остатка
* date=2009-06-09 – дата на которую передается остаток
причем для работы данной схемы достаточно лишь иметь доступ в Интернет с того компьютера на котором выполняется операция по передачи данных. (сервер БД нет необходимости подключать к Интернету)
Встреча с возможными ошибками:
Для начала хотелось бы рассказать о тех проблемах, с которыми я столкнулся и о том, как можно их наиболее эффективно решить:
1. Проблема передачи дробных чисел, а именно трудности, возникающие при использовании символа «точка» (.)
Если необходимо передать любое дробное число, то в 1С оно будет храниться виде 1.1. При передаче числа через url точка, отделяющая целую часть от дробной, вызывает ошибку, так как символ «точка» служит для разделения доменов. Следовательно, необходимо преобразовать эту самую «точку» в другой символ наиболее подходящий для этого. И этот символ - «запятая» (,). Для того чтобы осуществить это преобразование, я написал функцию, листинг которой приведен ниже:
Код 1C v 7.x Функция ЧислоURL(Стр)
Возврат СтрЗаменить(Строка(Стр),".",",");
КонецФункции
Эта функция возвращает строку в которой все символы «.» заменены на «,» в строковой переменной Стр. Применимо это не только к числам, но и к текстовым данным.
Теперь при передаче число 1.1 будет иметь формат 1,1. Далее при получении мы должны привести это число обратно в «привычный» вид, это можно сделать на стороне PHP-скрипта функцией strtr() . краткое её описание я привел ниже:
Описание функции string strtr ( string $str , string $from , string $to ):
Эта функция возвращает строку str , в которой каждое вхождение любого символа из перечисленных в from заменено на соответствующий символ из строки to . (www.php.net)
Т.е. в нашем случае функция будет иметь вид strtr("1,1", ",", ".") и результатом её работы будет: 1.1
2. Проблема передачи даты. В 1С дата имеет вид «ДД.ММ.ГГГГ» например, 01.01.2009. При передаче такого вида данных будет вызвана такая же ошибка, как и при передаче числовых данных. Конечно, для решения и этой проблемы можно использовать указанную выше функцию ЧислоURL, но я решил пойти другим путём и конвертировал дату в формат MySQL, то есть «ГГГГ-ММ-ДД». Для этого я написал функцию МуДата, вот ее листинг:
Код 1C v 7.x Функция МуДата(Стр) //дата в формате MySQL (ГГГГ-ММ-ДД)
Возврат "" + ДатаГод(Стр) + "-" +ДатаМесяц(Стр) + "-" + ДатаЧисло(Стр);
КонецФункции
Функция работает следующим образом – опять же выделяет из переменной Стр, Год, Месяц, Число и выстраивает их в формате ГГГГ-ММ-ДД, наиболее привычным при работе с MySQL. Об ошибках все.
Подготовка 1С :
Теперь расскажу о том, как заставить 1С работать с WEB.
Для того, чтобы иметь возможность работать с протоколом HTTP в 1С, я использовал библиотеку V7+, которая поставляется фирмой 1С и служит для расширения возможностей 1С 7.7.
Для начала необходимо подключить внешнюю компоненту (подробнее здесь), используя функцию «ЗагрузитьВнешнююКомпоненту("v7plus.dll")». Далее необходимо создать объект addin.v7httpreader, для этого я использовал переменную НТТР. А для передачи и получения данных используется метод ПолучитьКакСтроку(адрес, СтрокаДляПриёма); который получает данные в переменную СтрокаДляПриёма с адреса указанного в переменной адрес. В целом все это будет выглядеть примерно так:
Код 1C v 7.x Процедура Сформировать()
ПЕРЕМ СтрокаДляПриёма;
ЗагрузитьВнешнююКомпоненту("v7plus.dll");
HTTP=СоздатьОбъект("addin.v7httpreader");
адрес="http://www.google.ru";
HTTP. ПолучитьКакСтроку (адрес, СтрокаДляПриёма);
сообщить (СтрокаДляПриёма);
КонецПроцедуры
Выше указанная процедура выведет в окно сообщений HTML-код заглавной страницы сайта http://www.google.ru
Таким образом, теперь мы знаем, как, из 1С, обратиться к нужному сайту, и получить его HTML-код.
Немного о PHP:
Теперь напишем PHP-скрипт, который просто будет выводить данные полученные методом GET. (ознакомиться с тем, как PHP получает данные можно здесь) Листинг такого скрипта:
Код <?php
$text=$_GET['text']; // получаем значение переменной text
print $text;
?>
Назовем его test.php и поместим в корневую папку web-сервера. Далее для проверки работы скрипта введем в адресную строку браузера http://localhost/test.php?text=hello%20wolrd В том случае, если все сделано верно, на экране появиться страница с текстом hello world.
«Соединяем» 1С и PHP:
Далее создаем в 1С внешнюю обработку и вставим в её модуль следующий код:
Код 1C v 7.x Функция Сформировать()
ПЕРЕМ СтрокаДляПриёма;
ЗагрузитьВнешнююКомпоненту("v7plus.dll");
HTTP=СоздатьОбъект("addin.v7httpreader");
адрес="http://localhost/test.php?text="+текст;
HTTP. ПолучитьКакСтроку(адрес, СтрокаДляПриёма);
Сообщить(СтрокаДляПриёма);
КонецФункции
Отличается она от алгоритма, который мы создавали выше лишь значением в переменной адрес.
И так в случае успешной работы 1С и РНР-скпипта в окне сообщений 1С мы увидим надпись hello world.
Теперь очевидно, что с помощью 1C можно передать данные PHP-скриптам, а они в свою очередь делают с ними все что необходимо, например, записывают их в БД.
Пример записи данных в БД MySQL:
Запись в БД MYSQL будет производиться средствами PHP, об этом сказано уже не мало. Поэтому чтобы не повторяться, опишу пример из собственной практики.
Для начала создадим обработку в 1С:
На форму положим поле ввода и присвоим ему идентификатор текст, далее немного переделаем процедуру описанную в разделом выше:
Код 1C v 7.x Процедура Сформировать()
ПЕРЕМ СтрокаДляПриёма;
ЗагрузитьВнешнююКомпоненту("v7plus.dll");
HTTP=СоздатьОбъект("addin.v7httpreader");
адрес=адрес="http://localhost/test.php?text="+Стр;
HTTP. ПолучитьКакСтроку(адрес, СтрокаДляПриёма);
возврат(СтрокаДляПриёма);
КонецПроцедуры
Теперь необходимо создать БД в MySQL (как это сделать описано здесь). Создадим БД и присвоим ей имя TESTDB. Далее создадим таблицу с именем TEST:
Код CREATE TABLE `test` (
`id` INT NOT NULL AUTO_INCREMENT ,
`text` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
);
Как видно из запроса, в таблице всего 2 поля:
* id – уникальный номер сроки;
* text – текстовое поле, куда будут помещаться данные из 1С.
Теперь необходимо написать PHP-скрипт, который и будет записывать данные из 1С в MySQL. Листинг данного скрипта приведен ниже:
Код <?php
$host='localhost'; //адрес сервера
$db='testdb'; //имя БД
$user='root'; // имя пользователя
$password=''; //пароль к БД
$link = mysql_connect($host, $user, $password); //установка соединения
mysql_S_elect_db($db, $link); //подключения в БД
$text=$_GET['text']; // получаем значение переменной text
$query = "I_nsert int o test values (NULL, '$text')"; //генерируем запрос
mysql_query($query, $link); //отправляем запрос
print mysql_error(); //сообщаем об ошибке если ошибок не было то возвращает пустое значение.
?>
Все готово! Теперь открываем Внешнюю обработку в 1С и пишем в поле ввода слово Hello! Нажимаем кнопку «Сформировать». Если все сделано правильно, то в созданной нами таблице появится запись со словом Hello! В противном случае, в окне сообщений 1С появится текст ошибки.
Заключение:
Весь тот опыт, которым я поделился в этой статье, можно использовать не только в Интернет-торговли, но и в корпоративных целях, например для того, чтобы:
* Консолидировать данные в единую БД MySQL;
* Предоставлять отчеты компетентным лицам, где бы они не находились.
И это еще далеко не весь перечень, ведь WEB-технологии - очень гибкий инструмент с неограниченным спектром возможностей, при условии умелого их использования.
В общем-то, мной был не только реализован механизм отправки данных, но и приема через HTTP, но вот это уже совсем другая история!
Автор:
Хамитов Руслан Категория:
COM-объекты, WMI, WSH Подключение к 1С Предприятию из PHP с помощью COM соединения. Данный пример работает для 1С Предприятия v8 и реализует соединение с ним через COM интерфейс посредство PHP класса COM.
Код <?
// Создаем новое COM соединение
$app = new COM("v8.COMConnector") or die("Невозможно создать COM соединение");
print "Loaded 1Cn";
//Путь к базе и имя пользователя. Третьим параметром
//может выступать пароль пользователя (если задан
//в конфигураторе)
$path = "G:/1cv80/Bases/Test/";
$user = "Test";
//Подсоединяемся к нужной базе
$con = $app->Connect("File=$path;Usr =$user");
//В качестве проверки результата получаем глобальную
//переменную glCurrUser определенную в модуле внешенего
//соединения 1С Предприятия v8 и инициализированную
//при начале работы системы
print "Current 1C user is {$con->glCurrUser}n";
//освобождаем объект
$app->Release();
$app= null;
?>
Категория:
COM-объекты, WMI, WSH