Package com.ipc.oce

Source Code of com.ipc.oce.OCApp

package com.ipc.oce;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
import java.util.UUID;

import javax.xml.namespace.NamespaceContext;

import com.ipc.oce.metadata.AccessRight;
import com.ipc.oce.metadata.objects.OCRoleMetadataObject;
import com.ipc.oce.metadata.objects._OCCommonMetadataObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIString;
import org.jinterop.dcom.core.JIVariant;
import org.jinterop.dcom.impls.automation.IJIDispatch;

import com.ipc.msa.ComApp;
import com.ipc.oce.exceptions.ConfigurationException;
import com.ipc.oce.metadata.OCConfigurationMetadataObject;
import com.ipc.oce.metadata.OCType;
import com.ipc.oce.metadata.OCTypeDescription;
import com.ipc.oce.objects.OCAccountingRegisterCollection;
import com.ipc.oce.objects.OCAccountingRegisterManager;
import com.ipc.oce.objects.OCAccumulationRegisterCollection;
import com.ipc.oce.objects.OCCatalogCollection;
import com.ipc.oce.objects.OCCatalogManager;
import com.ipc.oce.objects.OCChartOfAccountsManager;
import com.ipc.oce.objects.OCChartOfCharacteristicTypesManager;
import com.ipc.oce.objects.OCChartsOfAccountCollection;
import com.ipc.oce.objects.OCChartsOfCharacteristicTypeCollection;
import com.ipc.oce.objects.OCConstantCollection;
import com.ipc.oce.objects.OCConstantManager;
import com.ipc.oce.objects.OCDocumentCollection;
import com.ipc.oce.objects.OCDocumentJournalCollection;
import com.ipc.oce.objects.OCDocumentManager;
import com.ipc.oce.objects.OCEnumCollection;
import com.ipc.oce.objects.OCEnumManager;
import com.ipc.oce.objects.OCEnumRef;
import com.ipc.oce.objects.OCExchangePlanManager;
import com.ipc.oce.objects.OCExchangePlansCollection;
import com.ipc.oce.objects.OCInfoBaseUsersManager;
import com.ipc.oce.objects.OCInformationRegisterCollection;
import com.ipc.oce.objects.OCInformationRegisterManager;
import com.ipc.oce.objects.OCUUID;
import com.ipc.oce.objects._OCCommonRef;
import com.ipc.oce.objects.OCInfoBaseUser;
import com.ipc.oce.objects.reports.OCReportCollection;
import com.ipc.oce.query.OCQuery;
import com.ipc.oce.varset.EActivator;
import com.ipc.oce.xml.oc.OCDOMBuilder;
import com.ipc.oce.xml.oc.OCDOMWriter;
import com.ipc.oce.xml.oc.OCXDTOFactory;
import com.ipc.oce.xml.oc.OCXDTOPackageCollection;
import com.ipc.oce.xml.oc.OCXDTOSerializer;
import com.ipc.oce.xml.oc.OCXMLDataType;
import com.ipc.oce.xml.oc.OCXMLReader;
import com.ipc.oce.xml.oc.OCXMLSchemaBuilder;
import com.ipc.oce.xml.oc.OCXMLSchemaSet;
import com.ipc.oce.xml.oc.OCXMLWriter;

/**
* Реализация методов 1С. Фактически методы класса это методы и свойства
* глобального контекста 1С. Глобальный контекст инициализируется при открытии
* конфигурации в режиме "1С:Предприятие" и существует вплоть до ее закрытия.
* Все свойства, процедуры и функции глобального контекста доступны в любом
* программном модуле конфигурации. Доступ к свойствам, процедурам и функциям
* глобального контекста осуществляется непосредственно из любого программного
* модуля, используя их имена (без ссылки на какой-либо объект).
*
*
* @author Konovalov
*
*/
public class OCApp extends OCObject {
 
  /**
   * Экземпляр транзакции в текущей сессии.
   */
  private Transaction transaction = null;
 
  /**
   * Флаг использования подключения к файловой базе 1С.
   */
  private static final int CON_FILEBASED = 10;
 
  /**
   * Флаг использования подключения к серверной базе 1С.
   */
  private static final int CON_SERVERBASED = 15;
 
  /**
   * Тип подключения неопознан.
   */
  private static final int CON_UNKNOWN = 20;

  /**
   * Адрес DCOM сервера в сети (IP или hostname).
   */
  private String host = null;
 
  /**
   * Домен пользователя сервера DCOM.
   */
  private String domain = null;
 
  /**
   * Логин на DCOM-сервер.
   */
  private String login = null;
 
  /**
   * Пароль на DCOM-сервер.
   */
  private String password = null;

  private String dbpath = null;
  private String dbsrvr = null;
  private String dbref = null;

  /**
   * Тип соединения текущей сессии.
   */
  private int connectionType = CON_FILEBASED;
 
  /**
   * Пользователь 1С.
   */
  private String dbuser = null;
 
  /**
   * Пароль пользователя 1С.
   */
  private String dbpassword = null;

  /**
   * Текущая верия библиотеки.
   */
  public static final String VERSION = "0.5.4";

  /**
   * Логгер.
   */
  private static final transient Log LOG = LogFactory.getLog(OCApp.class);

  private static InstancePool instancesStorage = null;

  /**
   * Экземплят корневого объекта сессии. DISPATCH этого объекта == DISPATCH
   * OCApp
   */
  private final ComApp pComApp = new ComApp();
 
  /**
   * Драйвер определяющий поведение приложения для конкретной версии 1С.
   */
  private ApplicationDriver driver = null;

  static {
    // use simple as a default storage
    instancesStorage = new SimpleInstancePool();
  }

  /**
   * Создание нового объекта (экземпляра) контекста 1С. (соединение не
   * произодится @see connect).
   *
   * @return новый OCApp
   */
  public static OCApp getNewInstance() {
    return new OCApp();
  }

  /**
   * Метод делигат для InstanceStore.get .
   *
   * @param sessionCode - номер DCOM-сессии.
   * @return существующий экземпляр OCApp
   */
  public static OCApp getInstance(final int sessionCode) {
    return instancesStorage.get(sessionCode);
  }
 
  @SuppressWarnings("deprecation")
  protected OCApp() {
    // setup default driver
    driver = new DefaultApplicationDriver();
    driver.getVariantGUIDTable().setAppInstance(this);
  }

  // ===================================================================================

  /**
   * Откритие соединения с COM-сервером (не с 1С).
   * @param aServer - сетевой адрес сервера DCOM.
   * @param aUser - пользователь DCOM.
   * @param aPassword - пароль пользователя DCOM.
   */
  private void open(final String aServer, final String aUser, final String aPassword)   throws JIException, SecurityException, IOException {
    open(aServer, aServer, aUser, aPassword);
  }
 
  /**
   * Откритие соединения с COM-сервером (не с 1С).
   * @param server - сетевой адрес сервера DCOM.
   * @param domain - домен пользователя DCOM сервера
   * @param user - пользователь DCOM.
   * @param aPassword - пароль пользователя DCOM.
   * @throws JIException
   * @throws SecurityException
   * @throws IOException
   */
  private void open(final String server, String domain, final String user, final String aPassword)   throws JIException, SecurityException, IOException {
    pComApp.setAutoRegistration(driver.getAutoRegistration());
    pComApp.open(server, domain, user, aPassword, driver.getcApplicationId(), driver.getcApplIdIsClsId());
    setDispatch(pComApp.dispatch());
    //int maxConnections = get("MaxConnections").getObjectAsUnsigned().getValue().intValue();
    //int poolCapacity = get("PoolCapacity").getObjectAsUnsigned().getValue().intValue();
  }

  /**
   * Установка GlobalTimeout.
   *
   * @param value
   *            время в миллисекундах
   */
  public final void setGlobalTimeout(final int value) {
    if (pComApp == null) {
      throw new IllegalStateException(
          "Connect to server first. Session isn't active");
    }
    pComApp.setGlobalTimeout(value);
  }

  /**
   * Получение общего таймуата.
   *
   * @return время в миллисекундах
   */
  public final int getGlobalTimeout() {
    if (pComApp == null) {
      throw new IllegalStateException(
          "Connect to server first. Session isn't active");
    }
    return pComApp.getGlobalTimeout();
  }

  /**
   * Полученике хранилища экземпляров.
   *
   * @return InstancePool
   */
  public static final InstancePool getInstancesStorage() {
    return instancesStorage;
  }

  /**
   * Установка специфического хранилища экземпляров.
   *
   * @param instancesStorage
   *            экземпляр реализации InstancePool
   */
  public static synchronized final void setInstancesStorage(InstancePool instancesStorage) {
    OCApp.instancesStorage = instancesStorage;
  }

  /**
   * Установка драйвера приложения. Версия драйвера должна соответствовать
   * подключаемой версии.
   *
   * @param driver - ApplicationDriver
   *            или null для default-драйвера
   */
  public final void setApplicationDriver(ApplicationDriver driver) {
    if (driver == null) {
      driver = new DefaultApplicationDriver();
    }
    this.driver = driver;
    // set instance to variable table
    this.driver.getVariantGUIDTable().setAppInstance(this);
  }
 
