1C + Delphi 5: Простой пример подключения к Базе Данных 1C

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

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

Создадим простое приложение, которое считывает список из справочника "ФизическиеЛица".

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

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

Создадим проект с именем Project1
Положим на форму 2-а компонента типа TPanel (у  Panel1 свойство Align установим равным AlTop, а у Panel2 - AlClient)
На Panel1 положим кнопку Button1 (TButton) и установим свойство Caption = "Соединить"
Положим на Panel1 еще 4 компонента :
Label1, Edit1, Label2, Edit2
Установим :
 - свойство Caption :
    Label1.Caption -  "Имя 1C-сервера = "
    Label2.Caption  - "Строка инициализации = "
 - свойство Text :
    Edit1.Text  - "V77.Application"
    Edit2.Text  - "/DF:\1CV77\ATCDEMO"

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

Некоторые пояснения.
Edit1.Text содержит имя 1C, как OLE - сервера автоматизации.
В нашем случае мы указали : V77.Application
Возможные  значения (согласно документации по 1C) :
- V1СEnterprise.Application - версия независимый ключ;
- V77.Application - версия зависимый ключ;
- V77S.Application - версия зависимый ключ, SQL версия;
- V77L.Application - версия зависимый ключ, локальная версия;
- V77M.Application - версия зависимый ключ, сетевая версия.
Edit2.Text содержит строку инициализации 1C
В нашем случае мы указали : /DF:\1CV77\ATCDEMO
Т.е., указали только местонахождение Базы Данных, к которой желаем подключиться 
(в этом примере : указан каталог F:\1CV77\ATCDEMO)
Возможные  значения ключей (согласно документации по 1C) :
/D - Имя каталога (папки), где располагается База Данных
/N - Имя Пользователя
/P - Пароль доступа
Пример :  /DC:\1CV77\ATCDEMO /NАдмин /P123

В исходном тексте программы добавим следующее (выделено жирным красным цветом) :
uses
 
ComObj,
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, StdCtrls;

type
    TForm1 = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
    private
        { Private declarations }
        Ole1C : OleVariant;
    public
        { Public declarations }
    end;

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


Сделаем двойной щелчок по компоненту  Button1 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button1Click(Sender: TObject);
Var
    ResOpen : integer;

begin
    Ole1C := CreateOleObject(Edit1.Text);
    ResOpen:=Ole1C.Initialize(Ole1C.RMTrade, Edit2.Text, '');
end;

Строка :
 Ole1C := CreateOleObject(Edit1.Text);
собственно, "запускает" программу 1C, как OLE - сервер автоматизации (имя указано в Edit1.Text)

Строка :
ResOpen:=Ole1C.Initialize(Ole1C.RMTrade, Edit2.Text, '');
инициализирует 1C, согласно нашим "указаниям" (Edit2.Text)

Более подробно можно почитать соотв. документацию по 1C

Откомпилируем и запустим приложение Project1.exe
Нажмите на кнопку "Соединить".
Если все указано корректно (содержание Edit1.Text и Edit2.Text), 
программа 1C должна запуститься (как OLE сервер автоматизации).


Если в строке инициализации НЕ указаны имя пользователя и(или) пароль доступа, то следует запрос :




Если не корректно указан каталог Базы Данных, то следует  запрос :


После загрузки и инициализации программы 1C, ссылка на 1C хранится в переменной Ole1C.
Следует помнить, что программа 1С:Предприятие (как и все создаваемые объекты OLE Automation), выступающая в качестве объекта OLE Automation в другой программе, будет находиться в памяти компьютера до удаления или изменения значения переменной, содержащей ее в качестве объекта.
Именно поэтому, мы вынесли объявление переменной Ole1C  "за пределы" обработчика : TForm1.Button1Click

Явных (видимых) признаков того, что мы запустили 1C - нет.
Для того, что убедиться в этом, нужно запустить диспетчер задач (по комбинации Ctrl+Alt+Del).
В списке задач можно увидеть : 



Следует отметить, что после того, как Project1.exe будет закрыт -  автоматически выгрузится из памяти и 1C.


Шаг N 2.(скачать, 180Кб)
Продолжим наш проект.

На Panel2 положим компонент ListBox1 (TListBox). Свойство Align установим равным AlClient.
Рядом с кнопкой Button1 ("Соединить") положим на Panel1 кнопку Button2 (установим свойство Caption = ФизЛица)
Получится что-то вроде этого :



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

private
    { Private declarations }
    Ole1C : OleVariant;
   
OleFizLica : OleVariant;
public
    { Public declarations }
end;

var
    Form1: TForm1;

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

procedure TForm1.Button2Click(Sender: TObject);
begin
    OleFizLica := Unassigned;
    if not VarIsEmpty(Ole1C) then begin
        OleFizLica:=Ole1C.CreateObject('Справочник.ФизическиеЛица');
    end;

end;

Строка :
OleFizLica := Unassigned;
Здесь "обнуляется" значение переменной OleFizLica. 
Тем самым, если ранее был создан какой-либо OLE-объект, на который ссылалась эта переменная, он будет уничтожен.

Строка :
if not VarIsEmpty(Ole1C) then begin
Здесь проверяется, чтобы значение переменной Ole1C не было "пустым".
Т.е., если Ole1C имеет "не пустое" значение, то это значит (в контексте нашего проекта), что программа 1C запущена и связь с ней установлена.

Строка :
OleFizLica:=Ole1C.CreateObject('Справочник.ФизическиеЛица');
Здесь создается объект, который ссылается на справочник "ФизическиеЛица".
Если такой справочник существует, то в дальнейшем, переменная OleFizLica будет содержать ссылку на него.

Откомпилируем и запустим приложение Project1.exe
Нажмите на кнопку "Соединить". После того, как загрузится программа 1C, нажмите на кнопку "ФизЛица".
Если все указано корректно , то ничего не произойдет (никаких дополнительных сообщений не будет)
Это значит, что все OK.

Шаг N 3. (скачать, 184 Кб)

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


Строки N 3,4,5,6  теперь понятны.

Строка N 7 :
if not VarIsEmpty(OleFizLica) then begin
Здесь проверяется, что объект, ссылающийся на справочник "ФизическиеЛица" действительно создан. 

Строки N 8..13
Здесь реализован стандартный алгоритм на языке 1C по перебору элементов справочника.

Строка N 11
ListBox1.Items.Add(OleFizLica.Код+' '+OleFizLica.Наименование);
Здесь продемонстрирован один из вариантов обращения к реквизитам справочника по именам.

Строка N 16
OleFizLica := Unassigned;
Здесь "обнуляется" значение переменной OleFizLica. 
Тем самым, мы уничтожаем созданный нами объект, чтобы зря не занимать ресурсы.
Следует отметить, что поскольку (в нашем случае) мы используем переменную
OleFizLica только в "пределах" обработчика 
procedure TForm1.Button2Click(Sender: TObject), то мы могли бы и объявить эту переменную в этом обработчике.


Откомпилируем и запустим приложение Project1.exe
Нажмите на кнопку "Соединить". После того, как загрузится программа 1C, нажмите на кнопку "ФизЛица".
Если все указано корректно , то в ListBox1 будет содержание справочника "ФизическиеЛица".
Т.е., будет что-то вроде этого :



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

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

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

Rambler's Top100