Установка полей и масштаба документа при сохранении из 1С MS Excel
Код 1C v 8.х Попытка
Excel = Новый COM Объект("Excel.Application");
Исключение
Сообщить("ВНИМАНИЕ! TOpenOffice не установлен или недостаточно прав доступа!
| - " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
ТабДокумент = ПечатьЦенника(ВидЦенника);
ИмяФайла = ПутьДляСохранения+"\"+ТабДокумент.ИспользуемоеИмяФайла+".xls";
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
МакетОформления = Неопределено;
// Откроем табличный документ
Excel.Workbooks.Open(ИмяФайла);
КнигаExcel = Excel.Workbooks.Item(Excel.Workbooks.Count);
ЛистExcel = КнигаExcel.WorkSheets.Item(1);
КнигаExcel.Activate();
ЛистExcel.Activate();
//Установка полей
//Значение - points. Придется делать пересчет (100 points = 3.8 inches)
ЛистExcel.PageSetup.LeftMargin = 28;
ЛистExcel.PageSetup.RightMargin = 28;
ЛистExcel.PageSetup.TopMargin = 25;
ЛистExcel.PageSetup.BottomMargin = 25;
//Установка ориентации
Если ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт Тогда
ЛистExcel.PageSetup.Orientation = 2;
Иначе
ЛистExcel.PageSetup.Orientation = 1;
КонецЕсли;
//Установка масштаба печати
ЛистExcel.PageSetup.Zoom = ТабДокумент.МасштабПечати;
//Сохранение в Мои документы
КнигаExcel.Save();
//Покажем книгу на экран
Excel.Visible = 1;
//Отключаем COM - соединение
Excel.Quit();
OpenOffice Calc
Код 1C v 8.х Попытка
СервисМанагер = Новый COM Объект("Com .Sun.Star.ServiceManager");
Исключение
Сообщить("Не могу создать объект Open Office!
| - " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
ТабДокумент = ПечатьЦенника(ВидЦенника);
ИмяФайла = ПутьДляСохранения+"\"+ТабДокумент.ИспользуемоеИмяФайла+".xls";
ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
МакетОформления = Неопределено;
// Откроем табличный документ
Скрипт = новый COM Объект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.eval("Massiv=new Array()");
Массив = Скрипт.eval("Massiv");
Скрипт.AddObject("СервисМанагер",СервисМанагер);
Скрипт.eval("Massiv[0]=СервисМанагер.Bridge_GetStruct('com .sun.star.beans.PropertyValue')");
Скрипт.eval("Massiv[0].Name='Hidden'");
Скрипт.eval("Massiv[0].Value=true");
Стол = СервисМанагер.createInstance("com .sun.star.frame.Desktop");
ВремПуть = СтрЗаменить(ПутьДляСохранения, "\", "/");
ВремПуть = СтрЗаменить(ВремПуть, " ", "%20");
УРЛ = "file:///"+ВремПуть+"/"+ТабДокумент.ИспользуемоеИмяФайла+".xls";
Документ = Стол.LoadCom ponentFromURL(УРЛ,"_blank",0,Массив);
Документ.lockControllers();
Документ.addActionLock();
Листы=Документ.getSheets();
ЛистДанные=Листы.getByIndex(0);
СтилиСтраницы=Документ.StyleFamilies.getByName("PageStyles");
ПараметрыСтраницы=СтилиСтраницы.getByName(ЛистДанные.PageStyle);
//Установка полей
ПараметрыСтраницы.LeftMargin = ТабДокумент.ПолеСлева * 100;
ПараметрыСтраницы.RightMargin = ТабДокумент.ПолеСправа * 100;
ПараметрыСтраницы.TopMargin = ТабДокумент.ПолеСверху * 100;
ПараметрыСтраницы.BottomMargin = ТабДокумент.ПолеСнизу * 100;
//Установка ориентации
Если ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт Тогда
ПараметрыСтраницы.IsLandscape = Истина;
ПараметрыСтраницы.Width = 29700;
ПараметрыСтраницы.Height = 21000;
Иначе
ПараметрыСтраницы.IsLandscape = Ложь;
ПараметрыСтраницы.Width = 21000;
ПараметрыСтраницы.Height = 29700;
КонецЕсли;
//Установка масштаба печати
ПараметрыСтраницы.PageScale = ТабДокумент.МасштабПечати;
//Сохранение документа
Документ.unlockControllers();
Документ.removeActionLock();
Документ.store();
Документ.Close(Истина);
//Отключаем COM - соединение
Стол.terminate();
Категория:
Работа с Microsoft Office и OpenOffice Как получить текущее время с милисекундами? В Платформе 8.2.17 реализована возможность получения числа миллисекунд, прошедших с 1 января 0001 года, 0:00:00 UTC с помощью функции
Код 1C v 8.2 УП ТекущаяУниверсальнаяДатаВМиллисекундах()
Код 1C v 8.х // В 8.х переменные типа "дата" содержат миллисекунды, только это нигде не написано
ДатаИсх = ТекущаяДата(); //простая дата+время
ДатаНов = ДатаИсх + 0.567; //дата+время+миллисекунды
Миллисекунды = (ДатаНов - ДатаИсх) * 1000; //вытаскиваем миллисекунды из даты
Код 1C v 8.х Функция ПолучитьТекущееВремяВМиллисекундах() Экспорт
Если JavaScript = Неопределено Тогда
Попытка
JavaScript = Новый COM Объект("MSScriptControl.ScriptControl");
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат 0;
КонецПопытки;
JavaScript.Language = "javascript";
КонецЕсли;
Время = JavaScript.Eval("new Date().getTime()");
Возврат Время;
КонецФункции
Код 1C v 8.х // Как быстрее получить время в миллисекундах?
Locator = Новый COM Объект("WbemScripting.SWbemLocator");
ServicesSet = Locator.ConnectServer(".");
Для а=1 по 100 цикл
pEnum = ServicesSet.InstancesOf("Win32_OperatingSystem");
Для каждого Object Из pEnum Цикл
сообщить(сред(Object.LocalDateTime,13,6));
Прервать;
КонецЦикла;
КонецЦикла;
Код 1C v 7.x
Scr=СоздатьОбъект("MSScriptControl.ScriptControl");
Scr.Language = "javascript";
d=Scr.Eval("new Date();");
Сообщить(d.getTime(0));
Сообщить(d.getHours(0));
Сообщить(d.getMinutes(0));
Сообщить(d.getSeconds(0));
Сообщить(d.getMilliseconds(0));
Категория:
Работа с Датами (Временем) Ошибка формата потока 1С При работе с 1С:Предприятие 8.1 по некоторым независящим от нас с Вами причинам вы можете с толкнуться с сообщением об ошибке «
Ошибка формата потока ».
Например это может произойти так: После запуска chdbfl.exe выдал ошибки во внутреннем файле превышена длина кода, потом показал что ошибки исправлены. После этого запустить конфигурацию не удалось, стала выходить ошибка "ошибка формата потока......".
Способы возможного решения проблемы:
* удаление из списка баз и повторное добавление
* очищение данных из каталога "C:\Documents and Settings\пользователь\Application Data\1C\1Cv81"
* простое копирование содержимого каталога bin в новый каталог
Общей причиной возникновения такой ситуации можно считать сбои железа (в одном случае пропала сеть, отключилось электричество), софта и т.д. (и не обязательно 1С).
* Отключите файрволы и антивирусы
* Скопировать базу с исходного источника другой флешкой
В случаи, если есть возможность зайти в режиме конфигуратора, то также есть смысл проверить целостность данных:
* для файловой версии использовать проверку целостности chdbfl.exe
* тестирование и исправление средствами конфигуратора
* выгрузка/загрузка конфигурации
Для ранних версий платформы были характерны механизмы, не контролирующие некорректное хранение данных, поэтому обратите внимание на такие решения как:
* обновили платформу до последней версии (но не просто обновлением, а удалением старой версии, и затем установкой новой)
* очистка журнала регистрации
* в клиент-серверном варианте сообщение "Ошибка формата потока" может возникнуть у клиента, когда одно из приложений из набора 1С:Предприятия, выполняющихся на сервере, не имеет достаточно дискового пространства в разделе /tmp для размещения временных файлов
* проверить обработкой все метаданным все строковые реквизиты (проверяем наличие и удаляем сивмолы 0x1a & 0xFFFF )
Особенно это характерно для ситуаций: после изменения типа реквизита формы справочника при попытке сохранить конфигурацию после долгого продолжительного молчания не приходя в сознание платформа выдала сообщение "ошибка формата потока".
Или в такой ситуации: Если через
COM Connector происходит обращение к клиент-серверной базе данных, то возможной причиной ошибки является передача от клиента (
COM Connector-а в клиентском приложении) серверу 1С:Предприятия или наоборот значения типа "Строка", содержащего символы с кодами 0x1F или 0xFFFF. Передача может выполняться как через параметры и результат процедур и функций, исполняемых на сервере, так и в том случае, если такие символы содержатся, например, в строковом значении константы.
Источник: gilev.ru Категория:
Системные Ошибки Чтение RTF файлов через OpenOffice. Для 8.х заменить СоздатьОбъект( на Новый
COM Объект(
Код 1C v 7.x // Пример от Jaap Vduul
// Пример чтения таблицы из OpenOffice:
// =====================================
ServiceManager = СоздатьОбъект("com .sun.star.ServiceManager");
Desktop = ServiceManager.createInstance("com .sun.star.frame.Desktop");
script = СоздатьОбъект("ScriptControl");
script.Language = "vbs";
script.AddCode
(
"Dim Parameters()
|
|Sub InitParameters(Size)
|
| Erase Parameters
|
| If Size > 0 Then
| Redim Parameters(Size - 1)
| End If
|
|End Sub
|
|Sub SetParameter(ServiceManager, Name, Value, Index)
|
| Set PropertyValue = ServiceManager.Bridge_GetStruct(""com .sun.star.beans.PropertyValue"")
| PropertyValue.Name = Name
| PropertyValue.Value = Value
|
| Set Parameters(Index) = PropertyValue
|
|End Sub
|
|Sub SetBooleanParameter(ServiceManager, Name, Value, Index)
|
| SetParameter ServiceManager, Name, Cbool(Value), Index
|
|End Sub
|
|Function LoadDocument(Com ponentLoader, URL, TargetFrameName, SearchFlags)
|
| Set LoadDocument = Com ponentLoader.loadCom ponentFromURL(URL, TargetFrameName, SearchFlags, Parameters)
|
|End Function
|
|Sub CloseDocument(Document)
|
| Document.Close True
|
|End Sub"
);
script.Run("InitParameters", 2);
script.Run("SetBooleanParameter", ServiceManager, "ReadOnly", 1, 0);
script.Run("SetBooleanParameter", ServiceManager, "Hidden", 1, 1);
URL = ПреобразоватьВURL(КаталогПриказов + НомерПриказа + ".rtf");
Документ = script.Run("LoadDocument", Desktop, URL, "_blank", 0);
Таблица = Документ.TextTables.getByIndex(0); // ссылка на первую таблицу
ВсегоСтрок = Таблица.getRows().getCount();
ВсегоСтолбцов = Таблица.getColumns().getCount();
Для ИндексСтроки = 1 По (ВсегоСтрок - 1) Цикл // ИндексСтроки = 1, т.к. пропускаем заголовок
Для ИндексСтолбца = 0 По (ВсегоСтолбцов - 1) Цикл
Ячейка = Таблица.getCellByPosition(ИндексСтолбца, ИндексСтроки);
ТекстЯчейки = Ячейка.getString();
КонецЦикла;
КонецЦикла;
script.Run("CloseDocument", Документ);
Категория:
Работа с Microsoft Office и OpenOffice Как прочитать RTF файл и сохранить его в обычный TXT файл? Код 1C v 8.х // Создание объекта MS Word
Word = Новый COM Объект("Word.Application");
// Установка видимости приложения
Word.Visible = Ложь;
// Добавление нового документа в приложение
Word.Documents.Open("C:\111.rtf",0,0);
// Получение активного документа
Word.Documents.Item(1).Activate();
// Сохранение документа
Word.ActiveDocument.SaveAs("C:\111.txt", 2,,,,,,,,,,1251);
// Закрытие документа
Word.ActiveDocument.Close();
// Закрытие приложения
Word.Quit();
Категория:
Работа с Microsoft Office и OpenOffice Сохранение рабочей конфигурации в файл средствами встроенного языка Как сохранить рабочую конфигурацию из конфигуратора знают все, но это не всегда удобно. Мне понадобилось сохранять рабочую конфигурацию и тут-же этот файл обрабатывать. Предлагаю простую процедуру:
Код 1C v 8.х // функция сохраняет рабочую конфигурацию в файл, в случае успеха возвращает Истина
// параметры:
// Логин - имя пользователя с правами на админисирирование БД
// Пароль - строка пароля
// ИмяФайла - полное имя файла для сохранения конфигурации, не обязательно.
// по умолчанию использует каталог временных файлов и имя 1Cv8.cf
функция СохранитьТекущуюКонфигурацию (Логин, Пароль, ИмяФайла="") экспорт
результат = Ложь;
Если ИмяФайла = "" Тогда
ИмяФайла = КаталогВременныхФайлов() + "1Cv8.cf";
КонецЕсли;
СтрокаБазы = СтрокаСоединенияИнформационнойБазы();
Если Лев(СтрокаБазы, 5) = "File=" Тогда
// файловый вариант
СтрокаБазы = Сред(СтрокаБазы, 6, СтрДлина(СтрокаБазы) - 6);
Иначе
// серверный вариант пока не готов...
// может кто допишет?
возврат Ложь;
КонецЕсли;
ВыбФайл = Новый Файл(ИмяФайла);
Если ВыбФайл.Существует() Тогда
Сигнатура = Строка(ВыбФайл.Размер()) + Строка(ВыбФайл.ПолучитьВремяИзменения());
Иначе
Сигнатура = "";
КонецЕсли;
СтрокаЗапуска = """" + КаталогПрограммы() + "1cv8.exe"" CONFIG /F " + СтрокаБазы
+ ?(Логин = "", "", " /N " + Логин)
+ ?(Пароль = "", "", " /P " + Пароль) + " /DumpDBCfg """ + ИмяФайла + """";
//
// КомандаСистемы (СтрокаЗапуска); не работает!!!!! из-за кавычек в параметрах
// приходиться идти кругом...
// зато можно избежать черного окошка
//
WshShell = Новый COM Объект("WScript.Shell");
WshShell.Run(СтрокаЗапуска, 0, Истина);
ВыбФайл = Новый Файл(ИмяФайла);
Если ВыбФайл.Существует() Тогда
НоваяСигнатура = Строка(ВыбФайл.Размер()) + Строка(ВыбФайл.ПолучитьВремяИзменения());
Если Сигнатура <> НоваяСигнатура Тогда
Результат = Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
ну и пример использования (работает если нет пароля):
Код 1C v 8.х Функция ЗаписатьКонфигурациюВФайл(ИмяФайла="")
Результат = Ложь;
ВыбФайл = Новый Файл(ИмяФайла);
Если ВыбФайл.Существует() Тогда
Если ВыбФайл.ЭтоКаталог() Тогда
ИмяФайла="";
КонецЕсли;
КонецЕсли;
Попытка
Массив = ПользователиИнформационнойБазы.ПолучитьПользователей();
Логин = "";
Пароль = "";
Если Массив.Количество() > 0 тогда
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Логин = Пользователь.Имя;
Если Пользователь.ПарольУстановлен Тогда
// тут нужно получить пароль, лучше интерактивно
// но лично мне это совсем не нужно
Предупреждение("У Вас установлен пароль, этот режим сейчас не доступен");
Возврат Ложь;
КонецЕсли
КонецЕсли;
Результат = СохранитьТекущуюКонфигурацию(Логин, Пароль, ИмяФайла);
Если не Результат Тогда
Предупреждение("Конфигурация не сохранена");
Иначе
Сообщить("Конфигурация успешно сохранена в файл: " + ИмяФайла);
КонецЕсли;
Исключение
Предупреждение("У Вас не достаточно прав для сохранения конфигурации");
Возврат Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Автор статьи: vde69 Категория:
Полезные, Универсальные Функции Как в 1С автоматически переключать раскладку клавиатуры? Для этого можно использовать функционал следующих внешних компонент:
1. FormEx смотрите тут.
Код 1C v 7.x Сервис=СоздатьОбъект("Сервис");
Сервис.РаскладкаКлавиатуры("Russian");
2. Miracle смотрите тут.
3. NetaTable смотрите тут.
Код 1C v 7.x Если (ЗагрузитьВнешнююКомпоненту("NetaTable.dll")=1) Тогда
РовнаяТаблица=СоздатьОбъект("AddIn.NTable");
Иначе
Предупреждение("Внешняя компонента AddIn.NetaTable НЕ подключена!!!"+РазделительСтрок+"Работа программы невозможна!!!");
СтатусВозврата(0);
Возврат
КонецЕсли;
Процедура ПриНачалеВыбораЗначения(ИдентЭлемента,ФлагОтбора)
Если ИдентЭлемента = "Диагноз" Тогда
РовнаяТаблица.УстановитьРаскладку(67699721);
ИначеЕсли ИдентЭлемента = "ИсточникФинансирования" Тогда
РовнаяТаблица.УстановитьРаскладку(68748313);
КонецЕсли;
КонецПроцедуры
А можно и без внешних компонент:
Код 1C v 7.x //примеры Sserj
Процедура СменитьРаскладку(Реж)
//Можно и просто через wrapper.dll
//Wrapper = CreateObject("DynamicWrapper");
//Wrapper.Register("USER32.DLL", "ActivateKeyboardLayout", "i=ll", "f=s", "r=l");
//Wrapper.Register("USER32.DLL", "LoadKeyboardLayout", "i=sl", "f=s", "r=l");
//rus = Wrapper.LoadKeyboardLayout("00000419", 0);
//eng = Wrapper.LoadKeyboardLayout("00000409", 0);
//Если Реж = "RUS" Тогда
// Wrapper.ActivateKeyboardLayout(rus, 0);
//ИначеЕсли Реж = "EN" Тогда
// Wrapper.ActivateKeyboardLayout(eng , 0);
//КонецЕсли;
Если Не (Константа.ВключатьНамЛоокВТелефонах = Истина) Тогда
Возврат;
КонецЕсли;
wshShell=createObject("wScript.shell");
Если Реж = "RUS" Тогда
wshShell.SendKeys("^(8)",0);
ИначеЕсли Реж = "EN" Тогда
wshShell.SendKeys("^(9)",0);
КонецЕсли;
КонецПроцедуры // СменитьРаскладку(Реж)
//ЕЩЕ
//Обновляем хоткеи смены языков, для подмены в полях где нужна английская раскладка
текст = СоздатьОбъект("текст");
текст.ДобавитьСтроку("Windows Registry Editor Version 5.00");
текст.ДобавитьСтроку("");
текст.ДобавитьСтроку("[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000100]");
текст.ДобавитьСтроку("""Virtual Key""=hex:39,00,00,00");
текст.ДобавитьСтроку("""Key Modifiers""=hex:02,c0,00,00");
текст.ДобавитьСтроку("""Target IME""=hex:09,04,09,04");
текст.ДобавитьСтроку("");
текст.ДобавитьСтроку("[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000101]");
текст.ДобавитьСтроку("""Virtual Key""=hex:38,00,00,00");
текст.ДобавитьСтроку("""Key Modifiers""=hex:02,c0,00,00");
текст.ДобавитьСтроку("""Target IME""=hex:19,04,19,04");
ИмяФайла = КаталогИБ() + "LangHotKey.reg";
Попытка
текст.Записать(ИмяФайла);
wshShell=createObject("wScript.shell");
StrCom and = "regedit /S " + СокрЛП(ИмяФайла);
wshShell.Run(StrCom and,1);
//Задерживаемся, иначе скрипт не успевает прочитать файл
Для Сч=1 По 50000 Цикл
КонецЦикла;
ФС.УдалитьФайл(ИмяФайла);
Исключение
КонецПопытки;
Категория:
Полезные, Универсальные Функции Кнопка ~ Как программно нажать кнопку на форме ? Вопрос:
На готовой форме есть кнопки : <OK> <ЗАПИСАТЬ> <ОТМЕНА>
Как программно нажать например кнопку <OK> ?
Ответ:
Нужно программно вызвать процедуру этой кнопки.
Например: Записать(); , Закрыть(); или ЗаписатьВФОРМЕ();
Смотрите синтаксис-помощник 1С
Если эта кнопка по умолчанию, то
Код 1C v 8.х Shell = Новый COM Объект("WScript.Shell");
Shell.SendKeys("{ENTER}");
Категория:
Работа с Формой (Диалог) и её элементами Пример подключения из Windows 7 к удаленной ИБ 1C 8.х через VPN Задача: Ноутбук с Windows 7 (Домашняя версия) должен работать с офисной ИБ 1С8. В офисе компьютеры объединены в домен, соответственно контроллер домена не пускает «чужой» компьютер к своим ресурсам.
Переустанавливать ОС крайне нежелательно, всевозможные попытки изменения настроек домена результатов не дали. Выход достаточно прост.
Для нормальной работы необходимо:
1. На контроллере домена создать VPN соединение;
2. На ноутбуке настроить подключение к этому VPN соединению;
3. На ноутбуке изменить файл маршрутизации к сетевому ключу 1С8.
После установки платформы 1С, до подключения VPN, при запуске программа выдает сообщение:
«Ошибка при выполнении файловой операции …»
После подключения к сети через VPN при стандартном файле netstart.ini выдается сообщение:
«Не обнаружен ключ защиты программы»
Для поиска ключа в сети необходимо изменить этот файл (он находится в папке “C:\Prorgam Files\1cv81\bin\conf”). Для его изменения нужно обладать правами администратора на ноутбуке.
Файл nethasp.ini должен содержать строки:
Код
[NH_COM MON]
NH_IPX = Disabled
NH_NETBIOS = Disabled
NH_TCPIP = Enabled
[NH_IPX]
[NH_NETBIOS]
[NH_TCPIP]
NH_SERVER_ADDR = 192.168.0.10
NH_PORT_NUMBER = 475
NH_TCPIP_METHOD = UDP
NH_USE_BROADCAST = Disabled
При этом HASP драйвер ноутбука напрямую через порт 475 обращается к компьютеру с установленным ключем. Компьютер с адресом 192.168.0.10 (где находится ключ 1С) должен иметь постоянный (статический) адрес в сети, иначе этот файл придется постоянно редактировать.
Лишние настройки в файле nethasp.ini сбивают нормальную работу программы. Все эти настройки также работают с ОС Vista.
Автор:
daulberg Категория:
Администрирование Как подключиться (присоединится) к базе 1С 8 через СОМ Код 1C v 8.х //Пример 1
v8 = CreateObject("V8.COM Connector");
//Строку подключения можно получить так:
Если ФайловаяБазаДанных Тогда
СтрокаПодключения = "file='" + КаталогБазыДанных + "'; usr='" + Пользователь + "'; pwd='" + Пароль + "';";
Иначе
СтрокаПодключения = "srvr='" + Сервер + "'; ref='" + БазаДанных + "'; usr='" + Пользователь + "'; pwd='" + Пароль + "';";
КонецЕсли;
Попытка
//Соединение = V8.Connect("Usr=""admin"";Pwd="""";File=""\\srvr\1C\V8\UPP""");
Соединение = V8.Connect(СтрокаПодключения);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
//Пример 2
Функция ОткрытьСоединение(ОписаниеОшибки) Экспорт
СтрокаПодключения = СформироватьСтрокуПодключения();
Connector = Новый COM Объект("V8.Com Connector");
Попытка
DataSource = Connector.Connect(СтрокаПодключения);
Исключение
ОписаниеОшибки = ОписаниеОшибки();
КонецПопытки;
Если DataSource = Неопределено И ПустаяСтрока(ОписаниеОшибки) Тогда
ОписаниеОшибки = "Неизвестная ошибка подключения к 1С:Предприятие 8.0";
КонецЕсли;
Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
DataSource = Неопределено;
Connector = Неопределено;
КонецЕсли;
Возврат DataSource;
КонецФункции
Функция СформироватьСтрокуПодключения()
СтрокаПодключения = "";
Если ЭтоСервер Тогда
СтрокаПодключения = СтрокаПодключения + "Srvr=" + Сервер + ";Ref=" + Имя + ";";
Иначе
СтрокаПодключения = СтрокаПодключения + "File=""" + Сервер + """;";
КонецЕсли;
СтрокаПодключения = СтрокаПодключения + ?(ПустаяСтрока(Пользователь), "", "Usr=""" + Пользователь + """;");
СтрокаПодключения = СтрокаПодключения + ?(ПустаяСтрока(Пароль), "", "Pwd=""" + Пароль + """;");
Возврат СтрокаПодключения;
КонецФункции
Посмотрите еще ответ на вопрос:
Как определить Информационная База файловая или SQL? Категория:
COM-объекты, WMI, WSH Как сформировать новый документ на основании файла, шаблона Microsoft Office Word и OpenOffice? Код 1C v 8.х Перем СсылкаНаДокумент;
Процедура СформироватбФайл_MS_Word_И_OpenOffice(Кнопка)
ДокументСсылка = СсылкаНаДокумент;
ИмяФайла = ПолучитьИмяВременногоФайла();
// Теперь формируем файл из MS Wordа
Попытка
MSWord = новый COM Объект("Word.Application");
//Передаем текущие параметры форм в MSWord
MSWord.Documents.Open(ИмяФайла);
MSWordDoc = MSWord.ActiveDocument();
WordContent = MSWord.ActiveDocument().ActiveWindow.S_election;
//------------------------------------------------------------
// Перебираем таблицы в документе, и сопоставляем имена переменных
// с именами табличных частей.
Для ТекущаяТаблица = 1 ПО MSWordDoc.Tables.Count Цикл
мТабличнаяЧасть = Неопределено;
Для ТекущаяСтрока = 1 ПО MSWordDoc.Tables(ТекущаяТаблица).Rows.Count Цикл
Для ТекущаяКолонка = 1 ПО MSWordDoc.Tables(ТекущаяТаблица).Columns.Count Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока,ТекущаяКолонка).Range.Text )
,ДокументСсылка);
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
//Итак мы имеем номер текущей таблицы и имя табличной части
Если мТабличнаяЧасть <> Неопределено Тогда
//Производим редактирование нашей таблицы в соответствии с количеством строк
ВсегоСтрокТЧ = 0;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть.Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+1;
КонецЦикла;
//ВсегоСтрокТЧ = ДокументСсылка[мТабличнаяЧасть.Имя].Количество;
// Добавляем строки
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
MSWordDoc.Tables(ТекущаяТаблица).Rows.Add(MSWordDoc.Tables(ТекущаяТаблица).Rows(ТекущаяСтрока+ТекущаяСтрокаТЧ-1));
КонецЕсли;
//MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,2).Range.Text = Строка(ТекущаяСтрокаТЧ);
Для ТекКол = 1 ПО MSWordDoc.Tables(ТекущаяТаблица).Columns.Count Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ,ТекКол).Range.Text));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
MSWordDoc.Tables(ТекущаяТаблица).Cell(ТекущаяСтрока+ТекущаяСтрокаТЧ-1,ТекКол).Range.Text = ТекстПеременной;
КонецЕсли;
КонецЦикла;
КонецЦикла;
//MSWordDoc.Tables(ТекущаяТаблица).Rows.Delete();
//MSWordDoc.Tables(ТекущаяТаблица).Rows(3).Delete();
КонецЕсли;
КонецЦикла;
//------------------------------------------------------------
// Вытаскивам из шаблона текст
ТекстДокумента = MSWordDoc.Range(0, MSWordDoc.Characters.Count).Text;
// Из текста вытаскиваем Имена переменных залюченных а скобки []
Список = ПолучитьСписокПеременных(ТекстДокумента);
//Список.ВыбратьЭлемент();
// Заполняем в структуру ревизитовперечень переменных
СтруктураРеквизитов=СтруктураРеквизитовДокумента(ДокументСсылка);
ЗначениеРеквизита="";
Для Каждого ЭлементСписка Из Список Цикл
// Если находится соответствие переменной из документа и шаблона то производим замену
Если СтруктураРеквизитов.Свойство(ЭлементСписка.Значение, ЗначениеРеквизита ) Тогда
//Сообщить("["+ЭлементСписка.Значение+"]"+" : "+ЗначениеРеквизита);
WordContent.Find.Execute("["+ЭлементСписка.Значение+"]",0,0,0,0,0,-1,,,Строка(ЗначениеРеквизита),2);
Иначе
Сообщить("-> " + ЭлементСписка.Значение+" - Не найден в структуре документа");
// Заменим переменную на пустую строку
WordContent.Find.Execute("["+ЭлементСписка.Значение+"]",0,0,0,0,0,-1,,," ",2);
КонецЕсли;
КонецЦикла;
//автоматически обновляем поля документа
MSWord.S_election.WholeStory();
MSWord.S_election.Fields.Update();
MSWord.S_election.HomeKey();
//MSWordDoc.SaveAs(ИмяФайла);
//отображаем MSWord
MSWord.Visible=1;
MSWord.Activate();
Исключение
Предупреждение(ОписаниеОшибки());
MSWord.Quit();
КонецПопытки;
// Теперь формируем файл из OpenOffice
Попытка
ServiceManager = Новый COM Объект("com .sun.star.ServiceManager");
Reflection = ServiceManager.createInstance("com .sun.star.reflection.CoreReflection");
Desktop = ServiceManager.createInstance("com .sun.star.frame.Desktop");
Args = Новый COM SafeArray("VT_DISPATCH", 1);
OOДокумент = Desktop.loadCom ponentFromURL(ПреобразоватьВURL(ИмяФайла), "_blank", 0, Args);
//------------------------------------------------------------
// Перебираем таблицы в документе, и сопоставляем имена переменных
// с именами табличных частей.
Для ТекущаяТаблица = 0 ПО OOДокумент.getTextTables().Count-1 Цикл
мТабличнаяЧасть = Неопределено;
Для ТекущаяСтрока = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.Count-1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл
мТабличнаяЧасть = ИмяТабличнойЧастиВСтроке(
ПолучитьСтартПеременной( OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекущаяКолонка, ТекущаяСтрока).string )
,ДокументСсылка);
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
Если мТабличнаяЧасть <> Неопределено Тогда
Прервать;;
КонецЕсли;
КонецЦикла;
//Итак мы имеем номер текущей таблицы и имя табличной части
Если мТабличнаяЧасть <> Неопределено Тогда
//Производим редактирование нашей таблицы в соответствии с количеством строк
ВсегоСтрокТЧ = 0;
Для Каждого строкаТЧ Из ДокументСсылка[мТабличнаяЧасть.Имя] Цикл
ВсегоСтрокТЧ = ВсегоСтрокТЧ+1;
КонецЦикла;
//ВсегоСтрокТЧ = ДокументСсылка[мТабличнаяЧасть.Имя].Количество;
// Добавляем строки
Для ТекущаяСтрокаТЧ = 1 По ВсегоСтрокТЧ Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
// Добавляем строку перед нашей
OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.I_nsertByIndex(ТекущаяСтрока+ТекущаяСтрокаТЧ-1, 1);
КонецЕсли;
Для ТекКол = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл
Если ТекущаяСтрокаТЧ <> ВсегоСтрокТЧ Тогда
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ).string));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string = ТекстПеременной;
Иначе
ТекстПеременной = ПолучитьПеременнуюИзСтроки(СокрЛП(OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string));
ТекстПеременной = ?(ПустаяСтрока(ТекстПеременной),"", "["+"_"+Строка(ТекущаяСтрокаТЧ)+"_"+ТекстПеременной+"]");
OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекКол, ТекущаяСтрока+ТекущаяСтрокаТЧ-1).string = ТекстПеременной;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
//------------------------------------------------------------
// Вытаскивам из шаблона текст
//ТекстДокумента = MSWordDoc.Range(0, MSWordDoc.Characters.Count).Text;
ТекстДокумента = ООПолучитьТекст(OOДокумент);
// Из текста вытаскиваем Имена переменных залюченных а скобки []
Список = ПолучитьСписокПеременных(ТекстДокумента);
//Список.ВыбратьЭлемент();
// Заполняем в структуру ревизитовперечень переменных
СтруктураРеквизитов=СтруктураРеквизитовДокумента(ДокументСсылка);
ЗначениеРеквизита="";
OOЗамена = OOДокумент.CreateReplaceDescriptor();
Для Каждого ЭлементСписка Из Список Цикл
// Если находится соответствие переменной из документа и шаблона то производим замену
Если СтруктураРеквизитов.Свойство(ЭлементСписка.Значение, ЗначениеРеквизита ) Тогда
OOЗамена.SearchString = "["+ЭлементСписка.Значение+"]";
OOЗамена.ReplaceString = Строка(ЗначениеРеквизита);
OOДокумент.ReplaceAll(OOЗамена);
Иначе
Сообщить("-> " + ЭлементСписка.Значение+" - Не найден в структуре документа");
// Заменим переменную на пустую строку
OOЗамена.SearchString = "["+ЭлементСписка.Значение+"]";
OOЗамена.ReplaceString = " ";
OOДокумент.ReplaceAll(OOЗамена);
КонецЕсли;
КонецЦикла;
OOДокумент.getCurrentController().getFrame().getContainerWindow().setFocus();
Исключение
Предупреждение(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Код 1C v 8.х //ДОПОЛНИТЕЛЬНО НЕОБХОДИМЫЕ ФУНКЦИИ
// Добавлем форматы представления полей и дополнительную информацию о полях
Процедура ДобавитьФорматы(ПереченьРеквизитов,Значение,пПредставлениеРеквизита, ДокументСсылка = Неопределено)
Если ТипЗнч(Значение) = Тип("Дата") Тогда // расширяем представление даты
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ДФddMMyyyy",Формат(Значение,"ДФ=dd.MM.yyyy"));
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ДЛФDD",Формат(Значение,"ДЛФ=DD"));
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда // расширяем представление числа
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ЧДЦ2ЧГ0",Формат(Значение,"ЧДЦ=2; ЧГ=0"));
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ЧДЦ2",Формат(Значение,"ЧДЦ=2"));
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ЧПропись",Значение);
ИначеЕсли (ТипЗнч(Значение) = Тип("СправочникСсылка.КонтактныеЛица")) или (ТипЗнч(Значение) = Тип("СправочникСсылка.ФизическиеЛица")) Тогда
// Расширяем выводимые поля для типов физ. лица, контакные лица сокращением инициалов
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"ФИО",Строка(Значение));
КонецЕсли
КонецПроцедуры
Процедура ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,РеквизитСсылка,Реквизит,пПредставлениеРеквизита)
мГлубинаРекурсии = мГлубинаРекурсии+1;
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"Код",РеквизитСсылка["Код"]);
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+"Наименование",РеквизитСсылка["Наименование"]);
Для Каждого ЭлементРеквизита Из Реквизит.Реквизиты Цикл
ПереченьРеквизитов.Вставить(пПредставлениеРеквизита+"_"+ЭлементРеквизита.Имя,РеквизитСсылка[ЭлементРеквизита.Имя]);
Если (Найти(ЭлементРеквизита.Тип,"Справочник ссылка")>0) И (мГлубинаРекурсии <=3) И (Найти(ЭлементРеквизита.Тип,",")=0) Тогда
///+++
ЗаполнитьРеквизиты(мГлубинаРекурсии, ПереченьРеквизитов,РеквизитСсылка[ЭлементРеквизита.Имя],РеквизитСсылка[ЭлементРеквизита.Имя].Метаданные(),пПредставлениеРеквизита+"_"+ЭлементРеквизита.Имя);
Иначе
ДобавитьФорматы(ПереченьРеквизитов,РеквизитСсылка[ЭлементРеквизита.Имя],пПредставлениеРеквизита+"_"+ЭлементРеквизита.Имя);
КонецЕсли
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСписокПеременных(ТекстШаблона)
СписокПеременных = Новый СписокЗначений();
ЕщеЕсть = Истина;
Пока ЕщеЕсть Цикл
ПервыйСимвол = Найти(ТекстШаблона,"[");
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти(ТекстШаблона,"]");
Если (ВторойСимвол > 0 И ВторойСимвол > ПервыйСимвол) Тогда
СписокПеременных.Добавить(Сред(ТекстШаблона,ПервыйСимвол + 1,ВторойСимвол - ПервыйСимвол - 1));
ТекстШаблона = Сред(ТекстШаблона,ВторойСимвол + 1);
Иначе
ЕщеЕсть = Ложь;
КонецЕсли;
Иначе
ЕщеЕсть = Ложь;
КонецЕсли;
КонецЦикла;
Возврат СписокПеременных;
КонецФункции
Функция СтруктураРеквизитовДокумента(ДокументСсылка) Экспорт
ПереченьРеквизитов = Новый Структура;
ПереченьРеквизитов.Вставить("Дата",ДокументСсылка["Дата"]);
ДобавитьФорматы(ПереченьРеквизитов,ДокументСсылка["Дата"],"Дата");
ПереченьРеквизитов.Вставить("Номер",ДокументСсылка["Номер"]);
Реквизиты = ДокументСсылка.Метаданные().Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
мГлубинаРекурсии = 1;
ПереченьРеквизитов.Вставить(Реквизит.Имя,ДокументСсылка[Реквизит.Имя]);
ДобавитьФорматы(ПереченьРеквизитов,ДокументСсылка[Реквизит.Имя],Реквизит.Имя,ДокументСсылка);
Если Найти(Реквизит.Тип,"Справочник ссылка")>0 Тогда
ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,ДокументСсылка[Реквизит.Имя],ДокументСсылка[Реквизит.Имя].Метаданные(),Реквизит.Имя);
Иначе
//ДобавитьФорматы(ПереченьРеквизитов,ДокументСсылка[Реквизит.Имя],Реквизит.Имя);
КонецЕсли;
КонецЦикла;
ТабличныеЧасти = ДокументСсылка.Метаданные().ТабличныеЧасти;
Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
// Сообщить(ТабличнаяЧасть); // Для таблицы характеристик отрабатываем свой код // с выводом табличной части как набора реквизитов
Если ТабличнаяЧасть.Имя = "Характеристики" Тогда
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть.Имя] Цикл
мПредставлениеРеквизита = "Характеристика"+"_"+СтрЗаменить(СтрокаТабличнойЧасти["ВидХарактеристики"], " ", "_");
мЗначение = СтрокаТабличнойЧасти["ЗначениеХарактеристики"];
ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,мЗначение);
ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита,ДокументСсылка);
Если Найти(ТипЗнч(мЗначение),"Справочник ссылка")>0 Тогда
ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,мЗначение,мЗначение.Метаданные(),мПредставлениеРеквизита);
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Перечень реквизитов табличной части
Реквизиты = ТабличнаяЧасть.Реквизиты;
Для Каждого Реквизит Из Реквизиты Цикл
Для Каждого СтрокаТабличнойЧасти Из ДокументСсылка[ТабличнаяЧасть.Имя] Цикл
мГлубинаРекурсии = 1;
мПредставлениеРеквизита = "_"+СтрокаТабличнойЧасти.НомерСтроки+"_"+ТабличнаяЧасть.Имя+"_НомерСтроки";
ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,Строка(СтрокаТабличнойЧасти.НомерСтроки));
мПредставлениеРеквизита = "_"+СтрокаТабличнойЧасти.НомерСтроки+"_"+ТабличнаяЧасть.Имя+"_"+Реквизит.Имя;
мЗначение = СтрокаТабличнойЧасти[Реквизит.Имя];
ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,мЗначение);
ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита,ДокументСсылка);
Если Найти(ТипЗнч(мЗначение),"Справочник ссылка")>0 Тогда
ЗаполнитьРеквизиты(мГлубинаРекурсии,ПереченьРеквизитов,мЗначение,мЗначение.Метаданные(),мПредставлениеРеквизита);
Иначе
//ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита);
КонецЕсли;
КонецЦикла;
//Если реквизит числовой, то подсчитываем итог
Если Реквизит.Тип.СодержитТип(Тип("Число")) Тогда
мЗначение = ДокументСсылка[ТабличнаяЧасть.Имя].Итог(Реквизит.Имя);
мПредставлениеРеквизита = "Итог"+"_"+ТабличнаяЧасть.Имя+"_"+Реквизит.Имя;
ПереченьРеквизитов.Вставить(мПредставлениеРеквизита,мЗначение);
ДобавитьФорматы(ПереченьРеквизитов,мЗначение,мПредставлениеРеквизита,ДокументСсылка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат ПереченьРеквизитов;
КонецФункции
Функция ИмяТабличнойЧастиВСтроке(Строка,ДокументСсылка)
ТабличнаяЧасть=Неопределено;
Если НЕ ПустаяСтрока(Строка) Тогда
ТабличнаяЧасть = ДокументСсылка.Метаданные().ТабличныеЧасти.Найти(Строка)
КонецЕсли;
Возврат ТабличнаяЧасть;
КонецФункции
//Получает первый кусок переменной до _
Функция ПолучитьСтартПеременной(ПереданнаяСтрока) Экспорт
СтартПеременной = "";
ПервыйСимвол = Найти(ПереданнаяСтрока,"[");
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти(ПереданнаяСтрока,"]");
Если (ВторойСимвол > 0) И (ВторойСимвол > ПервыйСимвол) Тогда
Переменная = (Сред(ПереданнаяСтрока,ПервыйСимвол+1,ВторойСимвол-ПервыйСимвол-1));
ВторойСимвол = Найти(Переменная,"_");
Если (ВторойСимвол > 0) И (ВторойСимвол > 1) Тогда
СтартПеременной = Сред(Переменная,1,ВторойСимвол-1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат СтартПеременной;
КонецФункции
// Получает переменную заключенную в скобки
Функция ПолучитьПеременнуюИзСтроки(ПереданнаяСтрока) Экспорт
Переменная = "";
ПервыйСимвол = Найти(ПереданнаяСтрока,"[");
Если ПервыйСимвол > 0 Тогда
ВторойСимвол = Найти(ПереданнаяСтрока,"]");
Если (ВторойСимвол > 0) И (ВторойСимвол > ПервыйСимвол) Тогда
Переменная = (Сред(ПереданнаяСтрока,ПервыйСимвол+1,ВторойСимвол-ПервыйСимвол-1));
КонецЕсли;
КонецЕсли;
Возврат Переменная;
КонецФункции// Идентифицирует табличную часть в строке
// Функция преобразует Windows имя файла в URL OpenOffice
Функция ПреобразоватьВURL(ИмяФайла)
Возврат "file:///" + СтрЗаменить(ИмяФайла, "\", "/");
КонецФункции
// Функция извлекает текст из документа
Функция ООПолучитьТекст(OOДокумент)
Текст = "";
oParEnum = OOДокумент.getText().createEnumeration();
Пока oParEnum.hasMoreElements() Цикл
oPar = oParEnum.nextElement();
Если oPar.supportsService("com .sun.star.text.Paragraph") ТОгда
Текст = Текст + oPar.getString();
ИначеЕсли oPar.supportsService("com .sun.star.text.TextTable") Then
//Сообщить(oPar.getString());
КонецЕсли;
КонецЦикла;
Для ТекущаяТаблица = 0 ПО OOДокумент.getTextTables().Count-1 Цикл
Для ТекущаяСтрока = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Rows.Count-1 Цикл
Для ТекущаяКолонка = 0 ПО OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).Columns.Count-1 Цикл
Текст = Текст + OOДокумент.getTextTables().getByIndex(ТекущаяТаблица).getCellByPosition(ТекущаяКолонка, ТекущаяСтрока).string;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Возврат Текст;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice Как сделать, задать паузу при выполнении кода? Если это какая-нибудь обработка и запускается на клиенте(у пользователя) то можно использовать обработчик ожиданий у встроенных функций:
Код 1C v 8.х //Самый простой и доступный способ - использовать диалог "Предупреждение"
// с заданным в качестве параметра необходимым таймаутом:
Предупреждение("Пауза!",60);
// или
Если Вопрос("Перепроведение?", РежимДиалогаВопрос.ОКОтмена, 60) = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
Код 1C v 8.х // А если мы не хотим выводить пользователю ни каких сообщений
// Установим паузу в 5 минут, т.е. 300 секунд
сек = 300;
КонДата = ТекущаяДата() + сек;
Пока ТекущаяДата() < КонДата Цикл
// ждемссс....
КонецЦикла;
Для паузы можно использовать следующие примеры:
Код 1C v 8.х Процедура глПауза(Сек)
scr = Новый COM Объект("WScript.Shell");
scr.Run("sleep "+СокрЛП(Число(Сек)),0,1);
КонецПроцедуры;
Код 1C v 7.x Процедура глПауза(Сек)
scr = СоздатьОбъект("WScript.Shell");
scr.Run("sleep "+СокрЛП(Число(Сек)),0,1);
КонецПроцедуры;
Категория:
COM-объекты, WMI, WSH Работа с журналом расчетов в 1С7.7 из 1С 8.1 через Com соединение Недавно делал перенос справочников и документов из 1С 7.7 "Зарплата и кадры" в 1С 8.1 "Управление торговым предприятием" через
Com соединение. Во время переноса столкнулся с некоторыми проблемами. Одна из них - это при выполнении запроса очень важно правильно указать синтаксис передаваемых значений, особенно даты, иначе запрос не будет выполняться. Как правильно написать запрос? Смотрим:
Код 1C v 8.х //Создадим Com объект для подключения к 1С 77
База77 = Новый COM Object("V77.Application");
//Устанавливаем соединение
Открыта = База77.Initialize(База77.RMTrade,"/d" + ПутьКБазе77,"NO_SPLASH_SHOW");
Если Открыта Тогда
Предупреждение("Ошибка открытия информационной базы!");
Иначе
Сообщить("БАЗА ОТКРЫТА УСПЕШНО!");
Конецесли;
//Определим дату из периода за который
//необходимо выбрать данные
ДатаПериода = ТекущаяДата();
//Подключимся к журналу расчетов
Зрп = База77.CreateObject("ЖурналРасчетов.Зарплата");
//Получим период журнала расчета по нашей дате
//переведем в формат без времени
НТП = Формат(Зрп.НачалоПериодаПоДате(ДатаПериода),"ДЛФ=Д");
КТП = Формат(Зрп.КонецПериодаПоДате(ДатаПериода),"ДЛФ=Д");
//Напишем текст запроса
//обратите внимание на установку периода в запросе
//Если неправильно написать, будет вылазить ошибка
ТекстЗапр = "//{{ЗАПРОС(ВидыРасч)
|Период с '" + НТП + "' по '" + КТП + "';
|Вир = ЖурналРасчетов.Зарплата.ВидРасч;
|Рез = ЖурналРасчетов.Зарплата.Результат;
|Дни = ЖурналРасчетов.Зарплата.Дни;
|ДатаНачала = ЖурналРасчетов.Зарплата.ДатаНачала;
|ДатаОкончания = ЖурналРасчетов.Зарплата.ДатаОкончания;
|Часы = ЖурналРасчетов.Зарплата.Часы;
|Субконто = ЖурналРасчетов.Зарплата.Субконто;
|Сот = ЖурналРасчетов.Зарплата.Объект;
|КодОбъекта = ЖурналРасчетов.Зарплата.Объект.Код;
|Функция РезСумма = Сумма(Рез);
|Группировка Сот;
|Группировка Вир;
|"//}}ЗАПРОС
;
//Создаем объект типа запрос
Запр = База77.CreateObject("Запрос");
//Выполним запрос, если успешно делаем выборку
Если Запр.Выполнить(ТекстЗапр) <> 0 Тогда
Пока Запр.Группировка("Сот") = 1 Цикл
Пока Запр.Группировка("Вир") = 1 Цикл
//...................
//Здесь пишем код выборки и обработки полученных данных
Конеццикла;
Конеццикла;
Конецесли;
Если нам необходимо установить отбор в журнале, например по сотруднику, то сделать это можно следующим образом:
Код 1C v 8.х //в перечне полей добавляем поле код объекта (можно наименование)
"|КодОбъекта = ЖурналРасчетов.Зарплата.Объект.Код;"
//строка условия будет следующей
"|Условие(КодОбъекта = " + Сотр.код + ");"
Из журнала расчетов можно выбрать записи без запроса, методом прямой выборки. В некоторых ситуациях этот способ может быть даже удобней чем через запрос. В данном случае синтаксис будет довольно простым:
Код 1C v 7.x Запр = База77.CreateObject("ЖурналРасчетов.Зарплата");
Запр.ВыбратьЗаписиПоОбъекту(Сотр,НТП,КТП);
Пока Запр.ПолучитьЗапись() = 1 Цикл
//Делаем обработку выборки
Конеццикла;
Написал Валецкий Станислав Категория:
Журналы расчетов Создание ярлыка файла программно На Рабочем столе
Код 1C v 8.х Shell = Новый COM Объект("WScript.Shell");
РабочийСтол = Shell.SpecialFolders("Desktop");
Ярлык = Shell.CreateShortcut(РабочийСтол + "\\Regedit.lnk");
Ярлык.TargetPath = Shell.ExpandEnvironmentStrings("%windir%\\regedit.exe");
Ярлык.WorkingDirectory = Shell.ExpandEnvironmentStrings("%windir%");
Ярлык.WindowStyle = 1;
Ярлык.IconLocation = Shell.ExpandEnvironmentStrings("%windir%\\regedit.exe, 0");
Ярлык.Save();
Код 1C v 7.x Shell = СоздатьОбъект("WScript.Shell");
РабочийСтол = Shell.SpecialFolders("Desktop");
Ярлык = Shell.CreateShortcut(РабочийСтол + "\\Regedit.lnk");
Ярлык.TargetPath = Shell.ExpandEnvironmentStrings("%windir%\\regedit.exe");
Ярлык.WorkingDirectory = Shell.ExpandEnvironmentStrings("%windir%");
Ярлык.WindowStyle = 1;
Ярлык.IconLocation = Shell.ExpandEnvironmentStrings("%windir%\\regedit.exe, 0");
Ярлык.Save();
Категория:
COM-объекты, WMI, WSH Как получить выборку запросом из таблиц базы MySql Код 1C v 8.х //п_Текст - ТекстЗапроса... вернётся соответственно ТЗ
Функция Прямой_запрос_к_jabber(п_Текст) Экспорт
л_ТЗ = Новый ТаблицаЗначений;
л_число_попыток = 0;
л_Запрос_выполнен = Ложь;
Пока (л_Запрос_выполнен = Ложь) И (л_число_попыток <= 3) Цикл
Если (гл_Соединение_jb.State = 0) Или (гл_Соединение_jb.DefaultDatabase <> "log_1c") Тогда
гл_Соединение_jb = "";
л_Параметры_соединения = "DRIVER={MySQL ODBC 5.1 Driver};OPTION=3;DATABASE=BAZADANNIH_IMYA;PWD=PAROLLLLL;PORT=3306;SERVER=ip_adres_servera;UID=admin";
гл_Соединение_jb = Новый COM Объект("ADODB.Connection");
Попытка
гл_Соединение_jb.Open(л_Параметры_соединения);
Исключение
КонецПопытки;
КонецЕсли;
л_Команда = Новый COM Объект("ADODB.Com mand");
л_Команда.ActiveConnection = гл_Соединение_jb;
л_Команда.Com mandText = п_Текст;
л_Команда.Com mandType = 1;
л_Набор_записей = Новый COM Объект("ADODB.Recordset");
л_Набор_записей.CursorType = 3;
л_число_попыток = л_число_попыток + 1;
Попытка
л_Набор_записей = л_Команда.Execute();
л_Запрос_выполнен = Истина;
Исключение
КонецПопытки;
КонецЦикла;
Если (л_Запрос_выполнен = Ложь) Тогда
Сообщить(ОписаниеОшибки());
Возврат(л_ТЗ);
Иначе
л_Число_колонок = л_Набор_записей.Fields.Count - 1;
Если (л_Число_колонок > -1) Тогда
Для Ф = 0 По л_Число_колонок Цикл
л_Колонка_добавлена = Ложь;
л_Префикс = "";
л_сч = 0;
Пока (л_Колонка_добавлена = Ложь) Цикл
Попытка
л_ТЗ.Колонки.Добавить(л_Префикс + л_Набор_записей.Fields(Ф).Name);
л_Колонка_добавлена = Истина;
Исключение
л_Префикс = ?(л_сч = 0, "_", "_" + л_сч + "_");
л_сч = л_сч + 1;
КонецПопытки;
КонецЦикла;
КонецЦикла;
Если (л_Набор_записей.EOF() = Истина) И (л_Набор_записей.BOF() = Истина) Тогда
Иначе
л_Набор_записей.MoveFirst();
Пока (л_Набор_записей.EOF() = 0) Цикл
л_стр = л_ТЗ.Добавить();
Для Ф = 0 По л_Число_колонок Цикл
л_стр[Ф] = л_Набор_записей.Fields(Ф).Value;
КонецЦикла;
л_Набор_записей.MoveNext();
КонецЦикла;
КонецЕсли;
КонецЕсли;
Попытка
л_Набор_записей.Close();
Исключение
КонецПопытки;
Возврат(л_ТЗ)
КонецЕсли;
КонецФункции
Немного кривое решение... но как шаблон вполне
Megas Категория:
COM-объекты, WMI, WSH