Адрес этой странички: http://d1cv8.narod.ru/top_003/d1cv8_20070929_001/d1cv8_20070929_001.htm
Дата: 29.09.2007
Интернет-приложение
к книге
"Delphi и 1С:Предприятие.Программирование информационного обмена"

Глава 3. Подключение к 1С.
Создание
Delphi-компонента, реализующего функционал подключения к 1Cv8.

 

В статье "Создание Delphi-компонента, реализующего функционал подключения к 1Cv7"  детально рассмотрен один из возможных вариантов Delphi-компонента для подключения к программе 1Cv7, как серверу OLE Automation.

Теперь попробуем создать Delphi-компонент, реализующий подключение к программе 1Cv8, как серверу автоматизации.

Но прежде, чем приступить к программированию - напомню следующее :

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

В частности, система 1Cv8 поддерживает механизм OLE Automation в качестве как сервера, так и клиента.

При этом возможны два варианта подключения к 1Cv8 :

1. OLE Automation Client/Server.
В этом случае запускается полноценное приложение 1С:Предприятие 8. 
И система 1Cv8 предоставляет доступ ко всем свойствам и методам своего глобального контекста, имеет дополнительные свойства и методы для выполнения действий, специфичных для работы в режиме OLE Automation, а также  предоставляет возможность  выполнять действия аналогичные интерактивным действиям. 
При этом из внешнего приложения можно управлять видимостью главного окна 1Cv8.
При таком варианте подключения имя сервера COM-объекта (системы 1Cv8) = V8.Application

2. COM-соединение.
В этом случае запускается относительно небольшой внутрипроцессный COM-сервер (модуль приложения программы 1С:Предприятие 8 не используется). 
Следовательно, недоступны функциональные возможности так или иначе связанные с организацией пользовательского интерфейса системы 1С:Предприятие 8. 
А также невозможно из внешнего приложения управлять видимостью главного окна 1Cv8 (оно невидимо).
При таком варианте подключения имя COM-объекта (системы 1Cv8) = v8.COMConnector

ВАЖНО !
При использовании второго варианта достигается более быстрая установка соединения, более быстрое обращение к свойствам и методам объектов системы 1Cv8, а также меньший расход ресурсов операционной системы, но нет возможности использовать возможности пользовательского интерфейса.

 

Строка инициализации программы 1Cv8, как сервера OLE Automation может содержать следующие параметры :

Файловый вариант Б.Д.:
  File=ПолныйПуть\Trade
  Usr=Пользователь
  Pwd=Пароль