  /**
   * Получение статичных полей. Аналог варсетов и EActivator. Возможно
   * механизм варсетов будет depricated.
   *
   * @param qField
   *            полное имя константы (Например: DocumentPostingMode.Regular)
   * @return OCObject
   * @throws JIException - ошибка платформы или DCOM
   */
  public final StaticFieldInstance getStaticFields(final String qField)
                throws JIException {
    if (qField == null) {
      return null;
    }
    String[] split = qField.split("\\.");
    int deep = split.length;
    StaticFieldInstance res = new StaticFieldInstance(get(split[0]));
    for (int z = 1; z < deep; z++) {
      res = new StaticFieldInstance(res.get(split[z]));
    }
    res.setFieldName(qField);
    return res;
  }

  /**
   * Получение разборщика синонимов.
   * 
   * @return TypeSynonymParser
   */
  public final TypeSynonymParser getTypeSynonymParser() {
    return driver.getTypeSynonymParser();
  }
 
  /**
   * Получение фабрики Varset-ов.
   * @return VariantFactory
   */
  protected final VariantFactory getVariantFactory() {
    return driver.getVariantGUIDTable();
  }

  /**
   * Short path for getVariantFactory.findVarset .
   *
   * @param <T> тип возвращаемого объекта
   * (один из com.ipc.oce.varset.E*) расширяющих EActivator
   * @param name полное имя объекта, например (EEventLogLevel.INFORMATION)
   * @return Экземпляр варсета или null если объект не найден
   * @throws JIException ошибка DCOM.
   */
  public final <T extends EActivator> T findVarset(final String name)
      throws JIException {
    return getVariantFactory().findAndBindObject(name);
  }
 
  /**
   * Получение общего модуля.
   * @param moduleName - Имя общего модуля.
   * @return
   * @throws JIException
   */
  public OCCommonModule getCommonModule(String moduleName) throws JIException {
    return new OCCommonModule(get(moduleName));
  }
 
  /**
   * Осуществляет поиск всех помеченных на удаление объектов. Примечаение:
   * весьма медленный метод.
   *
   * @return Массив со списком ссылок помеченных на удаление объектов
   * @throws JIException
   */
  public OCArray findMarkedForDeletion() throws JIException {
    return new OCArray(callMethodA("FindMarkedForDeletion"));
  }

  /**
   * Предоставляем NamespaceContext для EventLog xml.
   *
   * @return
   */
  public final NamespaceContext getNamespaceContext() {
    return driver.getNamespaceContext();
  }

  private void close() throws JIException {
    pComApp.close();
  }

  /**
   * Вызов конструктора по умолчанию.
   *
   * @param aName - имя объекта
   * @return IJIDispatch
   * @throws JIException
   */
  protected IJIDispatch newObject(String aName) throws JIException {
    return newObject(aName, (JIVariant[]) null);
  }

  /**
   * Вызов конструктора с одним параметром.
   *
   * @param aName имя объекта.
   * @param variant аргументы конструктора
   * @return IJIDispatch
   * @throws JIException
   */
  protected IJIDispatch newObject(String aName, JIVariant variant)
      throws JIException {
    return newObject(aName, new JIVariant[] { variant });
  }

  /**
   * Вызов конструктора с параметрами.
   *
   * @param aName имя объекта
   * @param variant
   *            параметры конструктора. Если вызывается конструктор по
   *            умолчанию, то null
   * @return
   * @throws JIException
   */
  protected IJIDispatch newObject(String aName, JIVariant[] variant)
      throws JIException {
    if (variant == null) {
      variant = new JIVariant[0];
    }
    Object[] params = new Object[1 + variant.length];
    params[0] = new JIVariant(aName);
    for (int z = 0; z < variant.length; z++) {
      params[z + 1] = variant[z];
    }
    JIVariant[] obj = callMethodA("NewObject", params);
    return (obj.length == 0) ? null : ComApp.toDispatch(obj[0]);
  }

  /**
   * Создание нового объекта Запрос.
   *
   * @return
   * @throws JIException
   */
  public OCQuery newQuery() throws JIException {
    return new OCQuery(newObject("Query"));
  }

  /**
   * Создание нового объекта Запрос.
   *
   * @param query
   *            строка запроса
   * @return
   * @throws JIException
   */
  public OCQuery newQuery(String query) throws JIException {
    OCQuery queryObject = new OCQuery(newObject("Query"));
    queryObject.setText(query);
    return queryObject;
  }

  /**
   * Создание объекта структуры. Используется в запросах
   *
   * @return экземпляр структуры
   * @throws JIException
   */
  public OCStructure newStructure() throws JIException {
    return new OCStructure(newObject("Structure"));
  }
 
  /**
   * Создание нового списка значений.
   * @return OCValueList
   * @throws JIException
   */
  public OCValueList newValueList() throws JIException {
    return new OCValueList(newObject("ValueList"));
  }
 
  public OCValueTable newValueTable() throws JIException {
    return new OCValueTable(newObject("ValueTable"));
  }

  /**
   * Создание объекта массив.
   *
   * @return экземпляр массива
   * @throws JIException
   */
  public OCArray newArray() throws JIException {
    return new OCArray(newObject("Array"));
  }

  /**
   * Создание объекта массив.
   *
   * @param size
   *            - размер массива
   * @return экземпляр массива
   * @throws JIException
   */
  public OCArray newArray(int size) throws JIException {
    return new OCArray(newObject("Array", new JIVariant(size)));
  }

  /**
   * Создание нового объекта XMLWriter.
   *
   * @return экземпляр XMLWriter
   * @throws JIException
   */
  public OCXMLWriter newXMLWriter() throws JIException {
    return new OCXMLWriter(newObject("XMLWriter"));
  }
 
  /**
   * Получает тип данных XML, соответствующий переданному в качестве параметра
   * типу.
   *
   * @param type
   *            - Тип. Тип значения, для которого необходимо определить
   *            соответствующий XML тип.
   * @return OCXMLDataType
   * @throws JIException
   */
  public final OCXMLDataType getXMLType(OCType type) throws JIException {
    return new OCXMLDataType(callMethodA("XMLType", new JIVariant(ocObject2Dispatch(type)))[0]);
  }
 
  /**
   * Выполняет преобразование из строки, полученной из текста элемента или
   * значения атрибута XML, в значение в соответствии с указанным типом.
   * Выполняет действие обратное действию метода XMLСтрока.
   *
   * @param type
   *            - Тип, значение которого надо получить при преобразовании из
   *            строкового представления XML.
   * @param xmlString
   *            - Строка, содержащая строковое представление значения,
   *            полученное из XML.
   * @return Неопределено, Null, Булево, Число, Строка, Дата,
   *         УникальныйИдентификатор, ДвоичныеДанные, ХранилищеЗначения,
   *         значения перечислений, значения системных перечислений (ВидСчета,
   *         ВидДвиженияБухгалтерии, ВидДвиженияНакопления, ДопустимыйЗнак,
   *         ДопустимаяДлина, ЧастиДаты) или все ссылки на объекты базы
   *         данных.
   * @throws JIException
   */
  public final OCVariant getXMLValue(OCType type, String xmlString) throws JIException {
    return new OCVariant(callMethodA("XMLValue", new Object[]{new JIVariant(ocObject2Dispatch(type)), new JIVariant(xmlString)})[0]);
  }
 
  /**
   * Производит проверку возможности чтения из XML значения указанного типа.
   * Данный метод получает тип данных XML из объекта ЧтениеXML, а затем
   * пытается определить, имеется ли соответствующий тип 1С:Предприятия,
   * аналогично тому как это делает метод ПолучитьXMLТип.
   *
   * @param reader - Объект, через который производится чтение XML.
   * @return Истина - тип 1С:Предприятия существует; Ложь - в противном случае.
   * @throws JIException
   */
  public boolean canReadXML(OCXMLReader reader) throws JIException {
    return callMethodA("CanReadXML", new JIVariant(ocObject2Dispatch(reader)))[0].getObjectAsBoolean();
  }
 
  /**
   * Получает тип данных XML, соответствующий типу переданного в качестве
   * параметра значения.
   *
   * @param object
   *            - Произвольный. Значение, для типа которого нужно получить
   *            соответствующий тип данных XML.
   * @return ТипДанныхXML, Неопределено. Если тип данных XML, соответствующий
   *         типу переданного в качестве параметра значения определен, то
   *         метод возвращает тип данных XML. Если не определен, то метод
   *         возвращает Неопределено.
   * @throws JIException
   */
  public OCXMLDataType getXMLTypeOf(Object object) throws JIException {
    OCVariant var = new OCVariant(object);
    JIVariant jVar = callMethodA("XMLTypeOf", var.getJIVariant())[0];
    if (jVar.getType() != JIVariant.VT_EMPTY) {
      return new OCXMLDataType(jVar);
    } else {
      return null;
    }
  }
 
