Логин:   Пароль:






Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100
Rambler's Top100

Статьи - разминка для умаНекоторые способы взаимодействия Java с 1С (Часть 1)

Некоторые способы взаимодействия Java с 1С (Часть 1)

На сегодняшний день 1С является самым популярным в России решением в области автоматизации бухгалтерии в сфере малого и среднего бизнеса. Это является следствием ее надежности, простоты и доступности, а также определенного круга узких задач, кото-рые могут быть решены с ее помощью, но только в нашей стране. Вместе с тем, 1С не стоит на месте и постоянно развивается, интегрируется с передовыми технологиями, о чем свидетельствует появление возможности разработки Web-сервисов, поддержи СУБД PostgreSQL.

Все же изначально 1С – это система учета. Быстрая, простая разработка конфигура-ций по шаблону. А значит ограниченный функционал. За частую при автоматизации рабо-ты предприятия встречаются задачи, которые 1С решить не в состоянии, либо это реше-ние будет крайне не рациональное. Ситуацию усложняет закрытая структура хранения данных в 1С. Отсюда и задача взаимодействия с другими системами.

В ОАО "МРСК-Юга" – "Ростовэнерго" с апреля этого года началось внедрение ком-плекса 1С. Основная задача при этом заключается не только в переносе данных из старой бухгалтерской системы, разработанной на предприятии с использованием архитектуры: клиент (FoxPro) – сервер (СУБД MS SQL Serever 2000), но и интеграции ряда задач кото-рые реализованы с использованием клиент - серверных java технологий и используют бухгалтерскую информацию из 1С. Целью данной статьи является описание ряда реше-ний, которые позволяют выполнить поставленные выше задачи.

Специфической особенностью предприятия является то, что оно имеет 8 подразделе-ний - филиалов территориально расположенных по всей Ростовской области. При этом филиалы должны вести свою бухгалтерию используя общую нормативно справочную ин-формацию (НСИ), которая может корректироваться только в аппарате управления, а также существуют справочники, которые являются едиными и могут редактироваться не только на головном предприятии.

Проанализировав всевозможные способы обмена информацией, основным был вы-бран обмен посредством Web – сервисов. Причем, с помощью этого средства не только выполнять обмен данными между платформами в режиме реального времени, но и фор-мировать сводные бухгалтерские отчеты по всем филиалам из Java приложений. Надо от-метить, что в 1С имеются средства и способы для этого, например создание сводного сер-вера, но, к сожалению режима "реального времени" данные средства не обеспечивают. Авторы не относят себя к знатокам технологий 1С, поэтому подробностей их создания привести невозможно. Что касается Java, то Web сервисы здесь не представляют никаких затруднений. Имеется множество механизмов их разработки. В руководстве по использо-ванию IDE NetBeans показано, как создавать Web сервис двумя кликами мыши.

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

Рассмотрим проблему интеграции единого реестра договоров, более подробно осо-бенности взаимодействия с ним описаны в [1, 2]. Задача заключалась в том, чтобы отсле-живать все изменения в реестре и выдавать их в виде файла в общедоступную директо-рию, из которой "забирать" средствами 1С. В качестве формата файлов был выбран – CSV. В структуру бизнес объекта был добавлен флаг изменений, на основании которого выполняется запрос к базе данных, а после успешного занесения данных в файл, флаг сбрасывается. Данный метод внесен в отдельную службу и запускается на сервере прило-жений каждые 10 минут, фрагмент службы представлен в Листинге 1.

Листинг 1. Фрагмент кода службы выполняющей задачи по расписанию.

private final ScheduledExecutorService scheduler =
      Executors.newScheduledThreadPool(1);

   public void beepForAnPeriod() {
       final Runnable beeper = new Runnable() {
               public void run() {
                   log.info("Запускается задача по расписанию");
                   workDB.sendAllDepartment();
                   log.info("Задача выполнена");
               }
           };
       final ScheduledFuture beeperHandle =
           scheduler.scheduleWithFixedDelay(beeper, 60, 600, SECONDS);
   }

