Пример работы с MS EXCEL (листы, поиск на листе) Код 1C v 8.х ДокументExcel = ПолучитьCOMОбъект( ИмяФайла) ;
Категория:
Работа с Microsoft Office и OpenOffice Как мы писали парсер сайта с ценами для 1С Недавно, мой постоянный клиент решил проводить маркетинговые исследования по изменению цен на товары у конкурентов... и эти данные захотел использовать в 1С в связке с его прайс-листом + куча отчетов с графиками и процентным отклонением от цен основного конкурента
В результате этого, была написана обработка собирающая данные со страниц разных сайтов. Из целей конфиденциальности - сайты раскрывать не буду...
Вид обработки загрузки данных с сайта в 1С
Ниже код загрузки данных со страницы сайта , смысл такой :
в функция передается адрес страницы сайта полученный текст страницы обрабатывается, удаляются теги из полученного текста формируется ТЗ с данными По названию ищется поставщик из вспомогательного справочника Справочники.Pr_Поставщики.НайтиПоНаименованию(, если нет - создается на выходе ТЗ с данными Код 1C v 8.х Функция ПолучитьТаблицуДанных(Строка)
тзДанных = Новый ТаблицаЗначений;
Сервер = "site.ru" ;
Соединение = Новый HTTPСоединение( Сервер) ;
Заголовки = Новый Соответствие;
Заголовки. Вставить( "host" , Сервер) ;
ТекАдрес = СтрЗаменить( Строка. Наименование. УРЛСтраницы, "http://" , "" ) ;
ТекАдрес = СтрЗаменить( ТекАдрес, Сервер, "" ) ;
Запрос = Новый HTTPЗапрос( ТекАдрес, Заголовки) ;
Ответ = Соединение. Получить( Запрос) ;
Если Ответ. КодСостояния = 200 Тогда
Содержимое= Ответ. ПолучитьТелоКакСтроку( ) ;
НачалоБлока = "<table id=" + """ " + "table-price" + """ " + " cellspacing=" + """ " + "0" + """ " + " border=" + """ " + "1" + """ " + " bordercolor=" + """ " + "#dedede" + """ " + " class=" + """ " + "tablesorter" + """ " + " >" ;
КонецБлока = "</table>" ;
ТекстБлока = Сред( Содержимое, Найти( Содержимое, НачалоБлока) + СтрДлина( НачалоБлока) , Найти( Содержимое, КонецБлока) - Найти( Содержимое, НачалоБлока) - СтрДлина( НачалоБлока) ) ;
обрТекст = СтрЗаменить( ТекстБлока, "<tr>" , "" ) ;
обрТекст = СтрЗаменить( обрТекст, "</tr>" , Символы. ПС) ;
обрТекст = СтрЗаменить( обрТекст, " >" , ">" ) ;
обрТекст = СтрЗаменить( обрТекст, "</th> <th>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</td> <td>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</th> <th class=" + """ " + "sortable_header" + """ " + ">" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</th> <th >" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</th><th>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, "</td><td>" , " | " ) ;
обрТекст = СтрЗаменить( обрТекст, " >" , ">" ) ;
RegExp = Новый COMОбъект( "VBScript.RegExp" ) ;
RegExp. IgnoreCase = Ложь ;
RegExp. Global = Истина ;
RegExp. MultiLine = Истина ;
RegExp. Pattern = "<[^>]*>" ;
обрТекст= RegExp. Replace( обрТекст, "" ) ;
Если СокрЛП( обрТекст) = "Ни одной позиции не найдено." Тогда
Сообщить( Строка( Строка. Наименование) + " = Ни одной позиции не найдено! Строка " + Строка. Наименование) ;
Возврат тзДанных;
КонецЕсли ;
Если Найти( обрТекст, "Страница не найдена" ) > 0 Тогда
Сообщить( Строка( ТекАдрес) + " = Страница не найдена, строка " + Строка. Наименование) ;
Возврат тзДанных;
КонецЕсли ;
Для н= 1 По СтрЧислоСтрок( обрТекст) Цикл
СтрТекста= СтрПолучитьСтроку( обрТекст, н) ;
Если Найти( СтрТекста, "Длина Цена" ) > 0 Тогда
СтрТекста = СтрЗаменить( СтрТекста, "Длина Цена" , "Длина | Цена" ) ;
КонецЕсли ;
Если Найти( СтрТекста, "Марка стали Цена" ) > 0 Тогда
СтрТекста = СтрЗаменить( СтрТекста, "Марка стали Цена" , "Марка стали | Цена" ) ;
КонецЕсли ;
Если Найти( СтрТекста, ", Поставщик" ) > 0 Тогда
СтрТекста = СтрЗаменить( СтрТекста, ", Поставщик" , " | Поставщик" ) ;
КонецЕсли ;
мсДанных = ПолучитьМассивИзСтрокиСРазделителем( СтрТекста, "|" , Истина ) ;
Если н= 1 Тогда
Для Каждого ткЗнач из мсДанных Цикл
СтрЗапрещСимволов = " .,<>"" \/-" ;
ИмяКолонки = ткЗнач;
Для сч33 = 1 по СтрДлина( СтрЗапрещСимволов) Цикл
ЗапрещСимв = Сред( СтрЗапрещСимволов, сч33 , 1 ) ;
ИмяКолонки = СтрЗаменить( ИмяКолонки, ЗапрещСимв, "_" ) ;
КонецЦикла ;
Если НРег( ИмяКолонки) = "поставщик" Тогда
Для Сч_дк = ( Строка. Наименование. Родитель. Поставшик - 2 ) по тзДанных. Колонки. Количество( ) Цикл
тзДанных. Колонки. Добавить( "Колонка_" + ( тзДанных. Колонки. Количество( ) + 1 ) ) ;
КонецЦикла ;
КонецЕсли ;
тзДанных. Колонки. Добавить( ИмяКолонки) ;
КонецЦикла ;
тзДанных. Колонки. Добавить( "ном" , , , 7 ) ;
Иначе
НовСтр = тзДанных. Добавить( ) ; нмас= 0 ;
Для Каждого ткЗнач из мсДанных Цикл
НовСтр[нмас] = ткЗнач;
нмас= нмас+ 1 ;
КонецЦикла ;
НовСтр. ном = н;
КонецЕсли ;
КонецЦикла ;
тзДанных. Колонки. Добавить( "ЕстьСоответствие" , Новый ОписаниеТипов( "Булево" ) ) ;
тзДанных. Колонки. Добавить( "СпрPr_Поставщики" , Новый ОписаниеТипов( "СправочникСсылка.Pr_Поставщики" ) ) ;
Для каждого стр из тзДанных Цикл
текПоставщик = Справочники. Pr_Поставщики. НайтиПоНаименованию( стр[Строка. Наименование. родитель. Поставшик- 1 ]) ;
Если текПоставщик = Справочники. Pr_Поставщики. ПустаяСсылка( ) Тогда
НовЭлем = Справочники. Pr_Поставщики. СоздатьЭлемент( ) ;
НовЭлем. Наименование = СокрЛП( стр[Строка. Наименование. родитель. Поставшик- 1 ]) ;
НовЭлем. Записать( ) ;
текПоставщик = НовЭлем. Ссылка;
КонецЕсли ;
стр. СпрPr_Поставщики = текПоставщик;
КонецЦикла ;
Иначе
тзДанных. Колонки. Добавить( "ЕстьСоответствие" , Новый ОписаниеТипов( "Булево" ) ) ;
тзДанных. Колонки. Добавить( "СпрPr_Поставщики" , Новый ОписаниеТипов( "СправочникСсылка.Pr_Поставщики" ) ) ;
Сообщить( "Ошибка получения данных для строки " + Строка. Наименование) ;
КонецЕсли ;
Возврат тзДанных;
КонецФункции
В коде используется вспомогательная функция ПолучитьМассивИзСтрокиСРазделителем
Код 1C v 8.2 УП
Функция ПолучитьМассивИзСтрокиСРазделителем(Знач Стр, Разделитель = "." , ОбрезатьНепечатныеСимволы = Ложь) Экспорт
МассивСтрок = Новый Массив;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
Фрагмент = Стр;
Если ОбрезатьНепечатныеСимволы Тогда
Фрагмент = СокрЛП( Фрагмент) ;
КонецЕсли ;
МассивСтрок. Добавить( Фрагмент) ;
Возврат МассивСтрок;
КонецЕсли ;
Фрагмент = Лев( Стр, Поз- 1 ) ;
Если ОбрезатьНепечатныеСимволы Тогда
Фрагмент = СокрЛП( Фрагмент) ;
КонецЕсли ;
МассивСтрок. Добавить( Фрагмент) ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
Возврат МассивСтрок;
КонецФункции
Конечно, перед тем как мы начали это делать - прошерстили интернет и нашли несколько решений , вот они:
Код 1C v 8.х Соединение = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ИмяВременногоФайла= ПолучитьИмяВременногоФайла( "htm" ) ;
Соединение. open( "GET" , "http://mamba.ru/my" , 0 ) ;
Соединение. send( ) ;
ТаймАут = 200 ;
Начало= ТекущаяДата( ) ;
Пока Соединение. readyState < > 4 И ( ТаймАут= 0 ИЛИ ТекущаяДата( ) - Начало< ТаймАут) Цикл
бфДиалоги. ксОбработкаПрерыванияПользователя( ) ;
КонецЦикла ;
обСохранитьДвоичныйБуферВФайл( Соединение. responseBody, ИмяВременногоФайла) ;
Соединение. open( "POST" , "http://mamba.ru/my" ) ;
Соединение. send( "login=xxx&password=&&&" ) ;
Функция обСохранитьДвоичныйБуферВФайл(Буфер, ИмяФайла) Экспорт
Поток = Новый COMОбъект( "ADODB.Stream" ) ;
Поток. Type = 1 ;
Поток. Mode = 3 ;
Поток. Open( ) ;
Поток. Write( Буфер) ;
Поток. SaveToFile( ИмяФайла) ;
Поток. Close( ) ;
КонецФункции
Код 1C v 8.х НТТР = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ИмяФайлаОтвета = КаталогВременныхФайлов( ) + "filename.tmp" ;
НТТР. open( "GET" , "www.google.com" , 0 , , ) ;
НТТР. send( ) ;
StreamTypeEnum = Новый Структура( "adTypeBinary, adTypeText" , 1 , 2 ) ;
ConnectModeEnum = Новый Структура(
"adModeRead, adModeReadWrite, adModeRecursive, adModeShareDenyNone,
|adModeShareDenyRead, adModeShareDenyWrite, adModeShareExclusive,
|adModeUnknown, adModeWrite" , 1 , 3 , 4194304 , 16 , 4 , 8 , 12 , 0 , 2 ) ;
SaveOptionsEnum = Новый Структура( "adSaveCreateNotExist, adSaveCreateOverWrite" , 1 , 2 ) ;
StreamOut = Новый COMОбъект( "ADODB.Stream" ) ;
StreamOut. Type = StreamTypeEnum. adTypeBinary;
StreamOut. Mode = ConnectModeEnum. adModeReadWrite;
StreamOut. Open( ) ;
StreamOut. Write( НТТР. responseBody) ;
StreamOut. SaveToFile( ИмяФайлаОтвета, SaveOptionsEnum. adSaveCreateOverWrite) ;
StreamOut. Close( ) ;
И даже не этом сайте есть статья : Парсер сайта связного на 1С
Нужен парсер сайта в 1С!? - Обращайтесь, контакты в
профиле Категория:
Работа с Интернет, Почтой (Mail), FTP Универсальная функция для чтения данных из Excel в 1С Иногда требуется разобрать данные из Excel в 1С.
Я считаю что легче и быстрей поместить все данные в ТаблицуЗначений и уже там ими манипулировать.
Пример 2-х функций которые я использую:
ИзExcelВТаблицу – Читает Excel в ТаблицуЗначений
ЭлементСправочника – Создает или находит элемент справочника.
Теперь сам код:
Код 1C v 8.х
Функция ИзExcelВТаблицу(ПутьДоExcel, НомерСтраницы = 1, ПерСтрокаЗаголовок = Ложь , ФормаИндикатора = Неопределено)
Попытка
Док = ПолучитьCOMОбъект( ПутьДоExcel) ;
Исключение
Сообщить( "Произошла ошибка при обращение к Excel:" + Символы. ПС + ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
ЗакрытьФормуИндиктаора = Ложь ;
Если ФормаИндикатора = Неопределено тогда
ЗакрытьФормуИндиктаора = Истина ;
ФормаИндикатора = ПолучитьОбщуюФорму( "ХодВыполненияОбработкиДанных" ) ;
ФормаИндикатора. Открыть( ) ;
КонецЕсли ;
ФормаИндикатора. КомментарийЗначения = "Загрузка данных из Excel..." ;
ТЗ = Новый ТаблицаЗначений( ) ;
Страница = Док. Sheets( НомерСтраницы) ;
МакСтрок = Страница. UsedRange. Rows. Count;
МакСтолб = Страница. UsedRange. Columns. Count;
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
Если ПерСтрокаЗаголовок тогда
ИмяСтолбца = Страница. Cells( 1 , Столбец) . Value;
ИмяСтолбца = СокрЛП( ИмяСтолбца) ;
ИмяСтолбца = СтрЗаменить( ИмяСтолбца, " " , "_" ) ;
КонецЕсли ;
ТЗ. Колонки. Добавить( ИмяСтолбца, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЦикла ;
НачальнаяСтрока = 1 ;
Если ПерСтрокаЗаголовок тогда
НачальнаяСтрока = 2 ;
КонецЕсли ;
Для НомСтрока = НачальнаяСтрока по МакСтрок цикл
СтрТЗ = ТЗ. Добавить( ) ;
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Страница. Cells( НомСтрока, НомСтолбец) . Value;
СтрТЗ[НомСтолбец- 1 ] = Данные;
КонецЦикла ;
ФормаИндикатора. ЭлементыФормы. Индикатор. Значение = НомСтрока/ МакСтрок * 100 ;
КонецЦикла ;
Если ЗакрытьФормуИндиктаора тогда
ФормаИндикатора. Закрыть( ) ;
КонецЕсли ;
Возврат ТЗ;
КонецФункции
Пример вызова:
Код 1C v 8.х ФормаИндикатора = ПолучитьОбщуюФорму( "ХодВыполненияОбработкиДанных" ) ;
ФормаИндикатора. НаименованиеОбработкиДанных = "Загрузка данных..." ;
ФормаИндикатора. Открыть( ) ;
ТЗ = ИзExcelВТаблицу( ФайлExcel, 1 , Истина , ФормаИндикатора) ;
Если ТЗ = Неопределено тогда
ФормаИндикатора. Закрыть( ) ;
Возврат ;
КонецЕсли ;
ФормаИндикатора. Закрыть( ) ;
или
Код 1C v 8.х ТЗ = ИзExcelВТаблицу( ФайлExcel) ;
Если ТЗ = Неопределено тогда
Возврат ;
КонецЕсли ;
Теперь функция которой я использую когда надо создать элемент справочника из полученных данных.
Код 1C v 8.х
Функция ЭлементСправочника(ИмяСправочника = "" ,ИмяЭлемента, ИмяРодителя = Неопределено, Параметры = Неопределено, СоздатьЕслиНетЭлемента=Истина)
Если ИмяСправочника = "" тогда
Сообщить( "Укажите имя спрачоника - ЭлементСправочника()" ) ;
Возврат Неопределено ;
КонецЕсли ;
Если ПустаяСтрока( ИмяЭлемента) тогда
Возврат Неопределено ;
КонецЕсли ;
Родитель = Неопределено ;
Если ИмяРодителя < > Неопределено тогда
ОбрабатИмяРодителя = ИмяРодителя;
РодительГруппы = Справочники[ИмяСправочника]. ПустаяСсылка( ) ;
Пока НЕ ПустаяСтрока( ОбрабатИмяРодителя) цикл
ПозРазделителя = Найти( ОбрабатИмяРодителя, "\\" ) ;
Если ПозРазделителя = 0 тогда
ИмяГруппы = ОбрабатИмяРодителя;
ОбрабатИмяРодителя = ""
Иначе
ИмяГруппы = Сред( ОбрабатИмяРодителя, 1 , ПозРазделителя- 1 ) ;
ОбрабатИмяРодителя = Сред( ОбрабатИмяРодителя, ПозРазделителя+ 2 ) ;
КонецЕсли ;
ТексЗапроса = "ВЫБРАТЬ
| Данные.Ссылка
|ИЗ
| Справочник." + ИмяСправочника+ " КАК Данные
|ГДЕ
| Данные.Родитель = &Родитель
| И Данные.Наименование = &Наименование
| И Данные.ЭтоГруппа" ;
ЗапросРодителя = Новый Запрос( ТексЗапроса) ;
ЗапросРодителя. УстановитьПараметр( "Родитель" , РодительГруппы) ;
ЗапросРодителя. УстановитьПараметр( "Наименование" , ИмяГруппы) ;
РезультатРодителя = ЗапросРодителя. Выполнить( ) . Выгрузить( ) ;
Если РезультатРодителя. Количество( ) < > 0 тогда
РодительГруппы = РезультатРодителя[0 ]. Ссылка
Иначе
ОбъектРодитель = Справочники[ИмяСправочника]. СоздатьГруппу( ) ;
ОбъектРодитель. Родитель = РодительГруппы;
ОбъектРодитель. Наименование = ИмяГруппы;
ОбъектРодитель. Записать( ) ;
РодительГруппы = ОбъектРодитель. Ссылка;
КонецЕсли ;
КонецЦикла ;
Родитель = РодительГруппы;
КонецЕсли ;
Элемент = Справочники[ИмяСправочника]. НайтиПоНаименованию( ИмяЭлемента) ;
ОбъектЭлемент = Неопределено ;
Если Элемент. Пустая( ) тогда
Если СоздатьЕслиНетЭлемента тогда
ОбъектЭлемент = Справочники[ИмяСправочника]. СоздатьЭлемент( ) ;
ОбъектЭлемент. Наименование = ИмяЭлемента;
Иначе
Элемент = Неопределено
КонецЕсли ;
Иначе
ОбъектЭлемент = Элемент. ПолучитьОбъект( ) ;
КонецЕсли ;
Если ОбъектЭлемент < > Неопределено тогда
Если Параметры < > Неопределено тогда
Для каждого СтрПараметр из Параметры цикл
ОбъектЭлемент[СтрПараметр. Ключ] = СтрПараметр. Значение;
КонецЦикла ;
КонецЕсли ;
Если Родитель < > Неопределено тогда
ОбъектЭлемент. Родитель = Родитель;
КонецЕсли ;
ОбъектЭлемент. Записать( ) ;
Элемент = ОбъектЭлемент. Ссылка;
КонецЕсли ;
Возврат Элемент;
КонецФункции
Автор:
borismor Категория:
Работа с Microsoft Office и OpenOffice Активация открытой книги Excel для корректировки Нужно было получить для изменения уже открытую книгу Excel, а если она закрыта, то открыть и изменять.
Ниже код, который данную задачу решает.
Код 1C v 8.х
Попытка
Эксель = Неопределено ;
Книга = Неопределено ;
Лист = Неопределено ;
Состояние( "Выполняется подключение к Excel" ) ;
Попытка
Книга = ПолучитьCOMОбъект( Файл, "Excel.Application" ) ;
Эксель = Книга. Application;
Исключение
Эксель = Новый COMОбъект( "Excel.Application" ) ;
Книга = Эксель. WorkBooks. Open( Файл) ;
КонецПопытки ;
Лист = Книга. WorkSheets( 1 ) ;
Эксель. Visible = Истина ;
Исключение
Сообщить( "Не удалось подключить Excel." + Символы. ПС + ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
Категория:
Работа с Microsoft Office и OpenOffice Как сохранить значение в реестр Windows? Код 1C v 8.х
RegProv= ПолучитьCOMОбъект(
"winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"
) ;
RegProv. CreateKey( "2147483649" , "Software\1C\1Cv8\Report" ) ;
RegProv. SetStringValue( "2147483649" , "Software\1C\1Cv8\Report" , "StartDate" ,
Строка( Формат( ТекущаяДата( ) , "ДФ=ггггММддЧЧммсс" ) ) ) ;
Категория:
COM-объекты, WMI, WSH Как прочитать значение, хранящееся в реестре Windows? Код 1C v 8.х Перем Значение;
RegProv= ПолучитьCOMОбъект(
"winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"
) ;
RegProv. GetStringValue( "2147483649" , "Software\1C\1Cv8\Report" , "StartDate" , Значение) ;
Категория:
COM-объекты, WMI, WSH Добавление в список выбора листов excel-файла с возможностью последующего к ним обращения
Код 1C v 8.х
Процедура ЗаполнитьЛисты()
ЭлементыФормы. Листы. СписокВыбора. Очистить( ) ;
Таблица = ПолучитьCOMОбъект( Файл) ;
Для Н = 1 По Таблица. Sheets. Count Цикл
ТекущийЛист = Строка( Таблица. Sheets( Н) . Index) + ". " + Таблица. Sheets( Н) . Name;
ЭлементыФормы. Листы. СписокВыбора. Добавить( ТекущийЛист) ;
КонецЦикла ;
ЭлементыФормы. Листы. Значение = ТекущийЛист;
КонецПроцедуры
Процедура КнопкаВыполнитьНажатие(Кнопка)
Если ЭлементыФормы. Листы. Значение = "" Тогда
Предупреждение( "Выберите лист" , 5 ) ;
Возврат ;
КонецЕсли ;
Таблица = ПолучитьCOMОбъект( Файл) ;
Индекс = Число( Сред( ЭлементыФормы. Листы. Значение, 1 , Найти( ЭлементыФормы. Листы. Значение, ". " ) - 1 ) ) ;
Лист = Таблица. Sheets( Индекс) ;
Строка = 1 ;
Столбец = 4 ;
КодНоменклатуры = Лист. Cells( Строка, Столбец) . Value) ;
Номенклатура = Лист. Cells( Строка, Столбец + 1 ) . Text) ;
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Импорт документа Excel через web-клиент Во время реализации задачи по регистрации продаж дистрибьюторов на основании Excel документов столкнулся с интересной задачей. Необходимо реализовать загрузку файла и на стороне сервера обработать его, заполнив табличную часть документа.
Решение состоит из двух функций: клиентской и серверной.
Клиентская часть инициирует выбор файла, передачу выбранного файла на сервер и передача управления серверной процедуре.
Код 1C v 8.2 УП #НаКлиенте
Процедура ИмпортИзВнешнегоФайла(Команда)
Если НЕ ПодключитьРасширениеРаботыСФайлами( ) Тогда
УстановитьРасширениеРаботыСФайлами( ) ;
КонецЕсли ;
Если ПодключитьРасширениеРаботыСФайлами( ) Тогда
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
Фильтр = "Текст(*.xls)|*.xls" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. Заголовок = "Выберите файл для импорта" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
Объект. МедицинскиеРаботники. Очистить( ) ;
ДанныеНачинаютсяС = 1 ;
Если Не ВвестиЧисло( ДанныеНачинаютсяС, "Данные начинаются со строки" , 2 , 0 ) Тогда
Возврат ;
КонецЕсли ;
МассивФайлов = ДиалогОткрытияФайла. ВыбранныеФайлы;
ПомещаемыеФайлы = Новый Массив;
Для Каждого Файл Из МассивФайлов Цикл
ТекФайл = Новый Файл( Файл) ;
Описание = Новый ОписаниеПередаваемогоФайла( Файл, "" ) ;
ПомещаемыеФайлы. Добавить( Описание) ;
КонецЦикла ;
ПомещенныеФайлы = Новый Массив;
Если ПоместитьФайлы( ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь , УникальныйИдентификатор) Тогда
ИмпортироватьФайлИзВременногоХранилищаВТЗ( ПомещенныеФайлы, ДанныеНачинаютсяС) ;
КонецЕсли ;
Иначе
Предупреждение( "Файл(ы) не выбран!" ) ;
КонецЕсли ;
Иначе
Предупреждение( НСтр( "ru ='Данная возможность недоступна, так как не подключено расширение работы с файлами.'" , "ru" ) ) ;
КонецЕсли ;
КонецПроцедуры
Серверная процедура перебирает полученные на сервер файлы. Получает COM-объекты и импортирует данные.
Код 1C v 8.2 УП #НаСервере
Процедура ИмпортироватьФайлИзВременногоХранилищаВТЗ(МассивФайлов, ДанныеНачинаютсяС)
ДокументОбъект = РеквизитФормыВЗначение( "Объект" ) ;
Для Каждого ЭлементМассива Из МассивФайлов Цикл
ФайлИзХранилища = ПолучитьИзВременногоХранилища( ЭлементМассива. Хранение) ;
ВременныйФайл = ПолучитьИмяВременногоФайла( "xls" ) ;
ФайлИзХранилища. Записать( ВременныйФайл) ;
Док = ПолучитьCOMОбъект( ВременныйФайл) ;
ФИОУчастника = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 2 ) . Value;
Пока СокрЛП( ФИОУчастника) = "" Цикл
НоваяСтрока = ДокументОбъект. МедицинскиеРаботники. Добавить( ) ;
НоваяСтрока. Фио = ФИОУчастника;
НоваяСтрока. Учреждение = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 7 ) . Value;
НоваяСтрока. Адрес = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 3 ) . Value;
НоваяСтрока. Телефон = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 4 ) . Value;
НоваяСтрока. ЭлПочта = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 5 ) . Value;
НоваяСтрока. Образование = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 6 ) . Value;
ДанныеНачинаютсяС = ДанныеНачинаютсяС + 1 ;
ФИОУчастника = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 2 ) . Value;
КонецЦикла ;
Сообщить( "Импорт завершён" ) ;
Док. Application. Quit( ) ;
КонецЦикла ;
ЗначениеВРеквизитФормы( ДокументОбъект, "Объект" ) ;
КонецПроцедуры
Источник Категория:
Работа с Microsoft Office и OpenOffice Выгрузка табличного документа в Google таблицу Надумал когда-то задачу себе: выгрузить содержимое табличного документа в
Google Document . Одним из вариантов использования данного функционала может быть выгрузка состояния заказов пользователей из базы в 1с в google spreadsheet. Если клиент знает адрес данного документа, то они могут ознакомиться с состоянием дел не звоня менеджеру. Может кто еще придумает варианты использования – пишите в комментарии, буду рад.
Последовательность выгрузки документа такова: сначала получаем список таблиц, которые есть у пользователя в системе Google Document. Затем после определения таблицы выгрузки пользователю предлагаем выбрать лист, в который будет выгружаться содержимое. Во время выбора всех этих параметров так же предоставляется возможность создания новых элементов (таблиц, листов). Уже после определения листа выгрузки обходим все ячейки документа и их содержимое переносим в таблицу на соответствующее место. Вопрос сохранения форматирования табличного документа в данной задаче не рассматривался.
Для написания функционала использовалась информация про
google document API . Для того чтобы получить доступ к данным необходимо чтобы 1с сначала прошла аутентификацию. Про аутентификацию приложений можно почитать в соответствующем документе. Для того чтобы пройти аутентификацию мы должны сначала получить маркер, затем этот маркер прописывать каждый раз при обращении к серверу.
Функция получения маркера следующая:
Код 1C v 8.х Функция ПолучитьМаркер(ВидСервиса,Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя( ) ;
Если ПараметрыПользователя = Неопределено Тогда
Возврат Неопределено ;
КонецЕсли ;
АдресКлиентЛогин = "https://www.google.com/accounts/ClientLogin" ;
Если ВидСервиса = "Таблица" Тогда
Сервис = "wise" ;
ИначеЕсли ВидСервиса = "Документ" Тогда
Сервис = "writely" ;
КонецЕсли ;
Попытка
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "POST" , АдресКлиентЛогин, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/x-www-form-urlencoded" ) ;
ХМЛХТТП. Send( "Email=" + ПараметрыПользователя. Логин + "&Passwd=" + ПараметрыПользователя. Пароль + "&service=" + Сервис + "&source=Gulp-CalGulp-1.05" ) ;
Исключение
Сообщить( "Ошибка:" + ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
Если ХМЛХТТП. Status = 200 Тогда
Маркер = ХМЛХТТП. ResponseText;
Маркер = Прав( Маркер, СтрДлина( Маркер) - СтрДлина( "Auth=" ) - Найти( Маркер, "Auth=" ) + 1 ) ;
Возврат Маркер;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Функция получения маркера в качестве входного параметра получает вид службы, для которой будет проходить аутентификация. Это очень важный момент. Например, полученный маркер для Календаря не даст возможности работать с документами.
Для получения списка таблиц отправляется GET запрос по адресу «https://spreadsheets.google.com/feeds/spreadsheets/private/full». В запросе параметр «Authorization» определяется значением полученного маркера аутентификации. В результате выполнения запроса в ResponseText мы получаем xml, который для удобство дальнейшего разбора перегоняется в ДеревоЗначений.Функция получения списка таблиц имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ПолучитьСписокТаблиц(Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя( ) ;
Если ПараметрыПользователя = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
Маркер = ПолучитьМаркер( "Таблица" ) ;
Если Маркер = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
Адрес = "https://spreadsheets.google.com/feeds/spreadsheets/private/full" ;
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "GET" , Адрес, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/atom+xml" ) ;
ХМЛХТТП. SetRequestHeader( "Authorization" , "GoogleLogin auth=" + Маркер) ;
ХМЛХТТП. Send( Null ) ;
Если ХМЛХТТП. Status = 200 Тогда
ОтветСервера = ХМЛХТТП. ResponseText;
ДеревоXML = ПрочитатьResponseTextXML( ОтветСервера) ;
СписокТаблиц = Новый СписокЗначений;
ТаблицаСсылка = "" ;
НазваниеТаблицы = "" ;
Для Каждого Строка Из ДеревоXML. Строки[0 ]. Строки Цикл
Если Строка. ИмяXMLЭлементаДанных = "entry" Тогда
Для Каждого ТекАтрибут Из Строка. Строки Цикл
Если ТекАтрибут. ИмяXMLЭлементаДанных = "link" Тогда
ТекРел = ТекАтрибут. СписокАтрибутов. НайтиПоЗначению( "rel" ) ;
Если ТекРел. представление = "http://schemas.google.com/spreadsheets/2006#worksheetsfeed" Тогда
ТекСсылка = ТекАтрибут. СписокАтрибутов. НайтиПоЗначению( "href" ) ;
ТаблицаСсылка = ТекСсылка. Представление;
ТаблицаСсылка = СтрЗаменить( ТаблицаСсылка, "https://" , "http://" ) ;
КонецЕсли ;
КонецЕсли ;
Если ТекАтрибут. ИмяXMLЭлементаДанных = "title" Тогда
НазваниеТаблицы = ТекАтрибут. ЗначениеXMLЭлементаДанных;
КонецЕсли ;
КонецЦикла ;
Если ЗначениеЗаполнено( ТаблицаСсылка) И ЗначениеЗаполнено( НазваниеТаблицы) Тогда
СписокТаблиц. Добавить( ТаблицаСсылка, НазваниеТаблицы) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Возврат СписокТаблиц;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Теперь остановимся на самой выгрузке значения в ячейку google таблицы. Для определения значения в ячейке выполняется POST запрос по адресу листа таблицы, который пользователь определил до этого. Успешность выполнения обновления контролируется по значению Status, в случае удачного обновления он должен быть равен 201. Функция обновления значения ячейки на листе Google таблицы имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ОбновитьЯчейкуЛистаГугл(Маркер,ИДЛиста,Строка,Колонка,Значение)
ТекстСоздания = "
| " + ИДЛиста + "/R" + Строка( Строка) + "C" + Строка( Колонка) + "
| + ИДЛиста + " / R"+ Строка(Строка) + " C" + Строка(Колонка)+"" " / >
| + Строка(Строка) + "" " col="" " + Строка(Колонка)+ "" " inputValue="" " + Значение+"" "/>
| ";
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "POST" , ИДЛиста, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/atom+xml;type=feed" ) ;
ХМЛХТТП. SetRequestHeader( "X-If-No-Redirect" , "true" ) ;
ХМЛХТТП. SetRequestHeader( "Authorization" , "GoogleLogin auth=" + Маркер) ;
ХМЛХТТП. Send( ТекстСоздания) ;
Если ХМЛХТТП. Status = 201 Тогда
Возврат Истина ;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Ложь ;
КонецЕсли ;
КонецФункции
Источник Категория:
Табличный документ Простые примеры реализации демо-версий обработок на платформе «1С:Предприятие 8». Каждый из тех кто продает свой интеллектуальный труд, не раз сталкивался с необходимостью создания демо-версии разработки, дабы продемонстрировать клиенту функциональность, но при этом сохранить для клиента потребность в приобретении полнофункциональной версии. В этой статье я хотел бы рассмотреть несколько не сложных примеров создания демо-версий обработок/отчетов для платформы «1С:Предприятие 8».
Перед тем как приступить, собственно, к сути вопроса, хотелось бы сделать небольшое отступление для «крутых хакеров». Как известно, штатные возможности 1С, не представляют достаточно надежных средств для защиты исходного кода, поэтому приведенные здесь примеры – это исключительно защита от ПОЛЬЗОВАТЕЛЯ и ничего более.
Да и в целом, по моему глубокому убеждению, открытость кода в 1С – это одно из важнейших (если не самое важное) её достоинств. Поэтому я сторонник «установки пароля на модуль, поставки без исходного текста», только в случае демо-версии разработки. А при приобретении обработки, клиент приобретает её ЦЕЛИКОМ, в том числе и исходный код.
Для начала, немного общих моментов. Для того что бы ограничить использование нашего «уникального» функционала, будь-то алгоритм проведения документа или процедура формирования отчета, необходимо вынести код в модуль объекта и скрыть его от пользователя. Это можно достичь двумя путями. Во-первых установка пароля на модуль объекта. Что бы установить пароль, откройте модуль объекта, далее в меню «Текст» выберите пункт «Установить пароль». Во-вторых поставка без исходного кода. Что бы получить обработку/отчет без исходного кода, необходимо сначала создать поставку включающую в себя наш отчет без исходного кода, а затем сохранить его как внешний. Настройка поставки производится в диалоге «Конфигурация > Поставка конфигурации > Настройка поставки».
Итак, пример № 1. Ограничение по времени использования. Заключается в том, что функционал работает в течении определенного, ограниченного времени, например 10 дней. Для этого, нам надо как-то «запомнить» дату первого запуска, сделаем это с помощью реестра Windows.
Код 1C v 8.х Функция СрокДемоЗакончился()
Перем Значение;
RegProv= ПолучитьCOMОбъект( "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv" ) ;
RegProv. GetStringValue( "2147483649" , "Software\1C\1Cv8\Report" , "StartDate" , Значение) ;
Если Значение= NULL Тогда
RegProv. CreateKey( "2147483649" , "Software\1C\1Cv8\Report" ) ;
RegProv. SetStringValue( "2147483649" , "Software\1C\1Cv8\Report" , "StartDate" , Строка( Формат( ТекущаяДата( ) , "ДФ=ггггММддЧЧммсс" ) ) ) ;
Возврат Ложь ;
Иначе
ДатаСтарта= Дата( Значение) ;
КонецПериода= ДатаСтарта+ 60 * 60 * 24 * 10 ;
ТекДата= ТекущаяДата( ) ;
Возврат НЕ ( ТекДата> ДатаСтарта И ТекДата< = КонецПериода) ;
КонецЕсли ;
КонецФункции
Таким образом, осталось только вставить проверку на продолжение работы в нашу основную процедуру, например:
Код 1C v 8.х Процедура СформироватьОтчет() Экспорт
Если СрокДемоЗакончился( ) Тогда
Возврат ;
КонецЕсли ;
…
КонецПроцедуры
Для особо хитрых пользователей, можно сделать запрос точного времени из Интернета, что бы защититься от изменения системного времени. Например, так:
Код 1C v 8.х Функция ТочноеВремяПоГринвичу()
XMLHTTP= Новый COMОбъект( "MSXML2.XMLHTTP" ) ;
XMLHTTP. Open( "get" , "http://ntp.greenwichmeantime.com/time/scripts/clock-7/x.php" , Ложь ) ;
XMLHTTP. Send( ) ;
UTC= Цел( XMLHTTP. Responsetext/ 1000 ) ;
Возврат '19700101000000 '+ UTC + 60 * 60 * 4 ;
КонецФункции
Пример №2. Ограничение по количеству выполнений. То есть к примеру, отчет в демо-версии можно сформировать не более 5-ти раз. Делается аналогично предыдущему варианту, разница заключается лишь в том, что в реестр на этот раз будем записывать номер текущего запуска.
Код 1C v 8.х Функция СрокДемоЗакончился()
Перем Значение;
RegProv= ПолучитьCOMОбъект( "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv" ) ;
RegProv. GetDWORDValue( "2147483649" , "Software\1C\1Cv8\Report" , "Count" , Значение) ;
ЭтотЗапуск= 1 ;
Если Значение= NULL Тогда
RegProv. CreateKey( "2147483649" , "Software\1C\1Cv8\Report" ) ;
Иначе
ЭтотЗапуск= Значение+ 1 ;
КонецЕсли ;
Если ЭтотЗапуск< = 5 Тогда
RegProv. SetDWORDValue( "2147483649" , "Software\1C\1Cv8\Report" , "Count" , ЭтотЗапуск) ;
Возврат Ложь ;
Иначе
Возврат Истина ;
КонецЕсли ;
КонецФункции
Пример №3. Реализация защиты «пароль-ответ». Недостаток предыдущих способов, заключается в том, что полнофункциональная версия является отдельной разработкой, которую клиенту необходимо переслать, привести, установить и т.д. При использовании же, следующего способа, всё что потребуется для получения полной версии разработки – это зарегистрировать обработку, т.е. ввести правильный код.
Суть этого способа состоит в том, что при запуске у клиента формируется некий уникальный ключ, для которого, по только нам известному алгоритму, можно сформировать «ответный пароль». И в случае совпадения пары ключ-ответ обработка считается успешно зарегистрированной.
В качестве такого уникального ключа можно, к примеру, использовать серийный номер жесткого диска, MAC-адрес, имя пользователя и т.д. Рассмотрим пример с серийным номером жесткого диска.
Код 1C v 8.х Функция ПолучитьСерийныйНомерЖесткогоДиска(Диск)
ФСО= Новый COMОбъект( "Scripting.FileSystemObject" ) ;
ФСО_Диск= ФСО. GetDrive( Диск) ;
Возврат ФСО_Диск. SerialNumber;
КонецФункции
Алгоритм получения «ответного значения» по ключу, ограничен лишь Вашей фантазией. Здесь же, в качестве примера, я буду использовать простую перестановку символов в обратном порядке.
Код 1C v 8.х Функция ПолучитьОтветПоКлючу(Ключ)
н= СтрДлина( Ключ) ;
Результат= "" ;
Пока н< > 0 Цикл
Результат= Результат+ Сред( Ключ, н, 1 ) ;
н= н- 1 ;
КонецЦикла ;
Возврат Результат;
КонецФункции
Таким образом, наша процедура проверки и подтверждения регистрации будет выглядеть так:
Код 1C v 8.х Функция ЭтоЗарегистрированнаяКопия()
Перем Значение, Ответ;
RegProv= ПолучитьCOMОбъект( "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv" ) ;
RegProv. GetDWORDValue( "2147483649" , "Software\1C\1Cv8\Report" , "Registered" , Значение) ;
Если Значение= NULL Тогда
Регистрация= Ложь ;
Ключ= ПолучитьСерийныйНомерЖесткогоДиска( "C" ) ;
Если ВвестиСтроку( Ответ, "Ключ: " + Ключ) Тогда
Если Ответ= ПолучитьОтветПоКлючу( Ключ) Тогда
RegProv. SetDWORDValue( "2147483649" , "Software\1C\1Cv8\Report" , "Registered" , 1 ) ;
Регистрация= Истина ;
Иначе
Предупреждение( "Регистрационный код введен не верно!" ) ;
КонецЕсли ;
КонецЕсли ;
Возврат Регистрация;
Иначе
Возврат Истина ;
КонецЕсли ;
КонецФункции
Осталось только вставить проверку регистрации в нашу основную процедуру:
Код 1C v 8.х Процедура СформироватьОтчет() Экспорт
Если НЕ ЭтоЗарегистрированнаяКопия( ) Тогда
. . .
КонецЕсли ;
. . .
КонецПроцедуры
На данный момент, существуют различные декомпиляторы, плагины к Total Commander и др. разработки, позволяющие получить исходный программный код, даже если он закрыт паролем или поставляется в скомпилированном варианте. Дабы чуть-чуть усложнить жизнь пользователям умеющим пользоваться Google, можно ключевые моменты алгоритма, такие как работа с реестром или проверка регистрационного кода, дополнительно вынести во внешний шифрованный скрипт.
Начиная с Windows Script 5.0, появилась возможность чтения зашифрованных сценариев машинами сценариев. Поэтому любой сценарий написанный на VBScript или JavaScript, может быть выполнен в зашифрованном виде. Что бы преобразовать код на VBScript в зашифрованный вид, воспользуемся бесплатной утилитой «Windows Script Encoder», которую можно скачать с сайта Microsoft. В результате, например скрипт создания в реестре Windows раздела «HKEY_CURRENT_USER\Software\1C\1Cv8\Report», будет выглядеть следующим образом:
#@~^ZAAAAA==jY~UtVV{ZMnlD+64N+^OvJU^DbwYcj4+^Vr#@#@&j4VsR"noqDrOPJuF;jw?KWDhCM+ 'FZ'F;-%'InwKDOwr~\(HE^V@#@&hyAAAA==^#~@
Приведу пример функции, осуществляющей проверку введенного пользователем регистрационного кода, с использованием шифрованного скрипта:
Код 1C v 8.х Функция ПроверитьРегистрационныйКод(Код)
Скрипт= Новый COMОбъект( "MSScriptControl.ScriptControl" ) ;
Скрипт. Language= "VBScript.Encode" ;
Скрипт. AddCode( "#@~^ewAAAA==o!x^DkKxP;t" + Символ( 127 ) + "^3v|nX*@#@&7zx/SnD{4wCs/" + Символ( 127 ) + "@#@&d(0~F" + Символ( 127 ) + "XxJ9^+Rl{qOv0q*rPPt" + Символ( 127 ) + "U,bUkh" + Символ( 127 ) + "D'74:.E" + Символ( 127 ) + "P3x9P(W@#@&d;4+13'zUdh" + Символ( 127 ) + "D@#@&3x[~wEUmDrW hyQAAA==^#~@ " ) ;
Возврат Скрипт. CodeObject. Check( Код) ;
КонецФункции
Эта функция вернет «Истина», если в качестве регистрационного кода передать ей строку «dce8a7196f14». Аналогичным образом можно скрыть и всю работу с реестром. Но, тем не менее, не следует забывать о существующих специализированных программных продуктах, позволяющих отслеживать чтение и запись реестра.
В заключении, хочется сказать, что как известно, надежная защита для программного продукта – это такая защита, стоимость взлома которой, превышает стоимость законного приобретения. Поэтому для крупных проектов следует использовать более надежные средства от незаконного копирования и использования, такие как вынос ключевых функций во внешние dll, аппаратные ключи защиты и пр. Здесь же я попытался привести несколько простых примеров в качестве основ так сказать…
Источник Категория:
Полезные, Универсальные Функции QR код в 1С Столкнулся с интересной задачей реализации генерации QR-кода в 1С 8.2 (
QR-код — матричный код (двухмерный штрихкод) ) Для генерации было использовано api от google (http://chart.apis.google.com/chart).
Вот сайт , который работает с ним. После того, как вы вводите все параметры кода и нажимаете кнопку генерировать, получаем что-то вроде такой
ссылки . По сути эта ссылка нам и нужна. Создав необходимый url можно скачать картинку, которая генерируется с помощью api.
И так в чем заключается подход:
1. Генерируем текст, который надо прописать в qr-коде.
2. Используя ссылку «http://chart.apis.google.com/chart?cht=qr&chs=230?230&chl=» +»Наш текст» скачиваем картинку.
3. Размещаем картинку в нашем табличном документе.
Код реализации:
Код 1C v 8.2 УП &НаСервере
Функция hex(Знач Значение)
Значение= Число( Значение) ;
Если Значение< = 0 Тогда
Результат= "0" ;
Иначе
Значение= Цел( Значение) ;
Результат= "" ;
Пока Значение> 0 Цикл
Результат= Сред( "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" , Значение%16 + 1 , 1 ) + Результат;
Значение= Цел( Значение/ 16 ) ;
КонецЦикла ;
КонецЕсли ;
Если СтрДлина( Результат) < 2 Тогда
Результат = "0" + Результат;
КонецЕсли ;
Возврат "%" + Результат;
КонецФункции
&НаСервере
Функция EncodeURL(URL)
Рез = "" ;
Для Сч = 1 По СтрДлина( URL) Цикл
ch = Сред( URL, Сч, 1 ) ;
vch = КодСимвола( ch) ;
Если ( "A" < = ch ) И ( ch < = "Z" ) Тогда
Рез = Рез + ch;
ИначеЕсли ( "a" < = ch ) И ( ch < = "z" ) Тогда
Рез = Рез + ch;
ИначеЕсли ( "0" < = ch ) И ( ch < = "9" ) Тогда
Рез = Рез + ch;
ИначеЕсли ( ch = " " ) ИЛИ ( ch = "+" ) Тогда
Рез = Рез + "+" ;
ИначеЕсли ( ch = "-" ) ИЛИ ( ch = "_" )
ИЛИ ( ch = "." ) ИЛИ ( ch = "!" )
ИЛИ ( ch = "~" ) ИЛИ ( ch = "*" )
ИЛИ ( ch = "" ) ИЛИ ( ch = "(" )
ИЛИ ( ch = ")" ) Тогда
Рез = Рез + ch;
ИначеЕсли ( vch < = 127 ) Тогда
Рез = Рез + hex( vch) ;
ИначеЕсли ( vch < = 2047 ) Тогда
Рез = Рез + hex( 192 + Цел( vch / 64 ) ) ;
Рез = Рез + hex( 128 + ( vch % 64 ) ) ;
Иначе
Рез = Рез + hex( 224 + Цел( vch / 4096 ) ) ;
Рез = Рез + hex( 128 + ( Цел( vch / 64 ) % 64 ) ) ;
Рез = Рез + hex( 128 + ( vch % 64 ) ) ;
КонецЕсли ;
КонецЦикла ;
Возврат Рез;
КонецФункции
&НаСервере
Функция СохранитьДвоичныйБуферВФайл(Буфер, ИмяФайла) Экспорт
Поток = Новый COMОбъект( "ADODB.Stream" ) ;
Поток. Type = 1 ;
Поток. Mode = 3 ;
Поток. Open( ) ;
Поток. Write( Буфер) ;
Поток. SaveToFile( ИмяФайла) ;
Поток. Close( ) ;
КонецФункции
&НаСервере
Функция НапечататьКодСервер(ЗаказСсылка)
ТабДок = Новый ТабличныйДокумент;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла( "png" ) ;
АдресНачало = "http://chart.apis.google.com/chart?cht=qr&chs=230x230&chl=" ;
АдресКонец = ЗаказСсылка. Номер + Символы. ПС + Заказссылка. Контрагент. Наименование;
АдресКонец = СтрЗаменить( АдресКонец, " " , "+" ) ;
АдресКонец = EncodeURL( АдресКонец) ;
Соединение = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
Соединение. open( "GET" , АдресНачало + АдресКонец, 0 , , ) ;
Соединение. send( null ) ;
СохранитьДвоичныйБуферВФайл( Соединение. responseBody, ИмяВременногоФайла) ;
Макет = Документы. ЗаказПокупателя. ПолучитьМакет( "МакетПечатиКода" ) ;
Область = Макет. ПолучитьОбласть( "Код" ) ;
Область. Рисунки. КодРисунок. Картинка = Новый Картинка( ИмяВременногоФайла) ;
ТабДок. Вывести( Область) ;
Возврат ТабДок;
КонецФункции
Источник Категория:
COM-объекты, WMI, WSH Работа с MS Word через OLE В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Код 1C v 8.х
Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект( ПутьКФайлу) ;
Объект. Application. Visible = 1 ;
Word = Объект. Application;
Doc = Объект. Application. Documents( 1 ) ;
Doc. Activate( ) ;
Text = Word. S_election;
Text. WholeStory( ) ;
Text. Delete( 1 , 1 ) ;
Text. TypeText( Символы. ВК) ;
Text. TypeText( Символы. ВК) ;
Text. TypeParagraph( ) ;
Text. TypeText( "Обычный текст, набранный первую очередь" ) ;
Text. HomeKey( , 1 ) ;
Text. Font. Bold = 9999998 ;
Text. Font. Size = 14 ;
Text. Font. Name = "Verdana" ;
Text. MoveUp( , 2 ) ;
Text. HomeKey( , 1 ) ;
Text. TypeText( "Обычный текст, набранный во вторую очередь" ) ;
Text. MoveDown( , 1 ) ;
Text. EndKey( ) ;
Text. TypeParagraph( ) ;
Text. ClearFormatting( ) ;
Position = Text. Range( ) ;
Table = Doc. Tables. Add( Position, 1 , 6 , 1 , 2 ) ;
Table. Columns( 1 ) . PreferredWidth= 10 ;
Table. Columns( 2 ) . PreferredWidth= 50 ;
Table. Columns( 3 ) . PreferredWidth= 10 ;
Table. Columns( 4 ) . PreferredWidth= 10 ;
Table. Columns( 5 ) . PreferredWidth= 10 ;
Table. Columns( 6 ) . PreferredWidth= 10 ;
Row1= Table. Rows( 1 ) ;
Row1. Cells( 1 ) . Range. Text= "№ п/п" ;
Row1. Cells( 2 ) . Range. Text= "Наименование" ;
Row1. Cells( 4 ) . Range. Text= "Кол-во" ;
Row1. Cells( 3 ) . Range. Text= "Ед. изм." ;
Row1. Cells( 5 ) . Range. Text= "Цена,руб." ;
Row1. Cells( 6 ) . Range. Text= "Сумма,руб." ;
НомерСтроки = 1 ;
Для каждого СтрокаТовары Из Ссылка. Товары Цикл
Row= Table. Rows. Add( ) ;
Row. Cells( 1 ) . Range. Text= НомерСтроки;
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 2 ) . Range. Text= СтрокаТовары. Номенклатура. Наименование
+ ? ( ЗначениеЗаполнено( СтрокаТовары. ХарактеристикаНоменклатуры) ,
" (" + СтрокаТовары. ХарактеристикаНоменклатуры+ ")" , "" ) ;
Row. Cells( 4 ) . Range. Text= Строка( СтрокаТовары. Количество) ;
Row. Cells( 4 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 3 ) . Range. Text= ? ( ЗначениеЗаполнено( СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения)
, СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения. Наименование, "-" ) ;
Row. Cells( 3 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 5 ) . Range. Text= Формат( СтрокаТовары. Цена, "ЧДЦ=2" ) ;
Row. Cells( 5 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 6 ) . Range. Text= Формат( СтрокаТовары. Сумма, "ЧДЦ=2" ) ;
Row. Cells( 6 ) . Range. ParagraphFormat. Alignment = 1 ;
НомерСтроки= НомерСтроки+ 1 ;
КонецЦикла ;
Row1. Range. Font. Bold = 9999998 ;
Row1. Range. Font. Size = 14 ;
Row1. Range. Font. Name = "Verdana" ;
Row1. Range. ParagraphFormat. Alignment = 1 ;
Row = Table. Rows. Add( ) ;
Row. Range. Font. Bold = 9999998 ;
Row. Cells( 1 ) . Range. Text= "Итого:" ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
Попытка
Table. cell( НомерСтроки+ 1 , 1 ) . Merge( Table. cell( НомерСтроки+ 1 , 5 ) ) ;
Исключение
КонецПопытки ;
Попытка
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 3 ;
Row. Cells( 2 ) . Range. Text= Формат( Ссылка. Товары. Итог( "Сумма" ) , "ЧДЦ=2" ) ;
Row. Cells( 2 ) . Range. ParagraphFormat. Alignment = 1 ;
Doc. Save( ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
КонецПроцедуры
Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект( "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;
S_election. WholeStory( ) ;
S_election. Delete( 1 , 1 ) ;
S_election. ParagraphFormat. LineSpacingRule = 0 ;
S_election. ParagraphFormat. SpaceAfter = 0 ;
ThisDocument. Bookmarks. Add( "Закладка1" , S_election. Range( ) ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "34r3 " ) ;
S_election. HomeKey( , 1 ) ;
ThisDocument. Bookmarks. Add( "Закладка2" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
S_election. TypeParagraph( ) ;
ThisDocument. Bookmarks. Add( "Закладка3" , S_election. Range( ) ) ;
S_election. TypeParagraph( ) ;
ThisDocument. Bookmarks. Add( "Закладка4" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
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 ;
S_election. MoveDown( , 1 ) ;
S_election. Delete( 1 , 1 ) ;
ThisDocument. Bookmarks( "Закладка2" ) . Range. S_elect( ) ;
S_election = Word. S_election;
Text = S_election. Range. Text;
S_election. TypeText( Text + " sdcsdcs" ) ;
S_election. HomeKey( , 1 ) ;
ThisDocument. Bookmarks. Add( "Закладка2" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
ThisDocument. Bookmarks( "Закладка4" ) . Range. S_elect( ) ;
S_election = Word. S_election;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. MoveUp( , 4 , 1 ) ;
ListTemplate = Word. ListGalleries( 2 ) . ListTemplates( 1 ) . ListLevels( 1 ) ;
ListTemplate. NumberFormat = "%1." ;
ListTemplate. NumberStyle = 0 ;
S_election. Range. ListFormat. ApplyListTemplateWithLevel( Word. ListGalleries( 2 ) . ListTemplates( 1 ) ) ;
S_election. EndKey( 6 ) ;
Picture = S_election. InlineShapes. AddPicture( "C:\Users\NKrylov\Desktop\Новый.bmp" , Ложь , Истина ) ;
Picture. Height = 100 ;
Picture. Width = 150 ;
Shape = Picture. ConvertToShape( ) ;
Shape. WrapFormat. Type = 0 ;
ThisDocument. Save( ) ;
Объект = Неопределено ;
Исключение
ThisDocument. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект = Неопределено ;
КонецПопытки ;
КонецПроцедуры
Автор:
Крылов Николай Категория:
Работа с Microsoft Office и OpenOffice Быстрая функция чтения данных с листа Excel При чтении файла Excel я использую вариантный массив. Он позволяет быстро получить ВСЮ таблицу листа в память, а также получать данные массива целыми колонками. Тем самым время на чтение области файла Excel в таблицу значений сокращается в десятки раз.
Вот текст функции:
Код 1C v 8.х Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт
Если ЛистЭксель = Неопределено Тогда
ЛистЭксель = ПолучитьCOMОбъект( , "Excel.Application" ) ;
КонецЕсли ;
Если ВсегоСтрок = 0 Тогда
ВсегоСтрок = ЛистЭксель. Cells. SpecialCells( 11 ) . Row;
КонецЕсли ;
Если ВсегоКолонок = 0 Тогда
ВсегоКолонок = ЛистЭксель. Cells. SpecialCells( 11 ) . Column;
КонецЕсли ;
Если ТЗ = Неопределено Тогда
ТЗ = Новый ТаблицаЗначений;
Для Счетчик = 1 По ВсегоКолонок Цикл
ТЗ. Колонки. Добавить( "Колонка" + Счетчик, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЦикла ;
КонецЕсли ;
Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
НоваяСтрока = ТЗ. Добавить( ) ;
КонецЦикла ;
Область = ЛистЭксель. Range( ЛистЭксель. Cells( НомерПервойСтроки, НомерПервойКолонки) , ЛистЭксель. Cells( ВсегоСтрок, ВсегоКолонок) ) ;
Данные = Область. Value. Выгрузить( ) ;
Для Счетчик = 0 По ВсегоКолонок- 1 Цикл
ТЗ. ЗагрузитьКолонку( Данные[Счетчик], Счетчик) ;
КонецЦикла ;
ЛистЭксель = Неопределено ;
Возврат ТЗ;
КонецФункции
Комментировать функцию, думаю, нет необходимости. Вот собственно и все, что я хотел сказать.
wildhog Категория:
Работа с Microsoft Office и OpenOffice Полезные процедуры работы с Active Directory (AD) Надоели просить меня запостить рабочие модули работы с AD, вот запостил, в качестве бонуса убийца любого процесса в памяти любого компа.
p.s. для работы нужны определенные права.
Автор:
vde69
Код 1C v 8.х Функция ПолучитьСписокДоменов () Экспорт
Результат = Новый Массив( ) ;
objNameSpace = "" ;
Попытка objNameSpace = ПолучитьCOMОбъект( "WinNT:" ) ;
м = Новый Массив( ) ; м. Добавить( "domain" ) ;
м2 = Новый COMSafeArray( м, "VT_VARIANT" ) ;
objNameSpace. Filter = м2 ;
Для каждого item Из objNameSpace Цикл
Результат. Добавить( item. Name) ;
КонецЦикла ;
Исключение
Результат. Очистить( ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокГруппВДомене (ИмяДомена, ТипГрупп = "GlobalGroup" ) Экспорт
Результат = Новый Массив( ) ;
objNameSpace = "" ;
Попытка objNameSpace = ПолучитьCOMОбъект( "WinNT://" + СокрЛП( ИмяДомена) ) ;
м = Новый Массив( ) ;
м. Добавить( ТипГрупп) ;
м2 = Новый COMSafeArray( м, "VT_VARIANT" ) ;
objNameSpace. Filter = м2 ;
Для каждого item Из objNameSpace Цикл
Результат. Добавить( item. Name) ;
КонецЦикла ;
Исключение
Результат. Очистить( ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокПользователейВГруппеДомена (ИмяДомена, ИмяГруппы) Экспорт
Результат = Новый Массив( ) ;
objNameSpace = "" ;
Попытка
objNameSpace = ПолучитьCOMОбъект( "WinNT://" + СокрЛП( ИмяДомена) + "/" + СокрЛП( ИмяГруппы) + ", Group" ) ;
Для каждого item Из objNameSpace. Members( ) Цикл
Результат. Добавить( item. Name) ;
КонецЦикла ;
Исключение
Результат. Очистить( ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПользовательВГруппеДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь ;
Массив = ПолучитьСписокПользователейВГруппеДомена ( СокрЛП( ИмяДомена) , ИмяГруппы) ;
Для каждого элМассив из Массив Цикл
Если ВРег( элМассив) = ВРег( СокрЛП( ИмяПользователя) ) Тогда
Результат = Истина ;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Возврат Результат;
КонецФункции
Функция ДобавитьПользователяВГруппуДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь ;
element_user = "" ;
element_group = "" ;
Попытка
element_user = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user" ) ;
element_group = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group" ) ;
element_group. Add( element_user. ADsPath) ; element_group. SetInfo( ) ;
Результат = Истина ;
Исключение
Результат = Ложь ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция УдалитьПользователяИзГруппыДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь ;
element_user = "" ;
element_group = "" ;
Попытка element_user = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user" ) ;
element_group = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group" ) ;
element_group. Remove( element_user. ADsPath) ;
element_group. SetInfo( ) ;
Результат = Истина ;
Исключение
Результат = Ложь ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Процедура ЗаполнитьПочтовыеАдресаИзAD()
Попытка
conn = ПолучитьCOMОбъект( "" , "ADODB.Connection" ) ;
conn. Provider = "ADSDSOObject" ;
conn. Open( "Active Directory Provider" ) ;
Исключение Предупреждение( "Ошибка подключения к Active Directory!" ) ;
Возврат ;
КонецПопытки ;
Для Каждого Стр из Таблица Цикл
Если НЕ ПустаяСтрока( Стр. Логин) Тогда
Попытка
query = "SEL ECT ADsPath FR OM 'LDAP://DC=" + СокрЛП( Домен. Код) + "' WHERE SAMAccountName='" + Стр. Логин+ "'" ;
rs = conn. Execute( query) ;
Пока НЕ rs. EOF( ) Цикл
obj = ПолучитьCOMОбъект( rs. Fields( 0 ) . Value) ;
Если obj. Class= "user" Тогда
Стр. НоваяПочта= СокрЛП( obj. EmailAddress) ;
Если Стр. НоваяПочта< > Стр. СтараяПочта Тогда
Стр. Установить= Истина ;
КонецЕсли ;
КонецЕсли ;
rs. MoveNext( ) ;
КонецЦикла ;
Исключение
Сообщить( "Ошибка получения почты для логина :" + Стр. Логин) ;
КонецПопытки ;
КонецЕсли ;
КонецЦикла ;
conn. Close( ) ;
КонецПроцедуры
Функция УдалитьПроцесс (ИмяКомпьютера, НазваниеПроцесса, Логин, Пароль) Экспорт
Попытка COM = Новый COMОбъект ( "WbemScripting.SWbemLocator" ) ;
Серв = COM. ConnectServer( СокрЛп( ИмяКомпьютера) , "\root\cimv2" , СокрЛП( Логин) , СокрЛП( Пароль) ) ;
СписокПроцессов = Серв. execQuery( "Sel ect * fr om Win32_Process Where Name = '" + СокрЛП( НазваниеПроцесса) + "'" ) ;
Для каждого item Из СписокПроцессов Цикл
item. Terminate( ) ;
КонецЦикла ;
Исключение
Возврат Ложь ;
КонецПопытки ;
Возврат Истина ;
КонецФункции
Код 1C v 8.х
Функция ПолучитьMailПоПользователю(СсылкаПользователь)
Адрес= "" ;
ПользовательИБ= ПользователиИнформационнойБазы. НайтиПоИмени( СокрЛП( СсылкаПользователь. Код) ) ;
Если ПользовательИБ< > Неопределено Тогда
Если ПользовательИБ. АутентификацияОС Тогда
ПользовательОС= СтрЗаменить( ПользовательИБ. ПользовательОС, "\" , "/" ) ;
Попытка
ЮзерАД= ПолучитьCOMОбъект( "WinNT:" + ПользовательОС+ ",user" ) ;
LDAP= ПолучитьCOMОбъект( "LDAP://CN=" + ЮзерАД. FullName+ ",OU=Common Users,OU=Regular Users,DC=" + Домен+ ",DC=local" ) ;
Адрес= LDAP. Mail;
Исключение
КонецПопытки ;
КонецЕсли ;
КонецЕсли ;
Возврат Адрес;
КонецФункции
Категория:
COM-объекты, WMI, WSH Пример построения в Word нумерованного списка, закладок, вставки картинки, настройки ее параметров. Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word'а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудьте указать свои пути.
Тестировалось на Office 2007.
Некоторые переменные переименованы по стандарту Office: Text --> S_election. Doc --> ThisDocument.
Вот текст модуля:
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = Получить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;
S_election. WholeStory( ) ;
S_election. Delete( 1 , 1 ) ;
S_election. ParagraphFormat. LineSpacingRule = 0 ;
S_election. ParagraphFormat. SpaceAfter = 0 ;
ThisDocument. Bookmarks. Add( "Закладка1" , S_election. Range( ) ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "34r3 " ) ;
S_election. HomeKey( , 1 ) ;
ThisDocument. Bookmarks. Add( "Закладка2" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
S_election. TypeParagraph( ) ;
ThisDocument. Bookmarks. Add( "Закладка3" , S_election. Range( ) ) ;
S_election. TypeParagraph( ) ;
ThisDocument. Bookmarks. Add( "Закладка4" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
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 ;
S_election. MoveDown( , 1 ) ;
S_election. Delete( 1 , 1 ) ;
ThisDocument. Bookmarks( "Закладка2" ) . Range. S_elect( ) ;
S_election = Word. S_election;
Text = S_election. Range. Text;
S_election. TypeText( Text + " sdcsdcs" ) ;
S_election. HomeKey( , 1 ) ;
ThisDocument. Bookmarks. Add( "Закладка2" , S_election. Range( ) ) ;
S_election. EndKey( ) ;
ThisDocument. Bookmarks( "Закладка4" ) . Range. S_elect( ) ;
S_election = Word. S_election;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. TypeText( "sdcsdcsdcsdc" ) ;
S_election. TypeParagraph( ) ;
S_election. MoveUp( , 4 , 1 ) ;
ListTemplate = Word. ListGalleries( 2 ) . ListTemplates( 1 ) . ListLevels( 1 ) ;
ListTemplate. NumberFormat = "%1." ;
ListTemplate. NumberStyle = 0 ;
S_election. Range. ListFormat. ApplyListTemplateWithLevel( Word. ListGalleries( 2 ) . ListTemplates( 1 ) ) ;
S_election. EndKey( 6 ) ;
Picture = S_election. InlineShapes. AddPicture( "C:\Users\NKrylov\Desktop\Новый.bmp" , Ложь , Истина ) ;
Picture. Height = 100 ;
Picture. Width = 150 ;
Shape = Picture. ConvertToShape( ) ;
Shape. WrapFormat. Type = 0 ;
ThisDocument. Save( ) ;
Объект = Неопределено ;
Исключение
ThisDocument. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект = Неопределено ;
КонецПопытки ;
КонецПроцедуры
Написал Nikola23 - http://infostart.ru/public/68072/ Категория:
Работа с Microsoft Office и OpenOffice