  /**
   * Получает XML представление значения для помещения в текст элемента или
   * значение атрибута XML. XML представление зависит от типа значения.
   *
   * @param object
   *            - Null, Булево, Число, Строка, Дата, УникальныйИдентификатор,
   *            ДвоичныеДанные, ХранилищеЗначения, значения перечислений,
   *            значения системных перечислений (ВидСчета,
   *            ВидДвиженияБухгалтерии, ВидДвиженияНакопления, ДопустимыйЗнак,
   *            ДопустимаяДлина, ЧастиДаты) или все ссылки на объекты базы
   *            данных. Значение, для которого должно быть получено строковое
   *            представление, которое может быть использовано как текст
   *            элемента или значение атрибута XML.
   * @return String
   * @throws JIException ошибка DCOM
   */
  public final String getXMLString(final Object object) throws JIException {
    JIVariant arg = null;
    if (object instanceof OCObject) {
      arg = new JIVariant(ocObject2Dispatch((OCObject) object));
    } else {
      arg = JIVariant.makeVariant(object);
    }
    return callMethodA("XMLString", arg)[0].getObjectAsString2();
  }
 
  /**
   * Возвращает тип, соответствующий типу данных XML.
   * @param xmlDataType - Тип XML, для которого нужно получить соответствующий тип.
   * @return Тип, Неопределено. Неопределено, если соответствующий тип данных не обнаружен.
   * @throws JIException
   */
  public OCType fromXMLType(OCXMLDataType xmlDataType) throws JIException {
    JIVariant var = callMethodA("FromXMLType", new JIVariant(ocObject2Dispatch(xmlDataType)))[0];
    if (var.getType() != JIVariant.VT_EMPTY) {
      return new OCType(var);
    } else {
      return null;
    }
  }
 
  /**
   * Получает тип, соответствующий типу данных XML.
   * @param xmlTypeName - Имя типа XML.
   * @param namespace - URI пространства имен типа XML.
   * @return Тип, Неопределено. Неопределено, если соответствующий тип данных не обнаружен.
   * @throws JIException
   */
  public OCType fromXMLType(String xmlTypeName, String namespace) throws JIException {
    JIVariant var = callMethodA("FromXMLType", new Object[]{new JIVariant(xmlTypeName), new JIVariant(namespace)})[0];
    if (var.getType() != JIVariant.VT_EMPTY) {
      return new OCType(var);
    } else {
      return null;
    }
  }
 
 
  /**
   * Создание нового TypeDescription по имени.
   * @param name - имя типа.
   * @return OCTypeDescription
   * @throws JIException
   */
  public OCTypeDescription newTypeDescription(String name) throws JIException {
    return new OCTypeDescription(newObject("TypeDescription", new JIVariant(name)));
  }
 
  /**
   * Short path for newTypeDescription(typeName).getType().
   * @param typeName - имя типа.
   * @return OCType
   * @throws JIException
   */
  public OCType newType(String typeName) throws JIException {
    return newTypeDescription(typeName).getType();
  }

  /**
   * Создание нового XMLReader.
   *
   * @return экземпляр XMLReader
   * @throws JIException - ошибка DCOM.
   */
  public final OCXMLReader newXMLReader() throws JIException {
    return new OCXMLReader(newObject("XMLReader"));
  }

  /**
   * Создание нового TextReader.
   *
   * @return OCTextReader
   * @throws JIException - ошибка DCOM.
   */
  public final OCTextReader newTextReader() throws JIException {
    return new OCTextReader(newObject("TextReader"));
  }
 
  /**
   * Создает объект и помещает в него двоичные данные, взятые из файла.
   * @param fileName - Имя файла, из которого будет загружено значение в виде двоичных данных
   * @return OCBinaryData
   * @throws JIException
   */
  public final OCBinaryData newBinaryData(String fileName) throws JIException {
    OCBinaryData bd = null;
    bd = new OCBinaryData(newObject("BinaryData", new JIVariant(fileName)));
    bd.setFileName(fileName);
    return bd;
  }

  /**
   * Создает сериализатор значений 8.1 в XML на основе XDTO.
   *
   * @param factory
   *            OCXDTOFactory
   * @return OCXDTOSerializer
   * @throws JIException - ошибка DCOM.
   */
  public final OCXDTOSerializer newXDTOSerialezer(final OCXDTOFactory factory)
      throws JIException {
    return new OCXDTOSerializer(newObject("XDTOSerializer", new JIVariant(
        ocObject2Dispatch(factory))));
  }

  /**
   * Создает новый XMLSchemaBuilder.
   *
   * @return OCXMLSchemaBuilder
   * @throws JIException - ошибка DCOM.
   */
  public final OCXMLSchemaBuilder newXMLSchemaBuilder() throws JIException {
    return new OCXMLSchemaBuilder(newObject("XMLSchemaBuilder"));
  }

  /**
   * Создает новый экземпляр OCDOMBuilder.
   *
   * @return OCDOMBuilder
   * @throws JIException - ошибка DCOM.
   */
  public final OCDOMBuilder newDOMBuilder() throws JIException {
    return new OCDOMBuilder(newObject("DOMBuilder"));
  }

  /**
   * Создает новый экземпляр OCDOMWriter.
   *
   * @return OCDOMWriter
   * @throws JIException - ошибка DCOM.
   */
  public final OCDOMWriter newDOMWriter() throws JIException {
    return new OCDOMWriter(newObject("DOMWriter"));
  }

  /**
   * Создает фабрику типов XDTO по набору схем XML.
   *
   * @param schemaSet
   *            Набор схем XML, на основе которого будет создана фабрика XDTO
   * @param packageCollection
   *            Коллекция пакетов XDTO, которые необходимо добавить в фабрику
   *            XDTO. Если в наборе схем присутствует схема с URI пространства
   *            имен, соответствующему пакету XDTO из коллекции пакетов, то
   *            будет использован имеющийся пакет, а не создан новый
   * @return OCXDTOFactory
   * @throws JIException - ошибка DCOM.
   */
  public final OCXDTOFactory newXDTOFactory(final OCXMLSchemaSet schemaSet,
      final OCXDTOPackageCollection packageCollection) throws JIException {
    return new OCXDTOFactory(newObject("XDTOFactory", new JIVariant[] {
        new JIVariant(ocObject2Dispatch(schemaSet)),
        new JIVariant(ocObject2Dispatch(packageCollection)) }));
  }

  /**
   * Создание фабрики XDTO по имени файла схемы XML.
   *
   * @param path
   *            Строка, представляющая собой путь к файлу, содержащему XML
   *            схему
   * @return OCXDTOFactory
   * @throws JIException - ошибка DCOM.
   */
  public final OCXDTOFactory createXDTOFactory(String path) throws JIException {
    return new OCXDTOFactory(callMethodA("CreateXDTOFactory",
        new Object[] { new JIVariant(path) })[0]);
  }

  /**
   * Создание фабрики XDTO по массиву переданных имен.
   *
   * @param paths
   *            Массив путей к XML схемам, на основании которых необходимо
   *            создать фабрику XDTO
   * @return OCXDTOFactory
   * @throws JIException - ошибка DCOM.
   */
  public final OCXDTOFactory createXDTOFactory(OCArray paths) throws JIException {
    return new OCXDTOFactory(callMethodA("CreateXDTOFactory",
        new Object[] { ocObject2Dispatch(paths) })[0]);
  }

  /**
   * Создает фабрику типов XDTO по набору схем XML.
   *
   * @param schemaSet
   *            Набор схем XML, на основе которого будет создана фабрика XDTO
   * @return OCXDTOFactory
   * @throws JIException - ошибка DCOM.
   */
  public final OCXDTOFactory newXDTOFactory(final OCXMLSchemaSet schemaSet)
      throws JIException {
    return new OCXDTOFactory(
        newObject("XDTOFactory", new JIVariant[] { new JIVariant(
            ocObject2Dispatch(schemaSet)) }));
  }

  /**
   * Новый НаборСхемXML.
   *
   * @return OCXMLSchemaSet
   * @throws JIException - ошибка DCOM.
   */
  public final OCXMLSchemaSet newXMLSchemaSet() throws JIException {
    return new OCXMLSchemaSet(newObject("XMLSchemaSet"));
  }

  /**
   * Создает уникальный идентификатор из указанной строки GUID. Уникальность
   * полученного таким образом идентификатора определяется уникальностью
   * строки и поэтому не гарантирована.
   *
   * @param uuid
   *            Строка GUID. Строка задается в виде
   *            "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где Х - символы
   *            обозначающие шестнадцатеричное число.
   * @return OCUUID
   * @throws JIException - ошибка DCOM.
   */
  public final OCUUID createUUID(final String uuid) throws JIException {
    OCUUID ocUUID = new OCUUID(newObject("UUID", new JIVariant(uuid)));
    return ocUUID;
  }

  /**
   * Создает новый UUID средствами 1с.
   *
   * @return UUID
   * @throws JIException - ошибка DCOM.
   */
  public final OCUUID createUUID() throws JIException {
    return new OCUUID(newObject("UUID"));
  }

  /**
   * Создание нового случайного UUID средствами Java.
   *
   * @return String
   */
  public final String createUUID2() {
    return UUID.randomUUID().toString();
  }

