Имя: Пароль:
1C
 
Java и 1C. COM/DCOM
0 lucky_spb
 
19.07.07
16:22
Êàê-òî äàâíåíüêî ñïðàøèâàë ïðî âîçìîæíîñòü äîñòóïà ê 1Ñêå èç Java-ïðèëîæåíèÿ.
Íàçâàëè èçâðàùåíöåì.
Âîçìîæíî ýòî è èçâðàò, íî òàêèå òðåáîâàíèÿ çàêàç÷èêà.

Çäåñü õî÷ó ïðèâåñòè íåáîëüøîé ïðèìåð ðåàëèçàöèè òàêîãî äîñòóïà.

×òî åñòü.
Èíôîðìàöèîííàÿ ñèñòåìà ñ âåá-èíòåðôåéñîì. ßäðî - Java, áàçà - PostgreSQL
Ñàìàÿ ïðîñòàÿ 1C-Áóõãàëòåðèÿ 8 íà âèíäîâîé ìàøèíå.

×òî íàäî:
Ïîñòîÿííî ñèíõðîíèçèðîâàòü ñïðàâî÷íèêè è äîêóìåíòû â 1Ñêå è äðóãîé ñèñòåìå.

Èñïîëüçîâàë:
Java-DCOM Brigde: J-Interop
http://j-interop.sourceforge.net/

Òóò ïðèâåäó ïðîñòåéøèé êîííåêò è âûáîðêó/çàïèñü äàííûõ â 1Ñ.
Çàïóñêàþ âñå íà îäíîé ìàøèíå. Ñ ñåáÿ æå êîííåê÷óñü ê ñåáå.


package com.Elcom.util.comSync;

import java.net.UnknownHostException;

import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
import org.jinterop.dcom.core.JIComServer;
import org.jinterop.dcom.core.JIProgId;
import org.jinterop.dcom.core.JISession;
import org.jinterop.dcom.core.JIString;
import org.jinterop.dcom.core.JIVariant;
import org.jinterop.dcom.win32.ComFactory;
import org.jinterop.dcom.win32.IJIDispatch;

import com.Elcom.tables.Organisation;
import com.Elcom.tables.OrganisationManager;
import com.Elcom.tables.sync.*;
import java.util.*;

public class SynchronizeOrganisation {

   private JIComServer comStub = null;
   private IJIDispatch dispatch = null;
   private IJIComObject unknown = null;
   private IJIDispatch v8 = null;

   public SynchronizeOrganisation() throws JIException, UnknownHostException {
       // Domain, user, password
       JISession session = JISession
               .createSession("localhost", "dcom", "dcom");
       // Host
       comStub = new JIComServer(JIProgId.valueOf(session, "V8.COMConnector"),
               "localhost", session);
   }

   public void start1C() throws JIException {
       unknown = comStub.createInstance();
       dispatch = (IJIDispatch) ComFactory.createCOMInstance(
               ComFactory.IID_IDispatch, unknown);
   }

   public void getV8Object() throws JIException {

       // Connecting to 1C
       // File=basePath; Usr=user; Pswd=password;
       String conString = "File=D:\\Programs\\1c\\Base\\Buhg_local;";
       JIString connectPath = new JIString(conString);
       JIVariant[] var = dispatch.callMethodA("Connect",
               new Object[]{connectPath.VariantByRef});
       // v8 - îñíîâíîé îáúåêò - ñîåäèíåíèå 1Ñ - ÷åðåç íåãî âåäóòñÿ âñå
       // äàëüíåéøèå çàïðîñû
       v8 = (IJIDispatch) var[0].getObjectAsComObject(unknown);
   }

   public void getOrganisationFrom1C() throws JIException {
       IJIDispatch spr = (IJIDispatch) v8.get("Ñïðàâî÷íèêè")
               .getObjectAsComObject(unknown);
       IJIDispatch sprKontr = (IJIDispatch) spr.get("Êîíòðàãåíòû")
               .getObjectAsComObject(unknown);

       IJIDispatch viborka = (IJIDispatch) sprKontr.callMethodA("Âûáðàòü")
               .getObjectAsComObject(unknown);

       while (viborka.callMethodA("Ñëåäóþùèé").getObjectAsBoolean()) {
           System.out.println(viborka.get("Íàèìåíîâàíèå").getObjectAsString()
                   .getString());
       }
   }
       
   public void closeConnection() throws JIException {    
       JISession.destroySession(dispatch.getAssociatedSession());    
       System.out.println("Trying to Destroy session");
   }

