1c ole evalexpr обмен документами

Обновлено: 04.07.2024

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

1C + Delphi 5: Простой пример использования методов EvalExpr и ExecuteBatch 1C

Параллельно рассматривается один из способов, как "открыть" окно 1С

(через OLE; в данном случае рассматривается подключение к "1C-предприятие версии 7.7")

Создадим простое приложение, которое с помощью которого можно "потренироваться" в использовании метода ExecuteBatxh.

Будем исходить из того, что детали подключения у 1С рассмотрены в предыдущем примере и здесь мы этого уже касаться не будем.

Пример (в формате MS Word) можно скачать здесь (931 Кб)

Здесь мы реализуем соединение с 1С (запуск программы 1С) и способ сделать окно 1С видимым (впоследствии это нам пригодится).

Создадим проект с именем Project1
Положим на форму компоненты : типа TGroupBoxl (у GroupBox1 свойство Align установим равным AlTop)
На GroupBox1 положим 4 кнопки (TButton) и TLabel. Установим сво-во Caption у компонентов, как на рисунке (см. ниже).
У Label1 сво-ство Visible установим = FALSE . А свойство Caption .


Должно получиться что-то вроде этого:


В исходном тексте программы добавим следующее (выделено жирным красным цветом) :
uses
Unit2,

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
LabelYesConnect: TLabel;
Button1: TButton;
Button2: TButton;
Button4: TButton;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private

hW1C : hWND; //дескриптор главного окна приложения 1С
ref1C : OleVariant; //ссылка на 1С, как OLE-сервер автоматизации

public
< Public declarations >
end;

Переменная ref1C (типа OleVariant) будет использована в дальнейшем, как указатель на объект 1C (OLE - сервер автоматизации).
Переменная hW1C - дескриптор главного окна приложения 1C.

В модуле Unit2.pas содержатся дополнительные процедуры и функции, которые нам будут нужны в данном примере.

Содержание модуля Unit2.pas :



Сделаем обработчкк события, которое возникает при создании формы, следующим образом :
procedure TForm1.FormCreate(Sender: TObject);
begin
hW1C:=0;
ref1C := UnAssigned;
end;


Сделаем двойной щелчок по компоненту Button1 (Connect) и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button1Click(Sender: TObject);
//Запуск 1С
begin
LabelYesConnect.Visible:=FALSE;
hW1C:=0;
ref1C := UnAssigned;
//Вызов окна диалога 1С для выбора соотв. БазыДанных 1С и запуска приложения 1С
ref1C := ConnectTo1C_Application('','','');
if YesLinkTo1C_Any(ref1C) then begin //Контроль на всякий случай
LabelYesConnect.Visible:=TRUE; //Покажем (для себя), что есть соединение
//Найдем окно запущенного приложения 1С и получим
//дескриптор главного окна приложения 1С
hW1C:=GetHandleThisWindow('1С:Предприятие',1,TRUE,TRUE);
if hW1C<=32 then begin
ShowMessage('Главное окно приложения 1С не найдено !');
end;
end;
end;

Строка :
ref1C := ConnectTo1C_Application('','','');
Соединение с 1C. Текст функции ConnectTo1C_Application() находится в модуле Unit2.pas

Строка :
if YesLinkTo1C_Any(ref1C) then begin
На всякий случай проверяем, что ссылка на 1С - не пуста. Текст функции YesLinkTo1C_Any() находится в модуле Unit2.pas

Строка :
hW1C:=GetHandleThisWindow('1С:Предприятие',1,TRUE,TRUE);
Здесь мы получаем дескриптор главного окна приложения 1С. Это нужно для того, чтобы можно было управлять видимостью окна 1С.
Процедура GetHandleThisWindow() сканирует память компа и ищет процесс, заголовок окна которого начинается с цепочки символов " 1С:Предприятие ". Для этого используются функции API Windows.
Текст GetHandleThisWindow() находится в модуле Unit2.pas