  /**
   * Считывает значение в формате XML. Прочитаны могут быть значения тех
   * типов, которые могут быть записаны методом ЗаписатьXML.
   *
   * @param reader
   *            Объект, через который происходит чтение XML.
   * @return Значение считанного типа
   * @throws JIException - ошибка DCOM.
   */
  public final OCObject readXML(final OCXMLReader reader) throws JIException {
    return new OCObject(callMethodA("ReadXML",
        new Object[] { reader.dispatch() })[0]);
  }

  /**
   * Записывает значения в формате XML без указания имени элемента. В качестве
   * имени элемента будет использован тип значения
   *
   * @param writer
   *            Объект, через который осуществляется запись XML
   * @param object
   *            Записываемое в поток XML значение. Тип параметра определяется
   *            совокупностью типов, для которых определена XML-сериализация
   * @throws JIException - ошибка DCOM.
   */
  public final void writeXML(final OCXMLWriter writer, final OCObject object)
      throws JIException {
    callMethod("WriteXML",
        new Object[] { new JIVariant(ocObject2Dispatch(writer)),
            new JIVariant(object.dispatch()) });
  }

  /**
   * Записывает значения в формате XML с указанием полного имени элемента.
   *
   * @param writer
   *            Объект, через который осуществляется запись XML.
   * @param object
   *            Записываемое в поток XML значение. Тип параметра определяется
   *            совокупностью типов, для которых определена XML-сериализация.
   * @param fullName
   *            Полное имя элемента XML, в который будет записано значение.
   * @throws JIException - ошибка DCOM.
   */
  public final void writeXML(final OCXMLWriter writer, final OCObject object, final String fullName)
      throws JIException {
    callMethod("WriteXML",
        new Object[] { new JIVariant(ocObject2Dispatch(writer)),
            new JIVariant(object.dispatch()),
            new JIVariant(fullName) });
  }

  /**
   * Записывает значения в формате XML с указанием локального имени элемента и
   * пространства имен, к которому принадлежит локальное имя.
   *
   * @param writer
   *            Объект, через который осуществляется запись XML.
   * @param object
   *            Записываемое в поток XML значение. Тип параметра определяется
   *            совокупностью типов, для которых определена XML-сериализация.
   * @param localName
   *            Локальное имя элемента XML, в который будет записано значение.
   * @param namespace
   *            URI пространства имен, к которому принадлежит указанное
   *            локальное имя.
   * @throws JIException - ошибка DCOM.
   */
  public final void writeXML(final OCXMLWriter writer, final OCObject object,
      final String localName, final String namespace) throws JIException {
    callMethod("WriteXML",
        new Object[] { new JIVariant(ocObject2Dispatch(writer)),
            new JIVariant(object.dispatch()),
            new JIVariant(localName), new JIVariant(namespace) });
  }

  /**
   * Позволяет выгрузить журнал регистрации в XML формате. Существует
   * возможность установить фильтр, задаваемый структурой специального
   * формата, указывающий, какие записи журнала регистрации выгружать, а также
   * указать колонки, которые необходимо выгружать. Если указано имя входного
   * файла, то происходит выгрузка из указанного файла.
   *
   * @param outputFileName -
   *            Строка, содержащая имя выходного XML файла.
   * @param filter - Структура фильтра журнала регистрации
   *        ДатаНачала/StartDate - Дата, Значение по умолчанию Неопределено;
   *        ДатаОкончания/EndDate - Дата, Значение по умолчанию Неопределено;
   *        Уровень/Level - Перечисление или массив перечислений, Значение по
   *        умолчанию Неопределено; ИмяПриложения/ApplicationName - Строка или
   *        массив строк, Значение по умолчанию Неопределено;
   *        Пользователь/User - ПользовательИнформационнойБазы или массив
   *        таких объектов, или Строка. Объект ПользовательИнформационнойБазы
   *        и массив таких объектов можно получить из объекта
   *        МенеджерПользователейИнформационнойБазы. Также можно задавать
   *        пользователя по имени (строкой). Причем, пользователей, которые
   *        были удалены из ИБ можно задавать только таким способом. Пустая
   *        строка означает "пользователя по умолчанию", который используется,
   *        когда в информационной базе нет ни одного пользователя (от имени
   *        такого пользователя работают также фоновые задания). Если в
   *        фильтре задается массив пользователей, то можно перемешивать в нем
   *        значения обоих типов - строка и ПользовательИнформационнойБазы.
   *        Значение по умолчанию Неопределено; Компьютер/Computer - Строка
   *        или массив строк, Значение по умолчанию Неопределено;
   *        Событие/Event - Строка или массив строк, Значение по умолчанию
   *        Неопределено. Допустимые имена событий: _$Session$_.Start - Сеанс.
   *        Начало; _$Session$_.Finish - Сеанс. Завершение;
   *        _$InfoBase$_.ConfigUpdate - Информационная база. Изменение
   *        конфигурации; _$InfoBase$_.DBConfigUpdate - Информационная база.
   *        Изменение конфигурации базы данных;
   *        _$InfoBase$_.EventLogSettingsUpdate - Информационная база.
   *        Изменение параметров журнала регистрации;
   *        _$InfoBase$_.InfoBaseAdmParamsUpdate - Информационная база.
   *        Изменение параметров информационной базы;
   *        _$InfoBase$_.MasterNodeUpdate - Информационная база. Изменение
   *        главного узла; _$InfoBase$_.RegionalSettingsUpdate -
   *        Информационная база. Изменение региональных установок;
   *        _$InfoBase$_.TARInfo - Тестирование и исправление. Сообщение;
   *        _$InfoBase$_.TARMess - Тестирование и исправление. Предупреждение;
   *        _$InfoBase$_.TARImportant - Тестирование и исправление. Ошибка;
   *        _$Data$_.New - Данные. Добавление; _$Data$_.Update - Данные.
   *        Изменение; _$Data$_.Delete - Данные. Удаление;
   *        _$Data$_.TotalsPeriodUpdate - Данные. Изменение периода
   *        рассчитанных итогов; _$Data$_.Post - Данные. Проведение;
   *        _$Data$_.Unpost - Данные. Отмена проведения; _$User$_.New -
   *        Пользователи. Добавление; _$User$_.Update - Пользователи.
   *        Изменение; _$User$_.Delete - Пользователи. Удаление; _$Job$_.Start
   *        - Фоновое задание. Запуск; _$Job$_.Succeed - Фоновое задание.
   *        Успешное завершение; _$Job$_.Fail - Фоновое задание. Ошибка
   *        выполнения; _$Job$_.Cancel - Фоновое задание. Отмена;
   *        _$PerformError$_ - Ошибка выполнения; _$Transaction$_.Begin -
   *        Транзакция. Начало; _$Transaction$_.Commit - Транзакция. Фиксация;
   *        _$Transaction$_.Rollback - Транзакция. Отмена. Метаданные/Metadata
   *        - Объект описания метаданного или их массив, Значение по умолчанию
   *        Неопределено; Данные/Data - Значение, тип значения – ссылка на
   *        объект (СправочикСсылка и т.д.), Значение по умолчанию
   *        Неопределено; ПредставлениеДанных/DataPresentation - Строка;
   *        Комментарий/Comment - Строка; СтатусТранзакции/TransactionStatus -
   *        Перечисление или массив перечислений, значение по умолчанию
   *        Неопределено; Транзакция/TransactionID - Идентификатор транзакции.
   *        Строка; Соединение/Connection - Номер соединения с информационной
   *        базой. Число или массив чисел, значение по умолчанию Неопределено;
   *        РабочийСервер/ServerName - Строка или массив строк, значение по
   *        умолчанию Неопределено; ОсновнойIPПорт/Port - Номер основного IP
   *        порт рабочего процесса. Число или массив чисел, значение по
   *        умолчанию Неопределено; ВспомогательныйIPПорт/SyncPort - Номер
   *        вспомогательного IP порта рабочего процесса. Число или массив
   *        чисел, значение по умолчанию Неопределено.
   * @param columns - Для выгрузки в XML формате доступны следующие колонки:
   *        Уровень/Level Дата/Date Пользователь/User Компьютер/Computer
   *        ИмяПриложения/ApplicationName Событие/Event Комментарий/Comment
   *        Метаданные/Metadata Данные/Data
   *        ПредставлениеДанных/DataPresentation ИмяПользователя/UserName
   *        ПредставлениеПриложения/ApplicationPresentation
   *        ПредставлениеСобытия/EventPresentation
   *        ПредставлениеМетаданных/MetadataPresentation
   *        СтатусТранзакции/TransactionStatus Транзакция/TransactionID
   *        Соединение/Connection РабочийСервер/ServerName ОсновнойIPПорт/Port
   *        ВспомогательныйIPПорт/SyncPort Для того, чтобы выгрузить
   *        определенные колонки журнала регистрации необходимо перечислить их
   *        имена, при этом необходимо имя каждой колонки отделять запятой.
   * @param inputFileName - Строка, содержащая имя входного файла. В качестве
   *        входного файла следует задавать ELF-файл. Это либо файл,
   *        полученный при сохранении просматриваемого журнала регистрации в
   *        файл (команда "Файл - Сохранить..."), либо файл 1Cv8.elf,
   *        являющийся основным файлом журнала регистрации. В том же каталоге
   *        могут находиться и относящиеся к нему LOG-файлы, в зависимости от
   *        того, было ли установлено разделение по периодам.
   * @throws JIException - ошибка DCOM.
   */
  public final void unloadEventLog(final String outputFileName, final OCStructure filter, final String columns, final String inputFileName) throws JIException {
    callMethod("UnloadEventLog", new Object[] {
        new JIVariant(outputFileName),
        (filter != null ? new JIVariant(filter.dispatch()) : null),
        new JIVariant(columns), new JIVariant(inputFileName) });
  }