   public static void syncManager() throws JIException,
           UnknownHostException {
       JISystem.setLogLevel(Level.FINEST);
       SynchronizeOrganisation sync = new SynchronizeOrganisation();
       sync.start1C();
       sync.getV8Object();        
       sync.getOrganisationFrom1C();
       sync.closeConnection();
       System.out.println("Synchronization completed");

   }

}
1 lucky_spb
 
19.07.07
16:23
Как-то давненько спрашивал про возможность доступа к 1Ске из Java-приложения.
Назвали извращенцем.
Возможно это и изврат, но такие требования заказчика.

Здесь хочу привести небольшой пример реализации такого доступа.

Что есть.
Информационная система с веб-интерфейсом. Ядро - Java, база - PostgreSQL
Самая простая 1C-Бухгалтерия 8 на виндовой машине.

Что надо:
Постоянно синхронизировать справочники и документы в 1Ске и другой системе.

Использовал:
Java-DCOM Brigde: J-Interop
http://j-interop.sourceforge.net/

Тут приведу простейший коннект и выборку/запись данных в 1С.
Запускаю все на одной машине. С себя же коннекчусь к себе.


package com.Elcom.util.comSync;

import java.net.UnknownHostException;

import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.IJIComObject;
import org.jinterop.dcom.core.JIComServer;
import org.jinterop.dcom.core.JIProgId;
import org.jinterop.dcom.core.JISession;
import org.jinterop.dcom.core.JIString;
import org.jinterop.dcom.core.JIVariant;
import org.jinterop.dcom.win32.ComFactory;
import org.jinterop.dcom.win32.IJIDispatch;

import com.Elcom.tables.Organisation;
import com.Elcom.tables.OrganisationManager;
import com.Elcom.tables.sync.*;
import java.util.*;

public class SynchronizeOrganisation {

   private JIComServer comStub = null;
   private IJIDispatch dispatch = null;
   private IJIComObject unknown = null;
   private IJIDispatch v8 = null;

   public SynchronizeOrganisation() throws JIException, UnknownHostException {
       // Domain, user, password
       JISession session = JISession
               .createSession("localhost", "dcom", "dcom");
       // Host
       comStub = new JIComServer(JIProgId.valueOf(session, "V8.COMConnector"),
               "localhost", session);
   }

   public void start1C() throws JIException {
       unknown = comStub.createInstance();
       dispatch = (IJIDispatch) ComFactory.createCOMInstance(
               ComFactory.IID_IDispatch, unknown);
   }

   public void getV8Object() throws JIException {

       // Connecting to 1C
       // File=basePath; Usr=user; Pswd=password;
       String conString = "File=D:\\Programs\\1c\\Base\\Buhg_local;";
       JIString connectPath = new JIString(conString);
       JIVariant[] var = dispatch.callMethodA("Connect",
               new Object[]{connectPath.VariantByRef});
       // v8 - основной объект - соединение 1С - через него ведутся все
       // дальнейшие запросы
       v8 = (IJIDispatch) var[0].getObjectAsComObject(unknown);
   }

   public void getOrganisationFrom1C() throws JIException {
       IJIDispatch spr = (IJIDispatch) v8.get("Справочники")
               .getObjectAsComObject(unknown);
       IJIDispatch sprKontr = (IJIDispatch) spr.get("Контрагенты")
               .getObjectAsComObject(unknown);

       IJIDispatch viborka = (IJIDispatch) sprKontr.callMethodA("Выбрать")
               .getObjectAsComObject(unknown);

       while (viborka.callMethodA("Следующий").getObjectAsBoolean()) {
           System.out.println(viborka.get("Наименование").getObjectAsString()
                   .getString());
       }
   }
       
   public void closeConnection() throws JIException {    
       JISession.destroySession(dispatch.getAssociatedSession());    
       System.out.println("Trying to Destroy session");
   }

   public static void syncManager() throws JIException,
           UnknownHostException {
       JISystem.setLogLevel(Level.FINEST);
       SynchronizeOrganisation sync = new SynchronizeOrganisation();
       sync.start1C();
       sync.getV8Object();        
       sync.getOrganisationFrom1C();
       sync.closeConnection();
       System.out.println("Synchronization completed");

   }

}
2 lucky_spb
 
19.07.07
16:29
PS: может модератор удалить мое первое сообщение - была трабла с кодировкой.
Ну и это тоже тогда?
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший