(через 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С...