  /**
   * Получение метаданных конфигурации.
   *
   * @return OCConfigurationMetadataObject
   * @throws JIException
   *             - ошибка работы в DCOM
   */
  public final OCConfigurationMetadataObject getMetadata()
  throws JIException {
    return new OCConfigurationMetadataObject(get("Metadata"));
  }

  /**
   * Выполнение соединения с серверной конфигурацией 1С.
   *
   * @param aComServer
   *            - адрес DCOM-сервера
   * @param aComUser
   *            - логин к DCOM-серверу
   * @param aComPassword
   *            - пароль для aComUser
   * @param srvr
   *            - имя сервера 1С
   * @param ref
   *            - ссылка на базу 1С
   * @param aOCUser
   *            - пользователь 1С
   * @param aOCPassword
   *            - пароль пользователя 1С
   * @return номер сессии DCOM
   * @throws JIException
   *             - ошибка работы с DCOM
   * @throws IOException
   *             - IO
   */
  private int connect2Serverbased(final String aComServer,
      final String aDomain, final String aComUser, final String aComPassword,
      final String srvr, final String ref, final String aOCUser,
      final String aOCPassword) throws JIException, IOException {
    long s = System.currentTimeMillis();
    // save settings
    host = aComServer;
    domain = aDomain != null ? aDomain : aComServer;
    login = aComUser;
    password = aComPassword;
    dbsrvr = srvr;
    dbref = ref;
    dbuser = aOCUser != null ? aOCUser : "";
    dbpassword = aOCPassword != null ? aOCPassword : "";
    connectionType = CON_SERVERBASED;

    open(host, domain, login, password);

    JIString conStr = new JIString("Srvr=\"" + dbsrvr + "\";Ref=\"" + dbref
        + "\";Usr=\"" + aOCUser + "\";Pwd=\"" + aOCPassword + "\"");
    JIVariant[] var = callMethodA("Connect", new Object[] { conStr });
    IJIDispatch disp = ComApp.toDispatch(var[0]);
    setDispatch(disp);

    instancesStorage.put(getAssociatedSessionID(), this);
    LOG.info("OCTitbit version " + VERSION);
    LOG.info("Application " + getAssociatedSessionID() + " connected in "
        + (System.currentTimeMillis() - s) + "ms");

    return getAssociatedSessionID();
  }

  /**
   * Соединение с сервером 1С.
   *
   * @param aComServer
   *            - адрес COM-сенрвера
   * @param aComUser
   *            - имя пользователь COM
   * @param aComPassword
   *            - пароль пользователя COM
   * @param aDBFile
   *            - адрес файла с базой 1С
   * @param aOCUser
   *            - имя пользователя 1С, то которого будет производится
   *            подключение к 1с
   * @param aOCPassword
   *            - пароль пользователя 1С
   * @return номер COM-сессии
   * @throws SecurityException
   * @throws JIException
   *             - ошибка работы с DCOM
   * @throws IOException
   *             - IO
   */
  private int connect2Filebased(final String aComServer,
      final String aDomain, final String aComUser, final String aComPassword,
      final String aDBFile, final String aOCUser, final String aOCPassword)
      throws JIException, IOException {
    long s = System.currentTimeMillis();
    // save settings
    host = aComServer;
    domain = aDomain != null ? aDomain : aComServer;
    login = aComUser;
    password = aComPassword;
    dbpath = aDBFile;
    dbuser = aOCUser != null ? aOCUser : "";
    dbpassword = aOCPassword != null ? aOCPassword : "";
    connectionType = CON_FILEBASED;
   
    // Connect to DCOM-server (computer)
    open(host, domain, login, password);

    // Connect to application
    // JIString conStr = new JIString("File=\"" + aDBFile + "\";Usr=\"" +
    // aOCUser + "\";Pwd=\"" + aOCPassword + "\"");

    String connectionStr = "File=\"" + aDBFile + "\";Usr=\"" + aOCUser + "\";Pwd=\"" + aOCPassword + "\"";
    //String connectionStr = "File=" + aDBFile + ";Usr=" + aOCUser + ";Pwd=" + aOCPassword + "";

    JIString jconStr = new JIString(connectionStr);

    // System.out.println("***7");
    // FIX for V81.Connector ???
    JIVariant[] var = callMethodA("Connect", new Object[]{jconStr});
   
    //System.out.println("***8");
   
    IJIDispatch disp = ComApp.toDispatch(var[0]);
    setDispatch(disp);

    // ---- registration is starage ----
    instancesStorage.put(getAssociatedSessionID(), this);
    LOG.info("OCTitbit v" + VERSION);
    LOG.info("Application '" + getAssociatedSessionID() + "' connected in "
        + (System.currentTimeMillis() - s) + "ms");

    return getAssociatedSessionID();
  }

  /**
   * Выполнение соединения с 1С. Настроейка производится в соответствии с
   * PropertieReader-ом и именем конфигурации в файле properties
   *
   * @param reader
   * @param configurationName
   *            имя конфигурации
   * @return номер COM-сессии
   * @throws SecurityException
   * @throws JIException
   * @throws IOException
   * @throws ConfigurationException
   */
  public int connect(PropertiesReader reader, String configurationName)
      throws JIException, IOException, ConfigurationException {
    Properties tmp = reader.getPropertiesForInstance(configurationName);

    return connect(tmp);
  }
 
  /**
   * Выполнение соединения с 1С. Настроейка производится в соответствии с
   * PropertieReader-ом и именем конфигурации в файле properties
   *
   * @param reader
   *            - PropertiesReader
   * @param altConfigs
   *            - массив имен конфигураций, который будут циклично
   *            подставлятся пока не будет осуществлено подключение.
   * @return номер COM-сессии
   * @throws SecurityException
   * @throws JIException
   * @throws IOException
   * @throws ConfigurationException
   */
  public int connect(PropertiesReader reader, String[] altConfigs) throws ConfigurationException, JIException, IOException {
   
    ConfigurationException ce = null;
    JIException je = null;
    IOException ie = null;
   
    for (String configurationName : altConfigs) {
      try {
        Properties tmp = reader.getPropertiesForInstance(configurationName);
        return connect(tmp);
      } catch (ConfigurationException ce1) {
        ce = ce1;
      } catch (JIException je1) {
        je = je1;
      } catch (IOException ie1) {
        ie = ie1;
      }
    }
   
    if (ce != null) {
      throw ce;
    }
   
    if (je != null) {
      throw je;
    }
   
    if (ie != null) {
      throw ie;
    }
    return -1;
  }
 
  /**
   * Соединение с 1С.
   *
   * @param properties
   *            используется именование ключей из PropertiesReader (например
   *            PropertiesReader.OCE_CFG_HOST)
   * @return идентификатор сессии
   * @throws SecurityException
   * @throws JIException
   * @throws IOException
   *             - ошибка чтения файла настроек
   * @see PropertiesReader
   */
  public final int connect(final Properties properties) throws JIException,
      IOException {
    int conType = determinateConnectionType(properties);
    int sessNumber = -1;
    switch (conType) {
    case CON_FILEBASED:
      sessNumber = connect2Filebased(
          properties.getProperty(PropertiesReader.OCE_CFG_HOST),
          properties.getProperty(PropertiesReader.OCE_CFG_DOMAIN),
          properties.getProperty(PropertiesReader.OCE_CFG_HOST_USER),
          properties
              .getProperty(PropertiesReader.OCE_CFG_HOST_PASSWORD),
          properties.getProperty(PropertiesReader.OCE_CFG_1CDB_PATH),
          properties.getProperty(PropertiesReader.OCE_CFG_1CDB_USER),
          properties
              .getProperty(PropertiesReader.OCE_CFG_1CDB_PASSWORD));
      break;

    case CON_SERVERBASED:
      sessNumber = connect2Serverbased(
          properties.getProperty(PropertiesReader.OCE_CFG_HOST),
          properties.getProperty(PropertiesReader.OCE_CFG_DOMAIN),
          properties.getProperty(PropertiesReader.OCE_CFG_HOST_USER),
          properties
              .getProperty(PropertiesReader.OCE_CFG_HOST_PASSWORD),
          properties.getProperty(PropertiesReader.OCE_CFG_1CSRVR),
          properties.getProperty(PropertiesReader.OCE_CFG_1CREF),
          properties.getProperty(PropertiesReader.OCE_CFG_1CDB_USER),
          properties
              .getProperty(PropertiesReader.OCE_CFG_1CDB_PASSWORD));
      break;

    default:
      throw new IOException("Connection type unknown. "
          + "Use or filebased config or serverbased");
    }
   
    driver.getVariantGUIDTable().activate();
    driver.getTypeSynonymParser().attachAppInstance(this);
   
    return sessNumber;
   
  }