В качестве механизма перемещающего данные hibernate - запроса в CSV файл, была выбрана библиотек opencsv-1.8. Основным компонентом для записи в файл данной биб-лиотеки является объект CSVWriter, у которого сигнатура конструктора имеет объект класса FileWriter, что как, оказалось, вызывает определенные проблемы. При тестирова-нии данного механизма на ОС Windows все было замечательно, однако переход в рабочий режим на ОС Debian выявил проблемы с кодировкой у итоговых файлов, все попытки ее изменения в объекте FileWriter не привели к успеху, поэтому запись в файл была реализо-вана традиционным способом, Листинг 2.

Листинг 2. Фрагмент метода сохранения в файл

public boolean throwFile(List treatiess) {
try {
  DateFormat df = new SimpleDateFormat("ddMMyyyyHHmm");
// Формирование имени файла
  String namefile = "dogovor" + df.format(new Date());
  PrintWriter writer = new PrintWriter(
     new OutputStreamWriter(
      new FileOutputStream("/var/Dogovora/" + namefile + ".csv"), "Cp1251"));
  for (Treaties tr : treatiess) {
   if (tr.getSorg() != null) {
    String[] ar = new String(
      "" + tr.getId() +// идентификатор
      "#" + tr.getIdObjContr() +// идетификатор предмета договора
      "#" + tr.getSorg().getId() +//идетификатор контрагента
………………………………………………………………………………………………
………………………………………………………………………………………………
      "#").split("#");
    for (int i = 0; i < ar.length; i++) {
      writer.print("\"" + ar[i]+ "\"" + "~~~");
    }
    writer.println();
   } else {
    log.error("Ошибка!!! Договор № " + tr.getN_obj1() + " не имеет контр-агента!");
   }
  }
  writer.close();
  return true;
 } catch (IOException ex1) {
  ex1.printStackTrace();
  log.error("Ошибка!!!", ex1);
  return false;
 }
}

Следует заметить, что данный механизм был приемлем, только для тех сущностей с которыми работают Java-приложения, так как структурные изменения выполнены с ми-нимальными затратами и ни как не отразились на работосопосбоности системы. Однако данный механизм в таком виде нельзя использовать для справочников, с которыми на из-менения одновременно могут работать Java приложения и FoxPro. Как было описано в [2], работа с такими справочниками на добавление записей осуществляется через Mule всеми АРМами. Изменение структуры данных справочников недопустимо, так как пришлось бы переделывать массу кода в АРМах написанных на FoxPrо. Поэтому было принято реше-ние сделать копии таблиц для соответствующих справочников с префиксом tmp, которые использовать как буфер, в который будут заноситься измененные данные, затем задача по расписанию будет их "забирать" и преобразовывать в csv файл по описанному выше ме-ханизму, после чего очищать данные таблицы. А сами изменения отслеживать с помощью триггера Листинг 3.

Листинг 3. Триггер для отслеживания изменений

CREATE TRIGGER [allupdate] ON [dbo].[s_org] 
FOR  INSERT, UPDATE
AS insert into dbo.tmp _sorg select * from inserted

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

Список используемых источников

  1. Некоторые способы реализации механизма распределенной транзакции. Жмайлов Б.Б., Александров П.В.
  2. Особенности перехода к единой корпоративной информационной системе в ОАО "Ростовэнерго". Жмайлов Б.Б., Александров П.В.



Жмайлов Б.Б. , Александров П.В.
ОАО "МРСК-Юга" – "Ростовэнерго"

Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 11

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/books/show2b.php on line 30
Узнай о чем ты на самом деле сейчас думаешь тут.


Опрос
Считаете ли вы целесообразным сделать аналог упражнений по Hibernate на базе вопросов www.sql-ex.ru?
Да, полный аналог упражнений
Да, но с реализацией основных конструкций объектной модели
Нет, Hibernate не актуален, использую др. технологии
Нет



Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 91

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/news/worldnews.php on line 95