Сделаем двойной щелчок по компоненту Button2 (Disconnect) и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button2Click(Sender: TObject);
//Закрыть приложение 1С
begin
hW1C:=0;
ref1C := UnAssigned;
LabelYesConnect.Visible:=FALSE;
if YesLinkTo1C_Any(ref1C) then begin
LabelYesConnect.Visible:=TRUE;
end;
end;

Здесь все ясно и комментарий не требуется.

Сделаем двойной щелчок по компоненту Button4 (Show) и изменим стандартный обработчик события - нажатие на кнопку - следующим образом (Button3 отсутствует вообще) :
procedure TForm1.Button4Click(Sender: TObject);
//Показать главное окно приложения 1С
begin
if YesLinkTo1C_Any(ref1C) then begin
if hW1C>32 then begin
ShowWindow(hW1C,SW_SHOW);//Показать главное окно приложения 1С
end;
end;
end;

Строка :
if hW1C>32 then begin
Проверяем корректность дескриптора главного окна приложения 1С.

Строка :
ShowWindow(hW1C, SW_SHOW);
Имея корректный дескриптор главного окна приложения - сделаем его видимым
(функция API ShowWindow с флагом SW_SHOW) .

Сделаем двойной щелчок по компоненту Button5 (Hide) и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button5Click(Sender: TObject);
//Скрыть главное окно приложения 1С
begin
if YesLinkTo1C_Any(ref1C) then begin
if hW1C>32 then begin
ShowWindow(hW1C,SW_HIDE);//Скрыть главное окно приложения 1С
end;
end;
end;

Строка :
if hW1C>32 then begin
Проверяем корректность дескриптора главного окна приложения 1С.

Строка :
ShowWindow(hW1C, SW_HIDE);
Имея корректный дескриптор главного окна приложения - скроем его
(функция API ShowWindow с флагом SW_HIDE) .

ВНИМАНИЕ .
Сейчас нужно проверить, чтобы все программы 1С (имеющие заголовок окна 1С:Предприятие ) были выгружены (закрыты) . Ясно, что конфигуратор можно не закрывать .

Откомпилируем и запустим приложение Project1.exe
Нажмите на кнопку " Connect ".
На экране появится диалог для выбора Базы Данных 1С :



Выберите соотв. Базу Данных и нажмите Ok
После загрузки 1С можно продолжить эксперименты.


Шаг N 2. (скачать, 185 Кб)
Продолжим наш проект. На этом шаге мы "потренируемся" с обращением к методу EvalExpr .


Положим на форму еще 3 компонента (ниже, чем GroupBox1 ) :
TLabel, TEdit и TButton (Button3)
Изменим имя Edit1 на EditEvalExpr. Получится что-то вроде этого :


В исходном тексте программы добавим описание переменной OleFizLica

private
< Private declarations >
hW1C : hWND; //дескриптор главного окна приложения 1С
ref1C : OleVariant; //ссылка на 1С, как OLE-сервер автоматизации

refEvalExpr : OleVariant; //ссылка на результат, возвращаемый функцией EvalExpr(1C)

public
< Public declarations >
end;

var
Form1: TForm1;


Дополним обработчкк события, которое возникает при создании формы, следующим образом :
procedure TForm1.FormCreate(Sender: TObject);
begin
hW1C:=0;
ref1C := UnAssigned;

refEvalExpr := UnAssigned;

end;

Дополним обработчкк события для Button1 следующим образом :

procedure TForm1.Button1Click(Sender: TObject);
//Запуск 1С
begin
LabelYesConnect.Visible:=FALSE;
hW1C:=0;
ref1C := UnAssigned;

refEvalExpr := UnAssigned;

//Вызов окна диалога 1С для выбора соотв. БазыДанных 1С и запуска приложения 1С
ref1C := ConnectTo1C_Application('','','');
if YesLinkTo1C_Any(ref1C) then begin //Контроль на всякий случай
LabelYesConnect.Visible:=TRUE; //Покажем (для себя), что есть соединение
//Найдем окно запущенного приложения 1С и получим
// дескриптор главного окна приложения 1С
hW1C:=GetHandleThisWindow('1С:Предприятие',1,TRUE,TRUE);
if hW1C<=32 then begin
ShowMessage('Главное окно приложения 1С не найдено !');
end;
end;
end;

