B1if in a Nutshell

The Business One Integration framework (B1if) is optional available for SAP Business One 8.8 (under the name B1iC) and integral part of SAP Business One 8.8.1 and higher. B1if is free of charge for all customers holding an SAP B1 license. B1if is used to connect SAP B1 to its eco system. Therefore the main task for B1if is to enable SAP B1 to publish/send data to external systems and to allow SAP B1 to consume/access data from external data provider. Another aspect of introducing B1if is to consolidate certain client functionality to run these on server side and herewith having one single platform to perform all integration related tasks.

B1if is not a tool – it is the strategy for SAP B1 to enable the evolution from a Business Application to a Business Platform.

With the current version B1if 1.3.5 (for B1 8.8.1. PL 2) SAP provides three Scenario Packages. The Scenario Package sap.B1Mobile is covering more than 40 web services to be called by a mobile device (e.g. the Apple iPhone) to interact with SAP B1. The sap.Xcelsius package is providing generic services to be called from SAP B1 to administer, authenticate, cache and launch any Xcelsius based dashboard, be it shipped by SAP or developed by the partner resp. the customer. The Scenario Package sap.DATEV-HR is providing B1 HR data in the file system, ready to be imported into the interface of the german payload provider DATEV and imports payload voucher from DATEV into SAB B1.

The Scenario Packages are built in the B1if Design Time and are processed inside the B1if Runtime. The strong B1if Repository, the B1if Flow Atoms and the generic B1if Process Flow are controlling the complete integration process. This allows the Scenario Packages to focus on the business logic. All the tricky things like error- and conflict handling, transactional control, in-order processing, exactly once processing, guaranteed delivery, monitoring, debugging facilities, administration etc. are covered in a consistent and reliable way inside B1if. Via the inbuilt adapters you have mature, reliable connectivity to all SAP systems and via generic adapters to all kind of technologies.

If you develop a new integration scenario, there is no programming needed to specify the inbound and outbound phases of your integration process. The processing flow you define inside the development environment with the graphical Flow Designer. You will use the B1if Flow Atoms, which are powerful out-of-the-box functional units for value mappings, for setting up calls (e.g. SAP B1, SAP ERP, HTTP, SQL, File System, …), for running XSL transformations, for conversions, etc. The concrete field mapping will be done by xsl, optional by an embedded xml editor. Strong debugging facilities makes it easy to develop the individual processing flow in a well structured and controlled manner.

The strict model-driven approach of B1i allows even people without years of experiences in integration to develop an individual, robust integration scenario with high reliability, with short implementation time and change friendliness from beginning on.


  • Proven & innovative technology (model drive, 6 patents)
  • Lightweight architecture to address especially Small Business
  • Scalable due to parallel processing (by programming model)
  • Multiplatform support (OS, DB)
  • Tailored deployment (S, M, L, – local, centralized, cloud)
  • Based on established integration standards (XML, XSLT, HTTP)
  • Fully aligned with SAP overall technology (PI, SOA, RFC, …)
  • Robustness due to pluggable apps/scenarios (Isolation concept)
  • Browser based administration (Remote administration)
  • SW logistics (Packaging, Hot Deployment, Incremental)

Technical Capabilities

  • Transactional Control, Recovery & Resumption Management
  • Concurrent processing (coordination service)
  • InOrder, Guaranteed Delivery, Exactly Once
  • Job Scheduling, Event Subscription
  • XML Persistency (incl. Indexed Access, Cache Control, WebDAV)
  • Resource Tracking & Logging (e.g. queues, cache, pools, processes)

Business Capabilities

  • Business Repository
  • System Landscape Directory
  • Scenario Control, Setup, (De)Activation incl. Extensibility
  • Multi Level Monitoring
  • Error/Conflict Handling
  • Graphical Scenario Designer & Debugger
  • Flow Atoms, Integration Pattern 

Recommend this post to your contacts:

This entry was posted in B1if. Bookmark the permalink.

38 Responses to B1if in a Nutshell

  1. Jan Reiser says:

    Hello Heinz,
    a very nice Blog you have!

    And i have a question. :-)
    Have you ever seen or made a docu about ERP6 (IDOC) -> B1ic (8.8.1) -> B1?
    I have just found docu’s regarding ERP6 -> B1iSN -> B1.
    But they do really differ from Bi1c.

    Jan Reiser

    • Heinz Pauly says:

      Hello Jan,
      both of our frameworks B1if and B1iSN have the functionality to integrate B1 into components of SAP Suite/ERP/BAiO/NetWeaver. As for now B1-ERP out-of-the-box Scenario Packages are available only for the B1iSN framework. SAP is planning tp provide these out-of-the-box Scenario Packages also for B1if and in addition a migration guideline/tools to port individual B1iSN Scenario Packages to B1if.
      best regards

  2. Rüdiger Frank says:

    Hello Heinz,
    one of our customers has several SAP Business One subsidiaries which should share the same master data (customers, Items, BOMs). We have planned to use B1iSN to connect the systems as there are out of the box scenarios for that.
    No we participate in the ongoing Web sessions provided by SAP for B1if.
    I am a little unsure what to use now for this project.
    Are there also predefined scenarios to share master data for B1if.

    Thank you very much for any information. Best regards Rüdiger

    • Heinz Pauly says:

      Hello Ruediger,
      B1iSN is typically addressing the use case Subsidiary Integration where SAP B1 is running in the subsidiaries and the ‘big’ SAP (SAP Suite, ERP, BW, …) is running in the headquarters. If this is the case, B1iSN is the right product to go for. Connecting several B1s, SAP is addressing with the product B1BC. Unfortunately this is not yet available in the market. Therfore you have two options. You can use B1iSN and leverage from the available content or you go for B1if and benefit from the more easy-to-use environment, but in this case you have to develop the scenarios by yourself. In one of the next releases, SAP is planning to provide B1iSN content also for B1if. You need to balance by yourself what is the best for you.
      best regards – Heinz

      • Rüdiger Frank says:

        Hello Heinz,
        thank you for your feedback. We will go with B1iSN as there are predefined scenarios yet. Do you think that there will be a migration path from B1iSN to B1if once scenarios will be available for B1if?
        best regards – Rüdiger

        • Heinz Pauly says:

          Hello Ruediger, we are planning to provide guidelines and tools to migrate B1iSN scenarios to B1if scenarios – best regards – Heinz

  3. Alex G says:

    Dear Heinz,
    is there any rough timeline for those guidelines/tools, as we need to decide now to migrate the existing B1-B1 scenarios from B1SN to B1F or better wait for SAP to release those?
    Thanx in advance,

    • Heinz Pauly says:

      Dear Alex,
      I’m very sorry for the delay. The rough timeline is EoY2011. Are the scenarios complex and using receiver key expansion and sophisticated features of B1iSN like ErrorActions? How many scenarios your have?
      best regards

      • Alex G says:

        Dear Heinz,

        – yes, we do have complicated processes and almost all scenarios use sender and receiver key expansions (some of them use B1 objects, some of them use SQL queries). There are 6 different scenarios to synch master data and financial info indeed with the error actions.

        – based on the current experience, we see B1iSN is more enterprise and mature product from the flexibility/setup/techniques/scalability point of views (i do not mean here that B1iF is more B1-related while B1iSN is more full SAP ecosystem oriented, this difference is creal from the product definitions), so another suggestion could be to have the guide for the integration/development consultants to clarify what we have in B1iSN and what we do not have in B1iF and vice-versa (including the substitution techniques, pros and cons and so on), this would be very helpful to see the current gaps in B1iF and to choose the right solution for the B1-oriented integration projects.


  4. Kostik says:

    Dear Heinz,
    I’m working on scenario, where I want to call java classes, but B1if internal documentation does not have description of this process and there is no information of “how to”.
    When I add atom with type “Call Java Class”, I have to fill few fields, and there is description of each field:
    here is my questions:
    1) which SysId should I specify? I have scenario, where data should be exported from B1 to File System. Before data is exported to FS, java class should be called.
    Should I create new SysId for java classes? if yes – how to do it?
    2) Input – what should I specify in this field?
    3) Parameters. Constructor of my java class has array of String parameters (String[] args). Please, advice, how to specifiy this field, when paramter is array of strings?
    4) what if I want to pass some B1if global variable as parameter to call my java class?
    Dear Heinz, please advice, I will very appreciate for your answers.
    Thanks in advance.
    Best regards, Ryahovsky Konstantin.

    • Heinz Pauly says:

      Dear Kostik,
      1. SysId is optional – not needed for calling a java class. You can leave it empty with # value only. It is used in case you want to hand over connectivity parameter or credential to call a particular system of the SLD out of your java class. If you specify the SysId, then you can use the parameter in the “Parameter” section, e.g. Param2{$JDBC.url}. You can also have a look to the scenario step sap.XcelViewer.
      2. Input describes the xml request document for your java class, means the data you want to handover. Samples: “#atom5″ means the complete result of the atom 5 is handed over to your java class. “#$atom5/root/sub” will hand over the result of the xpath processed against the result of your atom5 “/vpf:Msg/vpf:Body/vpf:Payload[./@Role=’T’]” will hand over the result of the defined xpath.
      3. You need to wrap your java class by implementing the B1i callable interface. I’ll send you an email with the needed docu. Afterwards you have to provide the jar file in the base directory of the B1if server (by default: C:\Program Files\SAP\SAP Business One Integration\B1iServer\tomcat\webapps\B1iXcellerator\WEB-INF\lib). After providing the jar file, you have to re-start the B1i service.
      4. You can pass any parameter by the inbound xml document (topic 2) or by using the parameters. Please define parameters with the syntax: “name{value} name{value} name{value} name{value} …”. A blank in a value of the Parameter string you must specify with /_ (e.g. this/_is/_a/_document)
      hope this helps – best regards

      • Kostik says:

        Dear Heinz,

        I created simple test scenario, where java class called.
        This java class have single constructor without parameters and implements interface Callable, needed methods are overriden.

        But when I try to use it, I’m getting exception: BPE027 – could not get an instance for ‘Callable’-class Further details: className: .

        I restarted B1i service and this jar file is used by the service (I cannot rename it or move it)
        Is there any more things, which must be implemented to java class?
        probably constructor should have some parameter? or something else?

        Please, advice.
        Thanks in advance.

        • Kostik says:

          Documentation, which you have provided says, that class must have constructor without parameters.
          Is there any other requirments?


          • Kostik says:

            Dear Heinz,
            I used to file name in Java Class Name field instead of real full class name.
            All works fine with class name.
            Kind regards, Kostik

        • Heinz Pauly says:


          The following pre-requisites have to be fulfilled in order to be able to call a Java class on message-level via the B1i Call-Atom:
          * The class has to implement the ‘Callable’ interface.
          * It has to possess / being able to be instantiated with a no-arguments initialize.
          * It has to be accessible within the overall class-path – having put the containing .jar to ‘B1iXcellerator/WEB-INF/lib’ fulfills this need
          * It has to be invoked supplying the fully qualified class-name within the Call-Atom.

          Having your error-description and the other info. It looks as if this last point is the issue:
          It seems that the specified class-name within the Call-Atom is wrong / not fully qualified.

          • Kostik says:

            Dear Heinz,

            New question about using Java classes.

            call() method has 5 arguments, first – properties, I tested it, and it works fine.
            second argument has type BizProcMessage.
            to use it I have to create BizStoreAccessor instance, please, advice, how to do it?

            Also, I did not find, how to use Input field, which you described (point 2 in your answer). Please, advise.

          • Heinz Pauly says:

            Dear Kostik,
            it is the most easiest way to use the supplied Properties-object (arg.#1 of call()) in order to pass in a limited set of info to the Java class.
            Alternatively / also, the BizProcMessage can be used if the passed data has to be a /complex) XML-document for some reasons.
            The requested BizStoreAccessor for some manipulation operations can be gained by some casting-step:

            BizProcMessageWithBSA bpmbsa = (BizProcMessageWithBSA) inMsg;
            BizStoreAccessor bsa = bpmbsa.getAccessor ();

            The point is that the BizStoreAccessor contains internal processing resources within the executing transaction that are needed by some types of payload-type converters.
            On the other hand side, most of them (as on XML passing) do not need it – passing ‘null’ in this (your) case also would work.
            For passing data back to B1i, args #3 + 4 would be suitable. Again, just pumping in some properties most times would do the job in a suitable way and you could avoid to assemble an XML reply document on your own (what is not that trivial in typical 3GL languages, as Java, C#, C++, VB, …).
            Best Regards – Heinz

  5. Kostik says:

    Dear Heinz,

    Thanks a lot, your answer are very helpful!
    Would be great if some day this will be a part of internal B1if documentation :)

    If I have questions, I will ask you here. Thanks!
    Kind regards,

  6. Kostik says:

    Dear Heinz,
    I’m still working on call java class step, and your last answer was very helpful.
    But I think that format is little bit wrong.
    Data, which goes in message is in CDATA format.
    for instance, I need following data as input to my java class:
    Really, I have this:
    Is it possible to get complete xml document for concrete payload atom?
    Thanks for supporting!

    • Heinz Pauly says:

      Hi Kostik,

      It is definitely possible to get an XML message as input for your Java-class

      * As I understand you want to handover the result of a xform atom to your java class, right? In your flow you have an xform, let’s say atom2. This xform is producing an xml document. In your java-call atom you refer to this xml via the parameter ‘Input*’. The value is ‘#atom2’. The xml, that is produced by your xform must be a well-formed, means having a single root-tag!

      * On your java side: You do this by evaluating arg #2 of the call method, the inbound BizProcMessage. Use the method ‘BasicMessage.getXMLMSGpayload()’ in order to get XML as payload-type. Your mentioned wrongly retrieved document looks like a payload-type conversion to HTML had happened, what would make no sense in your case. What you get is a byte-stream, containing the markup in UTF-8 encoding. Note that this is true XML; therefore, e.g. consider that particular characters in the data are present / escaped as XML entities (e.g. the ” chars).

      Hope this will help

      • Kostik says:

        Dear Heinz,
        BasicMessage.getXMLDOMPayload(BizStoreAccessor acc) returns exactly what I need!
        That works perfect, thank you very much!
        Just one more question, is it possible to call java class using B1iSN?
        I tried to do it, but was confuced, which type of biz atom should I choose?

        Thanks in advance

        • Heinz Pauly says:

          Dear Kostik, congrats to your work! Regarding your question, in B1iSN you have the single call atom, but it supports only calls to B1, DB, HTTP, WS, FILE and RFC – best regards – Heinz

  7. Kostik says:

    Dear Heinz,

    I have one more question, about B1if installation.
    I have server, for instance ‘SBO_Server’ with SAP Business One 8.81 and I have separate server for B1if, for instance ‘B1if_Server’.

    Currently, I’ve done this:
    SAP B1 8.81 PL06 has been installed to SBO_Server.
    B1ic DI Proxy, B1ic Event Sender have been installed to SBO_Server.
    B1ic Integration Service has been installed to B1if_Server.

    following ports should be opened on the SBO_Server:
    -30000,30001 (default License server port)
    -8080 (default mobile integration, http port)
    -2099 (default DI Proxy port)
    -1433 (default SQL Server port)
    -8443 (default mobile integration, https port)

    How should I install components of B1if? Is there any best practices?
    Which ports should be opened?
    Please, could you advice?

    • Kostik says:

      sorry, 8080 should be opened on the B1if_Server (default integration service port)

      • Heinz Pauly says:

        Dear Kostik,
        sorry for the delay – I was out-of-office last week. For sure you can install B1ic and B1 on two separate machines, but you can also deploy both the B1ic and B1 incl. the database server on one physical server. In this case you need to make sure that all components have enough CPU and memory. B1if needs at least 1 GB mem and you have to explicitely restrict the sql server to not use all available memory.

        Regarding the ports you answered already the question:
        B1/DB server
        -30000,30001 (default License server port)
        -2099 (default DI Proxy port)
        -1433 (default SQL Server port)
        -8080 (default admin, dashboards, http port)
        -8443 (default mobile integration, https port)

        The ports on B1if Server you can change to your needs (Maintenance->Cfg Runtime) in case these ports are used by other software.

        best regards

        • Kostik says:

          Dear Heinz,
          thank you for answer and sorry for annoying…
          But if we use strict firewall and we want to open only needed prots, should we define COMM_PORT here:

          • Heinz Pauly says:

            Dear Kostik,

            B1if tcp/ip ports are by default:
            – 2099 for the DI Proxy, running on the B1 server
            – 8080 for B1if http calls (e.g. admin, dashboards)
            – 8443 for B1if https calls (e.g. B1 mobile)

            B1if allows you to define your own ports:

            – DI Proxy port: There is a configuration file in the file system to configure the DI Proxy. The file is located in the file system in …\Program Files\SAP\SAP Business One Integration\DIProxy. The name of the configuration file is diproxyserver.properties (your screenshot). The name of the parameter is RMI_PORT. Please restart the proxy service after this change. If you change this port, you also have to apply this change to all SLD entries (parameter DIproxyPort) of type B1. Please use the [Test connection] to verify your changes. After doing this change I recommend to re-activate all running scenario packages.

            – B1if http and https ports you can also change to your needs. You have to apply the change 1. to the B1i server, 2. to the Tomcat server and 3. to all scenario packages, using this port.

            1. Use the B1if admin to open the screen Maintenance->Cfg Runtime, change the ports and click the [Save] button. After the change please restart the integration service.

            2. Please open the configuration file of Apache Tomcat ..\B1iServer\tomcat\conf\server.xml. To change the http port, please search for the tag <Connector port=”8080″ …> and change it to your needs. To change the https port, please search for the tag <Connector port=”8443″ …> and change it to your needs. After the change please restart the integration service.

            3. All scenario packages
            – Re-activate all running scenario packages
            – Dashboards: Automatically B1if will align the settings in B1 so that the dashboard calls will use the new port configuration automatically.
            – B1 Mobile: you have to modify the url, defined on the iphone
            – for your own scenario packages: In case the steps are triggered by incoming http/https calls, the consumer apps, calling into B1i server need to apply the change in the url.

            Best regards

  8. Selina says:

    Hello Heinz,

    I have 2 questions about B1if.

    1) I want to synchronize bill of materials from B1 to B1 (insert and update) and I get the following error message:
    com.sap.b1i.xcellerator.XcelleratorException: XCE001 Nested exception: com.sap.b1i.bizprocessor.BizProcException: BPE127 Stylesheet not found / pool-limit reached Further details: uri: /com.sap.b1i.vplatform.scenarios.design/vBIU.IPAS.StepProductTree/atom0

    My outbound is “VOID” and the definition of the scenario is in Atom2 and I think I must refer from Atom0 to Atom2 but I don´t know how.

    The items are already synchronize with B1if.

    2) I want to synchronize a Scenario for mulitlanguage files (OMLT/MLT1) and I get the Error message:
    “error in scenario step: no receiver segment”.
    I don´t what I forget in my scenario.

    Thank you for your help.
    Kind regards,

    • Heinz Pauly says:

      Dear Selina,
      1. It seems somehow the scenario step or parts of it are damaged.The message is saying that the the xsl, corresponding to the atom0 does not exist. Please check in the bizstore directly in the path /com.sap.b1i.vplatform.scenarios.design/vBIU.IPAS.StepProductTree/atom0.xsl. In case it does not exist, just copy an atom0.xsl from another path and modify it to your needs. You also can just create a new scenario step and adopt it to the existing damaged one.
      2. Each atom in a scenario step is adding a new payload section in the body of the message. The last atom (atom0) is adding a payload section with @Role=’R’. After the processing B1if will cut out this section to hand it over to the receiver system. The error message is saying that this section is missing. Usually this cannot happen only if the atom0.xsl is manipulated manually. Please adjust the atom0.xsl so that the R section will get generated. As an example you can have a look to any other atom0.xsl.
      best regards

  9. Hi Heinz

    I’m new to integrating SAP Business One and am a little overwhelmed by the options. The scenario I’m looking to fulfill is this:

    The client has an existing Production System that they’re wanting to keep, so I’m wanting to import completed Production Orders, Goods Receipts and Goods Issues. They will also have some EDI requirements down the road.

    Is B1iF the tool to develop this with, or should we use B1iSN? I don;t expect there are any pre-built configurations for these.

    Many Thanks

    • Heinz Pauly says:

      Dear Svend,
      this is a typicall use case for B1if. It will be three scenario steps, each triggered by B1 event for the particular object. In the process flow have to transform the incoming message based on the requirements defined by the API of the production system. You can handover the message to the production system depending on the provided interfaces, e.g. via file or via web service call or via a database.
      best regards

  10. Sergey says:

    Dear Heinz,

    I have a following question. I use B1 Function Call atom (SetCurrencyRate) to update currency indexes. The problem is the 4th argument (is optional) do not passing to a function. So, function calls always with update state = false and throws an exception if some value already set. How to fix it?

    • Heinz Pauly says:

      Dear Sergey,
      please specify the parameters dynamically e.g. #tree(atomx). In this case you have to create atomx as xform atom, providing the values like

      <Parameters xmlns="">
      <!-- GET CURRENCY CODE-->
      <!-- DATE-->
      <!-- GET CURRENCY RATE-->

      best regards – Heinz

      • Sergey says:

        Dear Heinz,
        thank you for you reply.
        Of, course, I pass parameters dynamically and I found the problem, it’s at “Parameters” field at B1 fn. call. I wrote parameters with a space char after comma:
        #$[InnerCode], $[Date], $[Value], true
        If remove spaces, – all works.

        Thank you for your time.

  11. Sergey says:

    Hello, Heinz

    Can I ask you a few questions.

    1) I try to manually form HTTP header (set content-type e. t. c.) but without success and not found any information about. How to do it right?

    2) Do you plain to add some sort of “Exception Step” to B1if, to catch exceptions and operate with them at one place and on a high level? For example, to create log table at SAP B1 with success/failure (remark) of flow is really difficult.

    And by the way, FTP Call throws an exception if file exist on FTP server, and write mode is “overwrite”. (exception – file already exist)

    Best Regards

  12. Sergey says:

    Hello, Heinz

    I was figured out, how to configure HTTP header, but a few problems arise. I make a HTTP call with Content-Type “application/atom+xml” (site supports this type), but sniffer shows to me, that B1iF clears my Content-Type flag from header and sets its to “text/xml”. Of course, nothing works. If I set type “application/atom+xml” at tags, B1if will change Content-Type at “application/octet-stream” and again nothing works. Can I override content-type of sending packet?

    With the best wishes

    • Heinz Pauly says:

      Hi Sergey, the content type is set implicitly in B1if based on the payload type. To support the requestet content type, please set the payload type to “atom” (/call/pltype). best regards Heinz

Leave a Reply

Your email address will not be published. Required fields are marked *