  /**
   * Определение типа подключения (Filebased или Serverbased).
   *
   * @param prp
   *            - перечерь всех настроек подключения
   * @return тип подключения: CON_FILEBASED, CON_SERVERBASED или CON_UNKNOWN
   */
  private static int determinateConnectionType(final Properties prp) {
    if (prp.getProperty(PropertiesReader.OCE_CFG_1CDB_PATH) != null) {
      return CON_FILEBASED;
    } else if (prp.getProperty(PropertiesReader.OCE_CFG_1CSRVR) != null
        && prp.getProperty(PropertiesReader.OCE_CFG_1CREF) != null) {
      return CON_SERVERBASED;
    } else {
      return CON_UNKNOWN;
    }
  }

  /**
   * Повторное подключение с параметрами заданными в метода connect. (При этом
   * выполняется попытка закрытия - exit())
   *
   * @return
   * @throws SecurityException
   * @throws JIException
   * @throws IOException
   */
  public int reconnect() throws JIException, IOException {
    try {
      exit();
    } catch (Throwable t) {
     
    }
    if (connectionType == CON_FILEBASED) {
      return connect2Filebased(host, domain, login, password, dbpath, dbuser,
          dbpassword);
    } else {
      return connect2Serverbased(host, domain, login, password, dbsrvr, dbref,
          dbuser, dbpassword);
    }
  }

  /**
   * Ping экземпляра.
   *
   * @return true экземпляр подключен, false - соединение разорвано
   */
  public boolean ping() {
    boolean res = false;
    try {
      getComputerName();
      res = true;
    } catch (Throwable tr) {

    }
    return res;
  }
 
  /**
   * Получает номер текущего соединения с информационной базой.
   * @return
   * @throws JIException
   */
  public int getInfoBaseConnectionNumber() throws JIException {
    return callMethodA("InfoBaseConnectionNumber").getObjectAsInt();
  }

  /**
   * Создание нового экземпляра транзации.
   *
   * @return
   * @throws JIException
   */
  public Transaction createTransaction() throws JIException {
    if (transaction != null && transaction.inTransaction()) {
      throw new IllegalStateException(
          "Can't create new transaction because transaction already started. Commit or rollback first");
    } else {
      transaction = new Transaction(this);
      return transaction;
    }

  }

  /**
   * Получение количества свободных слотов для экземпляров OCApp.
   *
   * @return int количество свободный слотов соединений.
   */
  public static int unoccupiedInstancesSlot() {
    return instancesStorage.getMaximumInstances() - instancesStorage.size();
  }

  /**
   * Закрытие DCOM сессии.
   *
   * @throws JIException
   */
  public void exit() throws JIException {
    // works only for V81.Application
    // dispatch().callMethod("Exit", new Object[]{new
    // JIVariant(Boolean.FALSE)});
    if (transaction != null && transaction.inTransaction()) {
      transaction.rollback();
    }
    close();
    instancesStorage.remove(getAssociatedSessionID());
  }

  /**
   * Получает системное строковое представление переданного значения.
   *
   * @param variant OCObject
   *            variant
   * @return java.langString. Системное представление значения в
   *         информационной базе.
   * @throws JIException
   */
  public String valueToStringInternal(OCObject variant) throws JIException {
    return valueToStringInternal(variant.dispatch());
  }

  /**
   * Получает системное строковое представление переданного значения.
   *
   * @param dispatch
   * @return java.langString. Системное представление значения в
   *         информационной базе.
   * @throws JIException
   */
  protected String valueToStringInternal(IJIDispatch dispatch)
      throws JIException {
    return (callMethodA("ValueToStringInternal", new Object[] { dispatch })[0]
        .getObjectAsString2());
  }

  /**
   * Получает системное строковое представление переданного значения.
   *
   * @param variant
   * @return java.langString. Системное представление значения в
   *         информационной базе.
   * @throws JIException
   */
  protected String valueToStringInternal(JIVariant variant)
      throws JIException {
    return (callMethodA("ValueToStringInternal", new Object[] { variant })[0]
        .getObjectAsString2());
  }

  /**
   * Преобразует значение из строкового системного представления во
   * внутреннее.
   *
   * @param s
   *            Системное представление значения в строковом виде.
   * @return Тип: Произвольный. Значение, полученное из строкового системного
   *         представления.
   * @throws JIException
   */
  public OCObject valueFromStringInternal(String s) throws JIException {
    JIVariant var = new JIVariant(s);
    return new OCObject(callMethodA("ValueFromStringInternal",
        new Object[] { var })[0]);
  }

  /**
   * Получает строковое представление значения произвольного типа.
   *
   * @param variant
   *            Выражение произвольного типа.
   * @return
   * @throws JIException
   */
  public String string(OCObject variant) throws JIException {
    JIVariant v = callMethodA("String", new Object[] { variant.dispatch() })[0];
    return (v.getType() != JIVariant.VT_EMPTY ? v.getObjectAsString2() : "");
  }
 
  /**
   * Получает из строки закодированной по алгоритму base64 двоичные данные.
   * @param data - Строка, закодированная по алгоритму base64.
   * @return OCBinaryData
   * @throws JIException
   */
  public OCBinaryData base64Value(String data) throws JIException {
    return new OCBinaryData(callMethodA("Base64Value", new JIVariant(data))[0]);
  }
 
  /**
   * Получает строку, закодированную по алгоритму base64.
   * @param data - Двоичные данные, которые необходимо закодировать по алгоритму base64.
   * @return
   * @throws JIException
   */
  public String base64String(OCBinaryData data) throws JIException {
    return callMethodA("Base64String", new JIVariant(ocObject2Dispatch(data)))[0].getObjectAsString2();
  }

    /**
     * Определяет установку права доступа к объекту метаданных для текущего пользователя
     * @param right Перечисление AccessRight, роль 1С
     * @param metadataObject Объект метаданных
     * @param roleOrInfobaseUser Указывает пользователя или роль, для которых нужно определить доступность права.
     *                           При этом возвращается значение права так, как оно определено в конфигурации
     * @param standardAttributeStandardTabularSection Необязательное имя стандартного реквизита, имя стандартного реквизита
     *                                                стандартной табличной части или имя стандартной табличной части.
     *                                                Для стандартного реквизита стандартной табличной части, имя табличной части
     *                                                указывается перед точкой до имени реквизита. Например: "ВидыСубконто.ВидСубконто".
     * @return Истина - есть право доступа. Ложь - нет права доступа
     * @throws JIException
     */
    public Boolean accessRight(AccessRight right, _OCCommonMetadataObject metadataObject,
                               OCObject roleOrInfobaseUser, String standardAttributeStandardTabularSection) throws JIException {
        // Validation
        if (right == null) throw new IllegalArgumentException("Wrong [right] parameter - can't be null");
        if (metadataObject == null) throw new IllegalArgumentException("Wrong [metadataObject] parameter - can't be null");
        if (roleOrInfobaseUser != null && !(roleOrInfobaseUser instanceof OCInfoBaseUser || roleOrInfobaseUser instanceof OCRoleMetadataObject)) {
            throw new IllegalArgumentException("Wrong [roleOrInfobaseUser] parameter - correct type must be used: OCInfoBaseUser or OCRoleMetadataObject");
        }

        Object[] callParams = new Object[]{
                new JIVariant(right.name()),
                new JIVariant(ocObject2Dispatch(metadataObject)),
                new JIVariant(roleOrInfobaseUser != null ? roleOrInfobaseUser.dispatch() : null),
                JIVariant.makeVariant(standardAttributeStandardTabularSection)};
        return callMethodA("AccessRight", callParams)[0].getObjectAsBoolean();
    }

  /**
   * Сетевое имя компьютера.
   *
   * @return
   * @throws JIException
   */
  public String getComputerName() throws JIException {
    return callMethodA("ComputerName").getObjectAsString2();
  }

  /**
   * Получает имя пользователя, указанного при запуске программы.
   *
   * @return
   * @throws JIException
   */
  public String getUserName() throws JIException {
    return callMethodA("UserName").getObjectAsString2();
  }
 
  /**
   * Получает полное имя пользователя, указанного при запуске программы.
   * @return
   * @throws JIException
   */
  public String getUserFullName() throws JIException {
    return callMethodA("UserFullName").getObjectAsString2();
  }

  /**
   * @deprecated Вызывает на исполнение команду операционной системы, как если
   *             бы она была введена в командной строке. Недоступен на сервере
   *             1С:Предприятие. Не используется в модуле внешнего соединения.
   * @param command
   *            Команда системы.
   * @param currentCatalog
   *            Устанавливает текущий каталог на время выполнения команды.
   * @throws JIException
   *//*
  public void system(String command, String currentCatalog)
      throws JIException {
    callMethodA("System", new Object[] { JIVariant.makeVariant(command),
        JIVariant.makeVariant(currentCatalog) });
  }*/

