Основная задача состояла в синхронизации нашего сервиса с 1С(списком контрагентов, номенклатуры и т.д.)
При этом 1С могла быть как на dbf-файлах, так и на MSSQL, поэтому было решено испольнозовать COM для связи сервиса с 1С. Конечно, если бы 1С работала на SQL, гораздо проще было бы общаться с ней с помощью jdbc драйвера, но так как варианты конфигурации могли быть самые разные, использование сom решало все проблемы.
JACOB идеально подошел нашим требованиям. Дальше задача выглядела тривиально: переписать код 1С через com.
Инициализация и авторизация в 1С:
try {
sC = new ActiveXComponent(_1CUtils.V7_APPLICATION);
sControl = (Dispatch)sC.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new _1CException(_1CException._1C_NOT_AVAILABLE) ;
}
int rmTradeId ;
try {
rmTradeId = Dispatch.getIDOfName(sC, _1CUtils.V7_RM_TRADE) ;
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
throw new _1CException(_1CException.RM_TRADE_NOT_AVAILABLE);
}
Variant rmTradeVar = Dispatch.invoke(sControl, rmTradeId, Dispatch.Get, new Object[]{}, new int[]{rmTradeId}) ;
int id = Dispatch.getIDOfName(sControl, _1CUtils.V7_INITIALIZE) ;
Object[] args = new Object[3] ;
args[0] = rmTradeVar.getInt() ;
args[1] = "/D" + ResourceUtils.getResource("path") + " /N" + ResourceUtils.getResource("user") + " /P" + ResourceUtils.getResource("password") ;
args[2] = new Variant("NO_SPLASH_SHOW").getString() ;
Variant result = Dispatch.invoke(sControl, _1CUtils.V7_INITIALIZE, Dispatch.Get, args, new int[]{id}) ;
if (!result.getBoolean()) {
throw new _1CException(_1CException.NOT_AUTHORISED);
}
В переменных _1CUtils.V7_APPLICATION, _1CUtils.V7_RM_TRADE, _1CUtils.V7_INITIALIZE хранятся соответсвующие значения:
- V77.Application
- RMTrade
- Initialize
Для авторизации используется второй параметр функции Initialize – “/DПуть /NПользователь /PПароль”.
Далее, используя стандартные функции 1С, мы можем получить доступ ко всем данным.
- Для чтения свойства справочника воспользоваться функцией GetAttrib, для записи – SetAttrib.
- Для создания объекта – CreateObject
- Для поиска – FindByCode, FindByDescr
- Для выбора из перечисления функциями – ValueByIdentifier
- Для создания нового объекта – New
- Для получения текщуго значения – CurrentItem, выбора значений -SelecвtItems, выбора текущего значения – GetItem
- Для записи – Write
- и т.д.
Прекрасный справочник по работе с функциями 1С можно скачать здесь
Весь функционал работы с 1С был вынесен на отдельный сервер под Windows)), общение с которым осуществлялось псредством веб-сервисов(использовалась связка tomcat+metro).
Не забудьте положить jacob.dll в classpath(или Windows/system32/)