При формировании пользовательского интерфейса прикладной задачи довольно часто существуют ситуации, когда для удобства работы пользователя необходимо дать возможность обрабатывать имеющиеся данные с помощью других, имеющихся на компьютере программ.
Одним из примеров использования такой возможности может служить запуск программы Microsoft Excel (непосредственно из программы 1С:Предприятие ) с одновременным выводом в нее результатов расчета. Далее пользователь может обрабатывать полученные результаты (просматривать, редактировать, печатать и т. п.) непосредственно в среде Microsoft Excel.
Одну из возможностей запуска и управления внешними приложениями дает механизм OLE Automation. Встроенный язык системы 1С:Предприятие поддерживает технологию управления объектами OLE. Непосредственно при помощи операторов языка можно управлять, например, программами, входящими в Microsoft Office.
Внешнее приложение, с которым предполагается устанавливать связь, должно отвечать следующим условиям: внешнее приложение должно поддерживать механизм OLE Automation и должно быть установлено на том компьютере, где его намечено использовать.
Во всех программных модулях вызов процедур или функций внешнего приложения может выполняться только при помощи переменной со ссылкой на объект, который создается функцией СоздатьОбъект. Чтобы вызвать метод внешнего приложения, имя метода (с указанием необходимых параметров) пишется через точку после идентификатора переменной.
При создании переменной со ссылкой на внешнее приложение, в качестве имени объекта в операторе СоздатьОбъект должен выступать зарегистрированный OLE идентификатор внешнего приложения.
Зарегистрированный OLE идентификатор внешнего приложения — это уникальный идентификатор программного продукта, который записывается в регистрационную базу Windows при инсталляции программы.
Примеры OLE идентификаторов:
Excel |
"Excel.Application" |
LotusApproach |
"Approach.Application" |
MSGraph |
"MSGraph.Application" |
PowerPoint |
"PowerPoint.Application" |
Пример:
// Создаем объект Excel (запускаем программу Excel)
Ехсеl = СоздатьОбъект("Excel.Application");
// делаем окно программы Excel видимым и активным
Excel.Visible = l;
Методы внешних приложений, а также синтаксис их использования у каждого приложения свои. Описание процедур и функций внешнего приложений можно получить только в документации данного приложения. Например, практически все программы, входящие в пакет Microsoft Office используют для своего управления версию языка Visual Basic.
Чтобы вызвать метод внешнего приложения в языке системы 1С:Предприятие, имя метода (с указанием необходимых параметров) пишется через точку после имени ссылки на объект внешнего приложения.
Пример:
// Создаем объект Excel и присвоим его переменной языка
ОкноЕхсеl = СоздатьОбъект("Excel.Application");
// устанавливаем имя окна Excel
ОкноЕхсеl.Caption = "Отчет";
// создадим новую рабочую книгу
НовыеРабочиеКниги = ОкноЕхсеl.Workbooks;
РабочаяКнига = НовыеРабочиеКниги.Add();
Ограничения:
Не поддерживаются значения, передаваемые по ссылке;
Не поддерживаются массивы, в точности SAFEARRAY;
Не поддерживаются значения типа IUnknown.
Эти ограничения не столь серьезны, т. к. например, все типы данных, с которыми работает Excel и большинство других наиболее распространенных программ, полностью поддерживаются.
Типы поддерживаемых данных:
Boolean
Currency
Date
Double-precision floating-point
Integer
Long integer
Object
Single-precision floating-point
String
Пример:
//В данном примере запускается программа Excel,
// затем в нее передаются некоторые данные, и затем
// на их основе строится диаграмма.
// Создаем объект Excel и присвоим его переменной языка
ОкноЕхсеl = СоздатьОбъект("Excel.Application");
// устанавливаем имя окна Excel
ОкноЕхсеl.Caption = "Отчет";
// создадим новую рабочую книгу
НовыеРабочиеКниги = ОкноЕхсеl.Workbooks;
РабочаяКнига = НовыеРабочиеКниги.Аdd();
ЧислоРядов = 10;
ЧислоСтолбцов = 5;
// проставим названия строк
Для Ряд = 1 По ЧислоРядов Цикл
Ячейка = ОкноЕхсеl.Cells(Ряд + 1, 1);
Ячейка.Value = "Строка " + Строка(Ряд);
КонецЦикла;
// проставим названия столбцов
Для Столбец = 1 По ЧислоСтолбцов Цикл
Ячейка = ОкноЕхсеl.Cells(1, Столбец + 1);
Ячейка.Value = "Столбец " + Строка(Столбец);
КонецЦикла;
// заполним ячейки таблицы значениями
Для Ряд = 1 По ЧислоРядов Цикл
Для Столбец = 1 По ЧислоСтолбцов Цикл
Ячейка = ОкноЕхсеl.Cells(Ряд + 1, Столбец + 1);
Ячейка.Value = Ряд + Столбец;
КонецЦикла;
КонецЦикла;
// выделим область в таблице и присвоим ее переменной языка
Область = ОкноЕхсеl.Range(ОкноЕхсеl.Cells(1, 1),
ОкноЕхсеl.Cells(ЧислоРядов + 1, ЧислоСтолбцов + 1));
// зададим имя выделенной области
Область.Name = "ОбластьДанных";
// определим рамку выделенной области и присвоим ее переменной языка
Рамка = Область.Borders;
// установим стили для рамки выделенной области
Рамка.LineStyle = 1;
Рамка.Colorlndex = 3;
// построим диаграмму Лист=РабочаяКнига.Worksheets(1);
Диаграмма = Лист.ChartObjects();
Диаграмма = Диаграмма.Add(5, 5 + Область.Тор + Область.Height,
Область.Width, Область.Height);
МояДиаграмма = Диаграмма.Chart;
МояДиаграмма.ChartWizard("ОбластьДанных ", -4102, 6, 1, 1, 1, 1, "Отчет");
// сделаем окно Excel видимым и активным
ОкноЕхсеl.Visible = 1;
Система 1С:Предприятие может быть запущена внешним приложением в качестве OLE Automation сервера и предоставляет доступ ко всем атрибутам и методам своего глобального контекста (см. «Контекст выполнения программного модуля»). Кроме того, OLE-сервер 1С:Предприятие имеет дополнительные методы, с помощью которых можно выполнить последовательность операторов или вычислить выражение, заданное на встроенном языке 1С:Предприятие.
Для запуска системы 1С:Предприятие в качестве OLE Automation сервера из внешнего приложения, выполняется следующая последовательность действий:
· создается объект с OLE идентификатором:
o V1СEnterprise.Application — версия независимый ключ;
o V77.Application — версия зависимый ключ;
o V77S.Application — версия зависимый ключ, SQL версия;
o V77L.Application — версия зависимый ключ, локальная версия;
o V77M.Application — версия зависимый ключ, сетевая версия.
· выполняется инициализация системы 1С:Предприятие методом Initialize.
· вызываются атрибуты и методы системы 1С:Предприятие как OLE Automation сервера
Замечание 1: Поскольку программа 1С:Предприятие является одновременно OLE Automation сервером и OLE Automation клиентом, то возможно из 1С:Предприятие обращаться к другой копии 1С:Предприятие (например, к другой конфигурации) для обмена данными. В основном все современные программные продукты поддерживают механизм OLE Automation, это касается в частности MS Office, MS FoxPro и приложений на них написанных, DAO и т. п., поэтому программа 1С:Предприятие может полностью интегрироваться с ними.
Замечание 2: Не локализованные версии внешних программ, обращающихся к программе 1С:Предприятие посредством OLE Automation, могут неправильно интерпретировать русские идентификаторы объектов агрегатных типов данных, например, реквизитов справочников. Данное замечание не относится к продуктам MS Office и к программам, использующим в качестве языка обращения к OLE объектам Microsoft Visual Basic. Рекомендуется использовать локализованные версии программных продуктов, либо в конфигурации использовать идентификаторы без символов кириллицы. Для обращения к атрибутам и методам агрегатных типов данных системы 1С:Предприятие из внешних приложений рекомендуется использовать их англоязычные синонимы.
Замечание 3: Все созданные объекты OLE Automation существуют до тех пор, пока существует переменная, которая содержит значение данного объекта. Следовательно, сама программа 1С:Предприятие, выступающая в качестве объекта OLE Automation в другой программе, будет находиться в памяти компьютера до удаления или изменения значения переменной, содержащей ее в качестве объекта.
Система 1С:Предприятие в качестве OLE Automation сервера предоставляет полный доступ к своему глобальному контексту (см. «Контекст выполнения программного модуля»). Поэтому объект OLE-сервер 1С:Предприятие в качестве своих атрибутов может иметь: системные константы, значения заданных в конфигураторе констант, перечислений, регистров, видов расчета, групп видов расчета, а также переменные, объявленные в глобальном программном модуле с ключевым словом Экспорт.
Система 1С:Предприятие в качестве OLE Automation сервера предоставляет полный доступ к своему глобальному контексту (см. «Контекст выполнения программного модуля»). Поэтому объект OLE-сервер 1С:Предприятие в качестве своих методов может иметь: системные процедуры и функции, а также процедуры и функции глобального программного модуля, объявленные с ключевым словом Экспорт. Кроме того, OLE-сервер 1С:Предприятие имеет три дополнительных метода: Initialize, EvalExpr, ExecuteBatch.
Выполнить инициализацию системы 1С:Предприятие.
Синтаксис:
Initialize(<Имя_Объекта>.RMTrade, <КоманднаяСтрока>, <ПустаяСтрока>)
Англоязычный синоним:
Initialize
Параметры:
<Имя_Объекта> |
Идентификатор созданного OLE объекта 1С:Предприятие. |
RMTrade |
Добавочное ключевое слово. |
<КоманднаяСтрока> |
Строковое выражение — командная строка запуска 1С:Предприятие. |
<ПустаяСтрока> |
Строковое выражение. Параметр может содержать пустую строку или строковое значение "NO_SPLASH_SHOW" — отключить заставку при запуске системы 1С:Предприятие в режиме OLE Automation сервера. |
Возвращаемое значение:
Значение логического типа: TRUE, если инициализация прошла удачно, или FALSE, если нет.
Замечание: В OLE Automation TRUE и FALSE имеют соответственно значения: -1 (минус единица) и 0.
Описание:
Метод Initialize выполняет инициализацию системы 1С:Предприятие.
Пример:
* здесь пример приводится на языке MS Visual Basic:
Dim v7 As Object
Set v7 = CreateObject("V77.Application")
result = v7.Initialize(v7.RMTrade, "/DC:\V7\DB /M", "")
Вычислить выражение системы 1С:Предприятие.
Синтаксис:
EvalExpr(<СтрокаВыражения>)
Англоязычный синоним:
EvalExpr
Параметры:
<СтрокаВыражения> |
Строковое выражение — выражение, записанное на встроенном языке 1С:Предприятие. |
Возвращаемое значение:
Результат вычисленного выражения.
Описание:
Метод EvalExpr вычисляет выражение, записанное в параметре <СтрокаВыражения> на встроенном языке 1С:Предприятие и возвращает результат вычисления. Результатом выражения может быть число, строка, дата или значение любого агрегатного типа данных. Результат с неопределенным типом данных преобразуются к строковому типу.
Пример:
* здесь пример приводится на языке MS Visual Basic:
Dim v7 As Object
Dim Товары As Object
Set v7 = CreateObject("V77.Application")
result = v7.Initialize(v7.RMTrade, "/DC:\V7\DB /M", "")
Set Товары = v7.EvalExpr("ОтдатьСправочникТоваров()");
Создает объект агрегатного типа данных системы 1С:Предприятие и возвращает ссылку на него.
Синтаксис:
CreateObject(<ИмяАгрегатногоТипа>)
Англоязычный синоним:
CreateObject
Параметры:
<ИмяАгрегатногоТипа> |
Строковое выражение, значение которого содержит имя агрегатного типа данных, объявленного в конфигураторе. |
Возвращаемое значение:
Ссылка на созданный объект агрегатного типа данных.
Описание:
Метод CreateObject создает объект агрегатного типа данных системы 1С:Предприятие и возвращает ссылку на него. Данная функция обычно используется одновременно с неявным определением переменной и присвоением ей ссылки на объект агрегатного типа данных.
Пример:
Процедура Загрузить()
Если ФС.Существуетфайл(Путь + "\NUL") = 0 Тогда
Предупреждение("Путь информационной базы не найден!");
Иначе
V7 = СоздатьОбъект("V77.Application");
Открыта = V7.Initialize(V7.RMTrade, "/d" + Путь +
" /M /N" + Пользователь, "");
Если Открыта = 0 Тогда
Предупреждение("Ошибка открытия информационной базы");
Возврат;
КонецЕсли;
Импорт = V7.CreateObject("Справочник.Контрагенты");
Импорт.ВыбратьЭлементы();
Пока Импорт.ПолучитьЭлемент() = 1 Цикл
Если Импорт.ЭтоГруппа() = 0 Тогда
Сообщить(Импорт.Наименование);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Выполнить последовательность операторов системы 1С:Предприятие.
Синтаксис:
ExecuteBatch(<СтрокаОператоров>)
Англоязычный синоним:
ExecuteBatch
Параметры:
<СтрокаОператоров> |
Строковое выражение — текст программы на встроенном языке 1С:Предприятие. |
Возвращаемое значение:
Значение логического типа: TRUE, если последовательность операторов выполнены успешно, или FALSE, если нет.
Замечание: В OLE Automation TRUE и FALSE имеют соответственно значения: -1 (минус единица) и 0.
Описание:
Метод ExecuteBatch выполняет последовательность операторов, записанную в параметре <СтрокаОператоров> на встроенном языке 1С:Предприятие.
Пример:
* здесь пример приводится на языке MS Visual Basic:
Sub Command1_Click ()
Dim v7 As Object
Dim Price As Object
Set v7 = CreateObject("V77.Application")
result = v7.Initialize(v7.RMTrade, "/DC:\V7\DB /M", "")
Set Price = v7.EvalExpr("ОтдатьСправочникТоваров()")
Price.New
Price.Code = "112233"
Price.Description = "Test string"
Price.Write;
BoolResult = v7.ExecuteBatch("ПроцедураРегл1();ПроцедураРегл2()")
End Sub
* Обращение к программе 1С:Предприятие из модуля MS Excel. В данном примере запускается и инициализируется конфигурация 1С:Предприятие с базой данных в каталоге C:\V7\DB в монопольном режиме. Далее в программе 1С:Предприятие создается объект типа "Справочник.Товары", где создается новая группа элементов с названием "***** Экспорт из Excel ******". Во вновь созданную группу каталога записываются данные из таблицы MS Excel. Здесь пример приводится на языке MS Visual Basic.
Sub Excel_to_trade()
Dim trade As Object
Dim Товар As Object
Set trade = CreateObject("V77 .Application")
result = trade.Iinitialize(trade.RMTrade, "/DC:\V7\DB /M", "")
Set Товар = trade.EvalExpr("CreateObject(""Справочник.Товары"")")
Товар.НоваяГруппа
Товар.Наименование = "***** Экспорт из Excel ******"
Товар.Записать
Товар.ИспользоватьРодителя Товар.ТекущийЭлемент
N = 100 'Количество строк в документе
For Count = 1 То N Товар.Новый
Товар.Наименование = Application.Cells(Count, 2).Value
Товар.Розн_Цена = Application.Cells(Count, 3).Value
Товар.Мел_Опт_Цена = Application.Cells(Count, 4).Value
Товар.Onт_Цена = Application.Cells(Count, 5).Value
Товар.Записать
Next Count
End Sub
Другим способом обращения к данным 1С:Предприятие а из внешних программ является режим DDE. Основное преимущество данного режима является динамическое обновление получаемых из 1С:Предприятие данных.
Система 1С:Предприятие является DDE сервером и предоставляет свой сервис в получении данных и уведомлении DDE клиента об их изменении.
В качестве DDE сервера 1С:Предприятие может возвращать значение некоторого выражения, записанного на встроенном языке 1С:Предприятие. Возвращаемое значение является строкой. Для того, чтобы рассматривать результат выражения в качестве числа или даты, например в ячейке MS Excel, может потребоваться задание формата значения.
Для доступа к 1С:Предприятие посредством DDE следует использовать DDE-объект с именем 1CV7|DDE.
Пример:
* Ниже приведены примеры размещения в ячейках MS Excel DDE связей с программой 1С:Предприятие. Первое выражение в примере обращается к стандартной функции встроенного языка 1С:Предприятие. Второе выражение в примере обращается к функции, записанной в глобальном модуле конфигурации программы 1С:Предприятие.
='1CV7'|DDE!'РабочаяДата()'
='1CV7'|DDE!'СуммаПоНарядам()'
Замечание 1: Для правильной интерпретации значения выражения в качестве числа или даты в MS Excel, нужно в операционной системе установить соответствующий формат представления даты и числа, как он принят в 1С:Предприятие.
Замечание 2: Не рекомендуется обращаться посредством DDE к функциям 1С:Предприятие, которые могут выполняться продолжительное время. Это связано с тем, что обращение к данной функции будет выполняться достаточно часто при обновлениях DDE связей.