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

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

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

© 22.08.2003 Сергей Попов

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

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

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


Шаг N 1. (скачать, 182Кб)

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

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

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


В исходном тексте программы добавим следующее (выделено жирным красным цветом) :
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
    { Private declarations }

        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С можно продолжить эксперименты.


Нажмите кнопку Show. На экране появится окно приложения 1С (обратите внимание, что в заголовке окна есть цепочка символов 1С:Предприятие).

Нажмите кнопку Hide. Окно 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 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :

procedure TForm1.Button3Click(Sender: TObject);
//Выполнить метод EvalExpr (1C)
//Например, содержание команды для EvalExpr может быть такой :
// ОткрытьФорму("Отчет#", , ЗдесьПолноеИмяФайлаВнешнегоОтчетаИлиОбработки)
begin
   refEvalExpr := UnAssigned;
   
EditEvalExpr.Text:=Trim(EditEvalExpr.Text);
    if Length(EditEvalExpr.Text)>0 then begin
        if YesLinkTo1C_Any(ref1C) then begin
            if hW1C>32 then begin
                //
Здесь можно заставить окно 1С 
                //принудительно открываться перед выполнением EvalExpr, если надо
                //ShowWindow(hW1C,SW_SHOW);
//Показать окно 1С, чтобы увидеть результат (если надо)
            end;
            refEvalExpr := ref1C.EvalExpr(EditEvalExpr.Text);
//Выполнить EvalExpr
        end;
    end;
end;

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

    refEvalExpr := ref1C.EvalExpr(EditEvalExpr.Text); 

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

Откомпилируем и запустим приложение Project2.exe
Сделаем соединение с 1С (см, Шаг N 1)
В поле элемента редактирования EditEvalExpr введем текст :
    ОтрытьФорму("Отчет#",,ЗдесьНужноУказатьПолноеИмяФайлаВнешнейОбработки)

 

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

Шаг 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 :

Пример-1 :

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

ОчиститьОкноСообщений();
Сообщить("Привет, как дела ?");

и нажмите кнопку Выполнить.
Должно получиться что-то вроде этого :


Пример-2 :

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

ОчиститьОкноСообщений();
Сообщить("Привет, как дела ?");
Предупреждение("Привет, как дела ?")

и нажмите кнопку Выполнить.
Должно получиться что-то вроде этого :

 

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

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

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


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



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


По окончанию процесса, должно получиться что-то вроде этого :


Вот, собственно, и все (чего мы хотели).

Примером использования сказанного выше, может служить программа "ExecuteBatch для 1C по таймеру" (work1C.exe). Ее назначение - отладка текстов команд для метода ExecuteBatch и выполнение этих текстов в виде заданий по таймеру для указанных Баз Данных 1С. Скачать программу.

Copyright© 2003 Сергей Попов

Другие примеры работы в Delphi с 1С...

Rambler's Top100