Дополним обработчкк события для Button2 следующим образом :

procedure TForm1.Button2Click(Sender: TObject);
//Закрыть приложение 1С
begin
hW1C:=0;
ref1C := UnAssigned;

refEvalExpr := UnAssigned;

LabelYesConnect.Visible:=FALSE;
if YesLinkTo1C_Any(ref1C) then begin
LabelYesConnect.Visible:=TRUE;
end;
end;

Сделаем двойной щелчок по компоненту Button3 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :

Все строки, кроме :

уже были рассмотрены ранее. Эта строка, собственно, и вызывает метод EvalExpr для выполнения. В данном случае, в качестве параметра для EvalExpr передается то, что будет введено в EditEvalExpr.Text.


Теперь нажмите кнопку Выполнить. Если Вы указали корректное имя файла внешней обработки, то на экране будет что-то вроде :


Шаг N 3. (скачать, 193 Кб)
Продолжим наш проект. На этом шаге мы "потренируемся" с обращением к методу ExecuteBatch .

Положим на форму еще 4 компонента :
TGroupBox (GroupBox2) - установим сво-ство Caption = "Текст для ExecuteBatch : ", а св-во Align = alBottom
TPanel (Panel1) - установим сво-ство Align = alTop
На Panel1 кинем кнопку TButton (Button6) и установим сво-ство Caption = "Выполнить"
Затем, на GroupBox2 кинем TMemo и установим сво-ство Align = alClient.
Изменим имя Memo1 на MemoBatch.

Получится что-то вроде этого :


Сделаем двойной щелчок по компоненту Button6 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :

procedure TForm1.Button6Click(Sender: TObject);
//Выполнить метод ExecuteBatch (1C)
begin
if MemoBatch.Lines.Count>0 then begin
if YesLinkTo1C_Any(ref1C) then begin
if hW1C>32 then begin
// Здесь можно заставить окно 1С
// принудительно открываться перед выполнением ExecuteBatch, если надо
ShowWindow(hW1C,SW_SHOW); //Показать окно 1С, чтобы увидеть результат (если надо)
end;
ref1C.ExecuteBatch(MemoBatch.Text);
end;
end;
end;

Здесь следует прокомментировать только строку :

ref1C.ExecuteBatch(MemoBatch.Text);

Это и есть вызов метода ExecuteBatch (1С)

На этом, собственно, программирование заканчивается. Можно начинать экспериментировать с программой

ВНИМАНИЕ .
Перед началом экспериментов следует отметить, что если в тексте есть какие-либо ошибки, метод ExecuteBatch не сообщает об этом, а просто НЕ выполняется .

Несколько простых примеров использования метода ExecuteBatch :



Пример-3 :
Это уже несколько более серьезный пример.
Чтобы его выполнить, нужно в глобальник 1С внести строку :

Перем гл9БуферДляOLE[100] Экспорт; //Для внешних обращений через OLE

Суть примера в том, что создается и выполняется Запрос.
Затем, результат Запроса выгружается в ТаблицуЗначений и ТаблицаЗначений выдается на экран.


Введите в MemoBatch следующий текст :


и нажмите кнопку "Выполнить".
На экране будет что-то вроде этого (выполняется запрос).

OLE - технология связывания и внедрения объектов в другие документы и объекты, разработанная корпорацией Microsoft. Основные понятия технологии - это объект, сервер приложения и контейнер.

● Объект OLE - это объект, который создан в другом приложении и сохранивший связь с текущим приложением.

● Контейнер OLE - приложение, в котором создается документ содержащий объект OLE.

● Сервер OLE - открытое приложение, в котором был создан объект OLE.

1С Предприятие и приложения MS Office могут быть контейнером и сервером OLE.

С помощью OLE технологии создается взаимодействие между информационными базами, что позволяет напрямую обрабатывать объекты (читать, записать), созданные в сторонней базе. Интеграция предусмотрена как в файловых базах, так и в клиент-серверных.

2. Основные правила подключения и работы с OLE