Клиент-серверный вариант Б.Д.:
  Srvr=Server1C (имя сервера, где запущен сервер приложений 1С)
  Ref=Trade (имя базы данных на сервере приложений 1С)
  Usr=Пользователь
  Pwd=Пароль


 Более подробно об этом можно прочитать на сайте фирмы 1С (http://www.v8.1c.ru/) в разделе "Интеграция с другими системами" (http://v8.1c.ru/overview/integration.htm). 
А также на других сайтах интернета (например, на http://kb.mista.ru/article.php?id=35 и http://doc-prg.narod.ru/art_00001/art_00001.htm)

 

Теперь приступим к созданию Delphi-компонента.
О том, с чего начать (базовые операции по созданию Delphi-компонентов) - подробно описано  здесь и более останавливаться на этом не будем.

Имя нашего Delphi-компонента : TConnectTo1Cv8
Родительский компонент : TComponent
Имя  package-файла : sp1Cv8_OLE.dpk
Закладка палитры компонентов в среде Delphi : 1Cv8

Сделаем следующие изменения (красный цвет) в тексте, автоматически созданном Delphi  для нашего компонента.

type
    TConnectTo1Cv8 = class(TComponent)
    private
        { Private declarations }

        //Флаг:
        //если true - соединение с программой 1С:Предприятие v8 открыто,
        //в противном случае - false
        fActive : boolean;

        //Флаг: если true - окно видимо,
        //в противном случае - нет
        //Актуально только, если fThisConnect_Is_COM := false;
        fVisible : boolean;

        //Флаг: Тип соединения.
        //если true - тип соединения : COM-соединение,
        //в противном случае - OLE Automation Client/Server
        fThisConnect_Is_COM : boolean;

        //ссылка на 1С:Предприятие v8, как сервер OLE Automation
        fole1Cv8 : Variant;

        //--------------------------------------------------
        //ИНИЦИАЛИЗАЦИЯ ПРОГРАММЫ 1С:ПРЕДПРИЯТИЕ v8

        //строка инициализации программы 1С:Предприятие
        fInitStr : string;

        //Имя программы 1С:Предприятие v8, как сервера OLE Automation
        fAppName : string;

        //Имя Пользователя
        fUsr     : string;

        //Пароль для авторизации Пользователя
        fPwd     : string;

        //Флаг : если TRUE - то файловый вариант базы данных.
        //В противном случае - клиент-серверный
        fThisDB_Is_Files : boolean;

        //............................................
        //Файловый вариант базы данных
        //ПолныйПуть к базе данных
        fFile  : string;
        //............................................

        //............................................
        //Клиент-серверный вариант базы данных
        //имя сервера, где запущен сервер приложений 1С
        fSrvr : string;

        //имя базы данных на сервере приложений 1С
        fRef  : string;
        //............................................

        //--------------------------------------------------
 

    protected
        { Protected declarations }

        //Процедура формирования строки инициализации
        //программы 1С:Предприятие v8
       
procedure BuildInitStr;

        //Метод, реализующий подключение (отключение) к 1Cv8,
        //как серверу автоматизации
       
procedure mSetActive(Value : boolean);

        //Метод, реализующий подключение (отключение) к 1Cv8,
        //Актуально только, если fThisConnect_Is_COM := false;
        procedure mSetVisible(Value : boolean);

        //метод, "отвечающий" за изменение значения fThisConnect_Is_COM
       
procedure mSetThisConnectIsCOM(Value : boolean);

        //метод, "отвечающий" за изменение значения fAppName
       
procedure mSetAppName(Value : string);

        //метод, "отвечающий" за изменение значения fUsr
       
procedure mSetUsr(Value : string);

        //метод, "отвечающий" за изменение значения fPwd
       
procedure mSetPwd(Value : string);

        //метод, "отвечающий" за изменение значения fThisDB_Is_Files 
       
procedure mSetThisDBisFiles(Value : boolean);

        //метод, "отвечающий" за изменение значения fFile
       
procedure mSetFile(Value : string);

        //метод, "отвечающий" за изменение значения fSrvr
       
procedure mSetSrvr(Value : string);

        //метод, "отвечающий" за изменение значения fRef
       
procedure mSetRef (Value : string);


   
public
        { Public declarations }

        //"Опубликуем" значение fole1Cv7, как свойство (только для чтения)
       
property ole1Cv8: Variant read fole1Cv8;

        //"Опубликуем" значение fInitStr, как свойство (только для чтения)
       
property InitStr: string read fInitStr;

        //Конструктор компонента (унаследованный от TComponent)
       
constructor Create(AOwner: TComponent); override;

        //Деструктор компонента (унаследованный от TComponent)
       
destructor Destroy; override;

   
published
        { Published declarations }

        //Свойство Active компонента
        //(подключение (отключение) к 1Cv8,как серверу автоматизации)
        property Active: boolean read fActive write mSetActive;

        //Свойство Visible1Cv8 компонента
        //(Визуализация окна 1Cv8)
        //Актуально только, если ThisConnect_Is_COM := false;
        property Visible1Cv8: boolean read fVisible write mSetVisible;

        //Флаг: Тип соединения.
        //если true - тип соединения : COM-соединение,
        //в противном случае - OLE Automation Client/Server
        property ThisConnect_Is_COM: boolean read fThisConnect_Is_COM write mSetThisConnectIsCOM default FALSE;

        //Имя программы 1С:Предприятие v 8, как сервера автоматизации
        property AppName1Cv8: string read fAppName write mSetAppName;

        //Имя Пользователя
        property UserName: string read fUsr write mSetUsr;

        //Пароль для авторизации Пользователя
        property Password: string read fPwd write mSetPwd;

        //Вариант базы данных.
        //Если TRUE - то файловый вариант базы данных.
        //В противном случае - клиент-серверный
        property ThisDB_Is_Files: boolean read fThisDB_Is_Files write mSetThisDBisFiles default TRUE;

        //ПолныйПуть к базе данных
        //(если файловый вариант базы данных)
        property FilePath: string read fFile write mSetFile;

        //имя сервера, где запущен сервер приложений 1С
        //(если клиент-серверный вариант базы данных)
        property cs_Server: string read fSrvr write mSetSrvr;

        //имя базы данных на сервере приложений 1С
        //(если клиент-серверный вариант базы данных)
        property cs_NameDB: string read fRef write mSetRef;

end;
 


Теперь приступим к реализации объявленных в контексте компонента методов и свойств.

Сначала перекроем конструктор и деструктор компонента (которые унаследованы от предка TComponent).

 


Текст метода BuildInitStr представлен ниже :

Более подробно о ключах запуска 1Cv8 можно прочитать в спец. литературе по 1С:Предприятие v8.


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

 

Ниже представлены исходные тексты функций ConnectTo1C8_Application, ConnectTo1C8_COM и YesLinkToVariant.

 

Теперь протестируем наш Delphi-компонент.

Создадим новый Delphi-проект и на форму проекта положим наш компонент.
Присвоим свойству FilePath компонента соотв. значение 
(полный путь к файлам локальной информационной базы 1Cv8).


Рис.1 
Форма проекта и компонент
TConnectTo1Cv8 на форме


Теперь попробуем присвоить свойству Active компонента ConnectTo1Cv81 значение TRUE.
После инициализации программы 1Cv8 свойство Active компонента примет значение TRUE (рис. 2).

 


Рис.2 
После того, как программа 1С:Предприятие v 8 загрузилась, инициализация
системы завершилась и на экране появилось окно приложения - свойство Active компонента приняло значение TRUE.

 

Теперь присвоим свойству Visible1Cv8 компонента ConnectTo1Cv81 значение FALSE.
Окно программы 1Cv8 исчезнет с экрана монитора (рис.3).



Рис.3 
Окно программы 1Cv8 исчезло с экрана монитора

 

"Экзотики" ради можно расположить на форме проекта Delphi-компоненты TConnectTo1Cv8 и TConnectTo1Cv7 и потестировать их совместно. Результат представлен на рис.4.


Рис.4 
Совместное тестирование Delphi-компонентов 
TConnectTo1Cv8 и TConnectTo1Cv7 

 

До этого момента мы тестировали компонент TConnectTo1Cv8  
при варианте соединения : OLE Automation Client/Server

Результат можно было оценить визуально (появится ли на экране монитора окно программы 1Cv8 или нет).

При варианте соединения : COM-соединение - дело обстоит сложнее, поскольку окно 1Cv8 не может быть видимо в принципе.
Чтобы ценить работоспособность нашего компонента в этом режиме - доработаем наш проект следующим образом :


Рис.5 
Форма проекта после модификации

 

Ниже представлен обработчик события: нажатие на кнопку "Запуск 1Cv8" :

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
    //Запуск 1Cv8 в режиме сервера автоматизации
    ConnectTo1Cv81.Active:=true;
end;

 

Ниже представлен обработчик события: нажатие на кнопку "Список справочников" :

 

Подробно о способах работы с метаданными системы 1Cv8 можно прочитать в специальной литературе по 1Cv8 и в интернете.
Например, на сайте: http://doc-prg.narod.ru 

 

Протестируем наш модифицированный проект.
Результат представлен ниже :


Рис.6  Результат считывания списка справочников (1Cv8).
Тип соединения: COM-соединение.


Вот, собственно, и все по этой теме ...



Здесь можно скачать (40 кб) исходные тексты созданного Delphi-компонента.
Здесь можно скачать (10 кб) исходные тексты проектов для тестирования.
Здесь - скачать (44 кб) тренировочную информационную базу 1Cv8.

Продолжение - расширение функционала компонента: формирование списка зарегистрированных информационных баз 1Cv8. 


(c) Сергей Попов, респ.Коми, г.Усинск, 2007  Письмецо написать ...


Hosted by uCoz