  /**
   * Определяет, была ли изменена конфигурация базы данных динамически после
   * старта. Под динамическим изменением понимается такое изменение
   * конфигурации базы данных, при которой не потребовалось проведение
   * реструктуризации, и в момент обновления с информационной базой работали
   * пользователи.
   *
   * @return Истина - в процессе работы пользователя с информационной базой
   *         произошло обновление конфигурации базы данных, Ложь - в противном
   *         случае.
   * @throws JIException
   */
  public Boolean isDataBaseConfigurationChangedDynamically()
      throws JIException {
    return callMethodA("DataBaseConfigurationChangedDynamically")
        .getObjectAsBoolean();
  }

  /**
   * Определяет, используется ли в данный момент монопольный режим работы с
   * информационной базой.
   *
   * @return Истина - используется монопольный режим; Ложь - в противном
   *         случае.
   * @throws JIException
   */
  public Boolean isExclusiveMode() throws JIException {
    return callMethodA("ExclusiveMode").getObjectAsBoolean();
  }

  /**
   * Получает код локализации (язык, страна), установленный для данной
   * информационной базы.
   *
   * @return
   * @throws JIException
   */
  public String getLocaleCode() throws JIException {
    return callMethodA("LocaleCode").getObjectAsString2();
  }

  /**
   * Удаляет указанные файлы.
   *
   * @param folder
   *            Путь к удаляемым файлам
   * @param fileMask
   *            Маска для выбора удаляемых файлов. В строке маски допускается
   *            использование символа "*" (звездочка), обозначающего любое
   *            число произвольных символов, и "?" (знак вопроса),
   *            обозначающего один произвольный символ. Если <Маска> не
   *            указана, то удаляются все файлы и каталог <Путь>.
   * @throws JIException
   */
  public void deleteFiles(String folder, String fileMask) throws JIException {
    if (fileMask != null) {
      callMethod("DeleteFiles", new Object[] { new JIVariant(folder),
          new JIVariant(fileMask) });
    } else {
      callMethod("DeleteFiles", new Object[] { new JIVariant(folder) });
    }
  }

  /**
   * Выполняет перемещение (переименование) указанного файла. Допускается
   * использование схем http, https и ftp для адресации файлов. При
   * использовании этих схем в адресах необходимо указывать прямые слеши '/',
   * а не обратные '\'.
   *
   * @param source
   * @param destination
   * @throws JIException
   */
  public void moveFile(String source, String destination) throws JIException {
    callMethod("MoveFile", new Object[] { new JIVariant(source),
        new JIVariant(destination) });
  }

  /**
   * Получает имя каталога, который используется программой 1C для размещения
   * временных файлов.
   *
   * @return
   * @throws JIException
   */
  public String getTempFilesDir() throws JIException {
    return callMethodA("TempFilesDir").getObjectAsString2();
  }

  /**
   * Получения любого заданного менеджера используя рефлексию по имени
   * объекта. Например: Document.СчетНаОплатуПокупателю (OCDocumentManager
   * documentManager = app.getManager("Document.СчетНаОплатуПокупателю");)
   *
   * @param <T>
   * @param fullName
   *            полное имя объекта (например: Document.СчетНаОплатуПокупателю)
   * @return типизированный менеджер (например OCDocumentManager)
   * @throws SecurityException
   * @throws NoSuchMethodException
   * @throws IllegalArgumentException
   * @throws IllegalAccessException
   * @throws InvocationTargetException
   */
  @SuppressWarnings("unchecked")
  public <T> T findManager(String fullName) throws SecurityException,
      NoSuchMethodException, IllegalArgumentException,
      IllegalAccessException, InvocationTargetException {
    String[] sdS = fullName.split("\\.");
    // find getter
    Method method = getClass().getMethod(
        "get" + ObjectNameDecoder.ru2En(sdS[0]) + "Manager",
        String.class);
    Object o = method.invoke(this, sdS[1]);
    return (T) o;
  }

  /**
   * Экспериментальный метод поиска data-объектов. Внимание: класс менеджера
   * объекта должен поддерживать метод getRef. Метод может применятся для
   * поиска документов, каталогов (справочников) и т.д. (не для перечислений.
   * Для перечислений используется отдельный менеджер)
   *
   * @param <T>
   * @param managerFullname
   *            полное имя типа объекта. Например: Catalog.Номенклатура
   * @param uuid
   *            объекта
   * @return data-объект типа <T>
   * @throws SecurityException
   * @throws IllegalArgumentException
   * @throws NoSuchMethodException
   * @throws IllegalAccessException
   * @throws InvocationTargetException
   * @throws JIException
   */
  @SuppressWarnings("unchecked")
  public <T> T findDataObject(String managerFullname, String uuid)
      throws SecurityException, IllegalArgumentException,
      NoSuchMethodException, IllegalAccessException,
      InvocationTargetException, JIException {
    OCUUID ocuuid = createUUID(uuid);
    Object manager = findManager(managerFullname); // named data object
                            // manager

    // финт ушами
    Method method = manager.getClass().getMethod("getRef", OCUUID.class);
    _OCCommonRef ref = (_OCCommonRef) method.invoke(manager, ocuuid);

    return (T) ref.getObject();
  }
 
  /**
   * Осуществляет поиск ссылок на объекты, переданные в параметре <Список ссылок>.
   * @param refs  Массив со списком ссылок на объекты, ссылки на которые нужно найти.
   * @return OCValueTable. Возвращает ссылки на найденные объекты в виде ТаблицаЗначений, состоящей из колонок с индексами: 0 - искомая ссылка; 1 - ссылка на объект, если найдена ссылка в объектной таблице; ключ записи, если ссылка найдена в независимом регистре сведений; ссылка на документ-регистратор для всех остальных необъектных таблиц; 2 - объект метаданных, которому соответствуют данные из колонки 1.
   * @throws JIException
   */
  public OCValueTable findByRef(OCArray refs) throws JIException {
    return new OCValueTable(callMethodA("FindByRef", new JIVariant(ocObject2Dispatch(refs)))[0]);
  }
 
  /**
   * Используется для доступа к определенным в конфигурации документам.
   * @return OCDocumentCollection
   * @throws JIException
   */
  public OCDocumentCollection getDocumentCollection() throws JIException {
    return new OCDocumentCollection(get("Documents"));
  }

  /**
   * Набор свойств содержит менеджеры отдельных документов. Имена свойств
   * совпадают с именами документов, как они заданы в конфигураторе Short path
   * for app.getDocumentCollection().getDocument(<documentName>)
   *
   * @param documentName - имя документа
   * @return OCDocumentManager
   * @throws JIException
   */
  public OCDocumentManager getDocumentManager(String documentName) throws JIException {
    OCDocumentCollection collection = getDocumentCollection();
    try {
      return collection.getDocument(documentName);
    } catch (JIException e) {
      getErrorListener().onError(this, e);
      throw e;
    }
  }
 
  /**
   * Используется для доступа к определенным в конфигурации регистрам сведений.
   * @return OCInformationRegisterCollection
   * @throws JIException
   */
  public OCInformationRegisterCollection getInformationRegisterCollection() throws JIException {
    return new OCInformationRegisterCollection(get("InformationRegisters"));
  }
 
  /**
   * Short path for getInformationRegisterCollection().getInformationRegister(...).
   * @param managerName для регистра сведений
   * @return OCInformationRegisterManager
   * @throws JIException
   */
  public OCInformationRegisterManager getInformationRegisterManager(String managerName) throws JIException {
    OCInformationRegisterCollection collection = getInformationRegisterCollection();
    try {
      return collection.getInformationRegister(managerName);
    } catch (JIException e) {
      getErrorListener().onError(this, e);
      throw e;
    }
  }
 
  /**
   * Массив состоит из значений типа УровеньЖурналаРегистрации. для которых
   * включена регистрация событий в журнале. Если регистрация отключена,
   * возвращается пустой массив.
   *
   * @return
   * @throws JIException
   */
  public OCArray getEventLogUse() throws JIException {
    return new OCArray(callMethodA("GetEventLogUse"));
  }

  /**
   * Используется для доступа к определенным в конфигурации справочникам.
   * @return
   * @throws JIException
   */
  public OCCatalogCollection getCatalogCollection() throws JIException {
    return new OCCatalogCollection(get("Catalogs"));
  }
 
  /**
   * Short path for getCatalogCollection.
   *
   * @param catalogName наименование справочника
   * @return OCCatalogManager
   * @throws JIException
   */
  public OCCatalogManager getCatalogManager(String catalogName) throws JIException {
    OCCatalogCollection collection = getCatalogCollection();
    try {
      OCCatalogManager manager = collection.getCatalog(catalogName);
      return manager;
    } catch (JIException e) {
      getErrorListener().onError(this, e);
      throw e;
    }
  }