1. Создать COM объект с идентификатором

Существуют два идентификатора:

● V83.Application - режим толстого клиента;

● V83C.Application - режим тонкого клиента (нет возможности обратиться к менеджерам документов, справочникам и т.д., а также недоступны методы прикладных объектов).



2. Сформировать строку подключения

● Строка соединения файловой БД:



● Строка соединения серверной БД:



3. Connect к БД

«Connect» производит соединение с указанием одного параметра - строки. При успешном соединении с базой возвращается значение «Истина», в противном случае – «Ложь».



4. Доступ к объектам БД

● Свойства глобального контекста. Для доступа к константам, справочникам, документам, перечислениям, метаданным можно использовать свойство глобального контекста.



● Метод NewObject() необходим для создания объекта типа «Запрос».



5. Подключение к MS Office через OLE

Для подключения к офисным пакетам приложений MS Office также используют механизм OLE. Идентификаторы OLE приложений уникальны, при установке программы они записываются в регистр операционной системы.

Способы подключения к 1С отличаются от версии платформы, а также других факторов, которые будут рассмотрены ниже.

Варианты подключения к 1С для 7.7

Через OLE

Используется объект V77.Application, не самый быстрый, но универсальный способ.

Пример:

Подключение напрямую к базе данных

Является альтернативным способом, для его осуществления требуется разбор таблиц, опираясь на файл 1Cv7.DD.

Способ позволяет очень быстро оперировать большими объемами данными, но требуется глубокая отладка таких подключений.

Пример рассматривать не будем, так как это объемная тема, а для большинства 7.7. уже прошлое.

Подключение к платформе 8.1, 8.2, 8.3

Совместимый вариант: Com-Соединение

Является аналогом OLE, принцип работы очень схож, но это более быстрая технология.

Пример подключения из 7.7 к 8.2

Пример подключения из 8.3 к 8.3

Примеры приведены в учебных целях, выдергиванием из готовых решений, код частично менялся, но должен быть работоспособен.

Web-сервисы

Пример работы (не получится проверить, показывает общую технологию подключения, создания объектов и обращения к методам сервиса)

Для отладки подключения рекомендую использовать приложение SOAPUi

  • современная универсальная технология подключения к 1С и сторонним сервисам
  • требуется доработка 1С
  • управление данными для передачи
  • требуется публикация на стороннем сервисе (в дальнейшем на сервер от 1С, Платформа 8.4)

Пример работы будет рассмотрен в отдельной статье

REST-интерфейс

Использовать автоматический стандартный интерфейс OData прикладного решения просто:

Более подробный обзор и примеры работы на сайте 1С

Заключение

Существует много способов подключения к 1С и из 1С.

Выбор любого производится анализом возможностей доработки, доступности базы из вне, наличием вэб-серверов, операционной системы

Реклама – самая интересная и самая трудная форма литературы.

— Олдос Хаксли.

При формировании пользовательского интерфейса прикладной задачи довольно часто существуют ситуации, когда для удобства работы пользователя необходимо дать возможность обрабатывать имеющиеся данные с помощью других, имеющихся на компьютере программ.

Одним из примеров использования такой возможности может служить запуск программы Microsoft Excel (непосредственно из программы 1С:Предприятие ) с одновременным выводом в нее результатов расчета. Далее пользователь может обрабатывать полученные результаты (просматривать, редактировать, печатать и т. п.) непосредственно в среде Microsoft Excel.

Одну из возможностей запуска и управления внешними приложениями дает механизм OLE Automation. Встроенный язык системы 1С:Предприятие поддерживает технологию управления объектами OLE. Непосредственно при помощи операторов языка можно управлять, например, программами, входящими в Microsoft Office.

Контекст работы с внешними приложениями

Внешнее приложение, с которым предполагается устанавливать связь, должно отвечать следующим условиям: внешнее приложение должно поддерживать механизм OLE Automation и должно быть установлено на том компьютере, где его намечено использовать.

