Значение числового реквизита справочника 1С

classic Classic list List threaded Threaded
7 messages Options
man2000 man2000
Reply | Threaded
Open this post in threaded view
|

Значение числового реквизита справочника 1С

В справочнике 1С есть реквизит "СтоимостьРаботы" типа "Число" длина=15 точность=2 Неотрицательное

Пробую получить его значение через ссылку CatRef:
OCVariant oVar = CatRef.getAttributeValue("СтоимостьРаботы");

Получаю:
oVar.value().getClass()=class java.lang.Integer !!!

и, соответственно, значение oVar.value()=210855100 вместо 804 291 200,00

Как получить правильное значение ?
IgorKonovalov IgorKonovalov
Reply | Threaded
Open this post in threaded view
|

Re: Значение числового реквизита справочника 1С

У OCVariant можно брать getDouble()  и getFloat(), а value() - это универсальный generic метод... Но тут есть и подводные камни. getXXX берет значения прямо из JIVariant соответствующими методами getObjectAsXXX. Что это значит: даже если дробное число объявлено в 1С, то, не имея мнимой части, в DCOM оно пройдет как целое число. Вот такой фокус. Темя для размышления и будущих релизов.
Но в данной ситуации происходит кастинг типов, а это уже баг..
Можно полный код кусочка где получается такая ерунда.
+ если не трудно то в Issue tracker эту тему. https://bitbucket.org/IgorKonovalov/octitbit/issues

PS:
Кстати, наконец-то удалось оттестировать подключение к домену - все работает. Версия 0.5.3
OCTitbit developer.
IgorKonovalov IgorKonovalov
Reply | Threaded
Open this post in threaded view
|

Re: Значение числового реквизита справочника 1С

In reply to this post by man2000
Кстати, что-то странно. Даже если кастинг имел место быть то 804291200,00 вполне преобразуется в int 804291200
OCTitbit developer.
man2000 man2000
Reply | Threaded
Open this post in threaded view
|

Re: Значение числового реквизита справочника 1С

Пробовал...

oVar.getDouble() (и oVar.getFloat() соответственно) - вызывает ошибку кастинга типов:

java.lang.IllegalStateException: java.lang.Integer cannot be cast to java.lang.Double
        at org.jinterop.dcom.core.VariantBody.getObjectAsDouble(JIVariant.java:1854)
        at org.jinterop.dcom.core.JIVariant.getObjectAsDouble(JIVariant.java:1267)
        at com.ipc.oce.OCVariant.getDouble(OCVariant.java:119)
        at cit.usp.server.GreetingServiceImpl.greetServer(GreetingServiceImpl.java:163)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
        at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
        at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
        at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
        at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
        at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
        at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:324)
        at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
        at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
        at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
        at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
IgorKonovalov IgorKonovalov
Reply | Threaded
Open this post in threaded view
|

Re: Значение числового реквизита справочника 1С

Значит в JIVariant сидит int, что логично, т.к. 804291200.00 вполне вмещается в int. Можно код посмотреть. Так пока не могу сказать в чем причина.
+ Перепробовал все кастить 804291200.00 к разным типам и так и не могу получить заветные "210855100". Может и не должно?
+ Про то, что в колонках, которые должны быть Double проскакивает Int я уже упоминал. Буду думать как это ликвидировать.
OCTitbit developer.
man2000 man2000
Reply | Threaded
Open this post in threaded view
|

Re: Значение числового реквизита справочника 1С

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

Но тип значения Integer ..., а вдруг копейки появятся ?
IgorKonovalov IgorKonovalov
Reply | Threaded
Open this post in threaded view
|

Re: Значение числового реквизита справочника 1С

Если копейки появятся, то будет не Integer, а Double. А вот для Integer лекарство разработано. Я сделал метод value с указанием класса, к которому будет приводится результат, если будут такие колебания. В данном случает это будет так.

OCCatalogRef ref = ...;
Double d = ref.getAttributeValue("...").value(Double.class);

т.е. если попадется Integer, он будет приведен к Double.


ISSUE #23
OCTitbit developer.