  /**
   * Используется для доступа к определенным в конфигурации журналам
   * документов.
   *
   * @return
   * @throws JIException
   */
  public OCDocumentJournalCollection getDocumentJournalCollection()
      throws JIException {
    return new OCDocumentJournalCollection(get("DocumentJournals"));
  }

  /**
   * Используется для доступа к определенным в конфигурации перечислениям.
   *
   * @return OCEnumCollection
   * @throws JIException
   */
  public OCEnumCollection getEnumCollection() throws JIException {
    return new OCEnumCollection(get("Enums"));
  }
 
  /**
   * Получение ссылки на перечислений по полному имени.
   * @param fullName полное имя перечисления. (СтавкиНДС.БезНДС)
   * @return OCEnumRef
   * @throws JIException
   */
  public OCEnumRef getEnumRef(String fullName) throws JIException {
    String[] splitted = fullName.split("\\.");
    if (splitted == null || splitted.length != 2) {
      throw new RuntimeException("Wrong parameter in getEnumRef (example: СтавкиНДС.БезНДС)");
    }
    OCEnumCollection collection = getEnumCollection();
    OCEnumManager manager = collection.getEnum(splitted[0]);
    return manager.getEnumValueRef(splitted[1]);
  }

  /**
   * Используется для доступа к планам счетов.
   *
   * @return OCChartsOfAccountCollection
   * @throws JIException
   */
  public OCChartsOfAccountCollection getChartOfAccountsCollection()
      throws JIException {
    return new OCChartsOfAccountCollection(get("ChartsOfAccounts"));
  }

  /**
   * Доступ к указанному менеджеру планов счетов.
   *
   * @param name
   *            имя плана счетов
   * @return OCChartsOfAccountManager
   * @throws JIException
   */
  public OCChartOfAccountsManager getChartOfAccountsManager(String name) throws JIException {
    OCChartsOfAccountCollection collection = new OCChartsOfAccountCollection(get("ChartsOfAccounts"));
    try {
      return collection.getChartsOfAccount(name);
    } catch (JIException e) {
      getErrorListener().onError(this, e);
      throw e;
    }
  }
 
  /**
   * Доступ к менеджеру регистров бухгалтерии.
   * @param name - имя регистра.
   * @return OCAccountingRegisterManager
   * @throws JIException
   */
  public OCAccountingRegisterManager getAccountingRegisterManager(String name)
      throws JIException {
    OCAccountingRegisterCollection collection = new OCAccountingRegisterCollection(get("AccountingRegisters"));
    try {
      return collection.getAccountingRegister(name);
    } catch (JIException e) {
      getErrorListener().onError(this, e);
      throw e;
    }
  }

  /**
   * @depricated since 0.5.0
   * Используется для доступа к планам видов характеристик.
   *
   * @return
   * @throws JIException
   */
  public OCChartsOfCharacteristicTypeCollection getChartOfCharacteristicTypesCollection()
      throws JIException {
    return new OCChartsOfCharacteristicTypeCollection(
        get("ChartsOfCharacteristicTypes"));
  }

  public OCChartOfCharacteristicTypesManager getChartOfCharacteristicTypesManager(
      String name) throws JIException {
    OCChartsOfCharacteristicTypeCollection collection = new OCChartsOfCharacteristicTypeCollection(
        get("ChartsOfCharacteristicTypes"));
    try {
      return collection.getChartsOfCharacteristicType(name);
    } catch (JIException e) {
      getErrorListener().onError(this, e);
      throw e;
    }
  }

  /**
   * Используется для доступа к определенным в конфигурации константам.
   * @return OCConstantCollection
   * @throws JIException
   */
  public OCConstantCollection getConstantsCollection() throws JIException {
    return new OCConstantCollection(get("Constants"));
  }
 
  /**
   * Используется для доступа к определенным в конфигурации константам.
   * @param constantName - имя константы
   * @return OCConstantManager
   * @throws JIException
   */
  public OCConstantManager getConstant(String constantName) throws JIException {
    OCConstantCollection collection = getConstantsCollection();
    try {
      return collection.getConstant(constantName);
    } catch (JIException e) {
      getErrorListener().onError(this, e);
      throw e;
    }
  }

  /**
   * Используется для доступа к определенным в конфигурации регистрам
   * накопления.
   *
   * @return OCAccumulationRegisterCollection
   * @throws JIException
   */
  public OCAccumulationRegisterCollection getAccumulationRegisterCollection() throws JIException {
    return new OCAccumulationRegisterCollection(
        get("AccumulationRegisters"));
  }
 
  /**
   * Используется для доступа к определенным в конфигурации отчетам.
   * @return
   * @throws JIException
   */
  public OCReportCollection getReportCollection() throws JIException {
    return new OCReportCollection(get("Reports"));
  }
 
  public ReportProcessor getReportProcessor() {
    return new ReportProcessor(this);
  }

  /**
   * Используется для доступа к планам обмена.
   *
   * @return OCExchangePlansCollection
   * @throws JIException
   */
  public OCExchangePlansCollection getExchangePlansCollection()
      throws JIException {
    return new OCExchangePlansCollection(get("ExchangePlans"));
  }

  /**
   * Используется для доступа к плану обмена по имени.
   *
   * @param managerName
   *            имя менеджера плана обмена
   * @return OCExchangeManger
   * @throws JIException
   */
  public OCExchangePlanManager getExchangePlanManager(String managerName)
      throws JIException {
    OCExchangePlansCollection collection = getExchangePlansCollection();
    try {
      return collection.getExchangePlan(managerName);
    } catch (JIException e) {
      getErrorListener().onError(this, e);
      throw e;
    }
  }

  /**
   * Используется для управления списком пользователей информационной базы.
   *
   * @return OCInfoBaseUsersManager
   * @throws JIException
   */
  public OCInfoBaseUsersManager getInfoBaseUserManager() throws JIException {
    return new OCInfoBaseUsersManager(get("InfoBaseUsers"));
  }

  /**
   * Фабрика XDTO, содержащая все пакеты XDTO, имеющиеся в конфигурации, а
   * также предопределенные пакеты (например, пакет типов XML схемы).
   *
   * @return OCXDTOFactory
   * @throws JIException
   */
  public OCXDTOFactory getXDTOFactory() throws JIException {
    return new OCXDTOFactory(get("XDTOFactory"));
  }

  /**
   * Сериализатор XDTO, соответствующий глобальной фабрики XDTO.
   *
   * @return OCXDTOSerializer
   * @throws JIException
   */
  public OCXDTOSerializer getXDTOSerializer() throws JIException {
    return new OCXDTOSerializer(get("XDTOSerializer"));
  }
 
  /**
   * Получает тип данных XML, который может быть прочитан в настоящий момент
   * из объекта типа ЧтениеXML. При получении типа данных XML может быть
   * произведена операция чтения из объекта ЧтениеXML. В случае, если тип
   * данных XML определить невозможно возвращается значение Неопределено. Тип
   * данных XML определяется по следующему алгоритму: 1) Пропускаются
   * пробельные символы, если текущая позиция объекта ЧтениеXML соответствует
   * типу узла "Текст" и значение узла полностью состоит из пробельных
   * символов. 2) Если тип текущего узла не соответствует значению
   * НачалоЭлемента, то считается, что тип не определен. 3) Определяется
   * наличие атрибута "nil" из пространства имен
   * "http://www.w3.org/2001/XMLSchema-instance". Если атрибут существует и
   * его значение равно "true", то считается, что тип не определен. 4)
   * Определяется наличие атрибута "type" из пространства имен
   * "http://www.w3.org/2001/XMLSchema-instance". Если атрибут существует, то
   * производится анализ значения атрибута: значение разделяется на префикс
   * пространства имен и локальное имя по префиксу пространства имен в объекте
   * ЧтениеXML определяется URI пространства имен, соответствующее данному
   * префиксу (если соответствующего URI пространства имен не обнаружено -
   * считается, что тип не определен) по полученному локальному имени и URI
   * пространства имен создается значение типа данных XML 5) Если атрибут
   * "type" не существует, производится анализ имени элемента. Если локальное
   * имя элемента совпадает с одним из имен типов пространства имен
   * "http://www.w3.org/2001/XMLSchema" и пространство имен элемента не
   * определено (пустая строка), то считается, что тип принадлежит
   * пространству имен "http://www.w3.org/2001/XMLSchema".
   *
   * @param reader -  Объект, из которого выполняется чтение.
   * @return OCXMLDataType
   * @throws JIException - ошибка платормы или DCOM
   */
  public final OCXMLDataType getXMLType(final OCXMLReader reader) throws JIException {
    JIVariant var = callMethodA("GetXMLType", new JIVariant(ocObject2Dispatch(reader)))[0];
    if (var != null) {
      return new OCXMLDataType(var);
    } else {
      return null;
    }
  }

  @Override
  public String toString() {
    return "OCApp [host=" + host + ", dbuser=" + dbuser
        + ", getAssociatedSessionID()=" + getAssociatedSessionID()
        + "]";
  }

}
TOP

Related Classes of com.ipc.oce.OCApp

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.