Во всех программных модулях вызов процедур или функций внешнего приложения может выполняться только при помощи переменной со ссылкой на объект, который создается функцией СоздатьОбъект . Чтобы вызвать метод внешнего приложения, имя метода (с указанием необходимых параметров) пишется через точку после идентификатора переменной.

Примеры OLE идентификаторов:

// Создаем объект Excel (запускаем программу Excel)

Ехсе l = СоздатьОбъект("Excel.Application");

// делаем окно программы Excel видимым и активным

Методы внешних приложений

Методы внешних приложений, а также синтаксис их использования у каждого приложения свои. Описание процедур и функций внешнего приложений можно получить только в документации данного приложения. Например, практически все программы, входящие в пакет Microsoft Office используют для своего управления версию языка Visual Basic.

Чтобы вызвать метод внешнего приложения в языке системы 1С:Предприятие, имя метода (с указанием необходимых параметров) пишется через точку после имени ссылки на объект внешнего приложения.

// Создаем объект Excel и присвоим его переменной языка

ОкноЕхсе l = СоздатьОбъект("Excel.Application");

// устанавливаем имя окна Excel

ОкноЕхсе l . Caption = "Отчет";

// создадим новую рабочую книгу

НовыеРабочиеКниги = ОкноЕхсе l . Workbooks ;

РабочаяКнига = НовыеРабочиеКниги. Add ();

Ограничения:

Не поддерживаются значения, передаваемые по ссылке;

Не поддерживаются массивы, в точности SAFEARRAY ;

Не поддерживаются значения типа IUnknown .

Эти ограничения не столь серьезны, т. к. например, все типы данных, с которыми работает Excel и большинство других наиболее распространенных программ, полностью поддерживаются.

Типы поддерживаемых данных:

//В данном примере запускается программа Excel,

// затем в нее передаются некоторые данные, и затем

// на их основе строится диаграмма.

// Создаем объект Excel и присвоим его переменной языка

ОкноЕхсе l = СоздатьОбъект("Excel.Application");

// устанавливаем имя окна Excel

ОкноЕхсе l . Caption = "Отчет";

// создадим новую рабочую книгу

НовыеРабочиеКниги = ОкноЕхсе l . Workbooks ;

РабочаяКнига = НовыеРабочиеКниги.А dd ();

// проставим названия строк

Для Ряд = 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));

// зададим имя выделенной области

// определим рамку выделенной области и присвоим ее переменной языка

// установим стили для рамки выделенной области

Рамка. LineStyle = 1;

// построим диаграмму Лист=РабочаяКнига.Worksheets(1);

Диаграмма = Лист. ChartObjects ();

Диаграмма = Диаграмма. Add (5, 5 + Область.Тор + Область. Height ,

Область. Width , Область. Height );

// сделаем окно Excel видимым и активным

ОкноЕхсе l .Visible = 1;

Работа системы 1С:Предприятие в качестве OLE Automation сервера

Система 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 сервера

Система 1С:Предприятие в качестве OLE Automation сервера предоставляет полный доступ к своему глобальному контексту (см. «Контекст выполнения программного модуля»). Поэтому объект OLE-сервер 1С:Предприятие в качестве своих атрибутов может иметь: системные константы, значения заданных в конфигураторе констант, перечислений, регистров, видов расчета, групп видов расчета, а также переменные, объявленные в глобальном программном модуле с ключевым словом Экспорт .

Методы системы 1С:Предприятие как OLE Automation сервера

Система 1С:Предприятие в качестве OLE Automation сервера предоставляет полный доступ к своему глобальному контексту (см. «Контекст выполнения программного модуля»). Поэтому объект OLE-сервер 1С:Предприятие в качестве своих методов может иметь: системные процедуры и функции, а также процедуры и функции глобального программного модуля, объявленные с ключевым словом Экспорт . Кроме того, OLE-сервер 1С:Предприятие имеет три дополнительных метода: Initialize , EvalExpr , ExecuteBatch .

Initialize

Выполнить инициализацию системы 1С:Предприятие.

Initialize(<Имя_Объекта>.RMTrade, <КоманднаяСтрока>, <ПустаяСтрока>)

Читайте также: