SAPPER использует имеющиеся программы печати для формирования xml-документов. Это позволяет избежать дублирования алгоритма формирования документа.
Алгоритм формирования электронного документа
- Для каждого отправляемого документа SAPPER вызывает программу печати, которая указана в настройках модуля.
- Программа рассчитывает данные для печати.
- Перед вызовом формуляра управление передается модулю SAPPER. Модуль проверяет, кем была запущена программа печати. Если это:
- не SAPPER — управление возвращается программе печати;
- SAPPER — выбирает подготовленные программой печати данные. Выбор данных определяется по настройкам выгрузки. Затем формируется xml-документ. По окончании процесса модуль возвращает флаг, который говорит о необходимости прервать программу печати.
Этот алгоритм работает с любыми версиями SAP, типами документов и отчетов (не зависит от функционала, реализованного SAP для журнала электронных счетов-фактур из российского адд-он).
Доработка программ печати
При установке модуля SAPPER изменения в стандартных программах печати производятся автоматически. В клиентских программах (Z-программах) необходимо вручную внести изменения. Вы можете сделать это самостоятельно или обратиться к вашему менеджеру, чтобы заказать услуги внедрения.
Перед тем как вносить изменения в программу печати, обязательно сделайте ее копию. Рекомендуемый шаблон названия копии программы «[ZSBIS_][Старое название программы]». Вместо копий программ печати можно использовать стандартные BADI в программах печати. Например, «J_3R_TORG12_BADI» для программы печати накладной «J_3RV_DELIV_PDF» или «J_3R_INV_BADI» для программы печати фактуры «J_3RV_INV_A».
В программу печати или ее копию добавьте вызов метода SAPPER. Метод должен завершать действия программы печати после формирования электронного документа.
Пример кода, который нужно добавить перед вызовом формуляра в каждую программу печати:
Если в формулярах печатных форм есть логика расчета данных документа, перенесите ее в программу печати.
Особенности вызова SAPPER, если Z-программы печати используют подпрограммы
- Сначала запускается подпрограмма «ENTRY». Это оболочка для подпрограммы «PROCESSING». Она передает код возврата, в ней изменения не понадобятся.
- Вызовите печать из тела подпрограммы «PROCESSING».
- Вставьте Saby-код формирования электронных документов до вызова печати («PRINT»).
В зависимости от флага «gv_not_print» происходит либо печать, либо выход из программы с правильным кодом возврата.
В SAPPER реализованы стандартные BADI и точки расширения для программ печати:
- класс «/SBIS/CL_J_3R_INV_BADI» — для печати накладных;
- класс «/SBIS/CL_J3R_TORG12_BADI» — для печати счетов-фактур;
- точка расширения «/SBIS/ENHI_J_3RV_TORG12_BIL» — для печати актов.
Убедитесь, что активированы BADI «J_3R_TORG12_BADI», «J_3R_INV_BADI» и точка расширения «ESJ_3RV_FORM_UPDATE». Используйте готовые решения, реализованные в данных классах.
Если BADI активированы, установлен статус «Реализация вызывается».

Пример вызова из BADI для программы печати накладной ТОРГ-12:
В зависимости от флага «gv_not_print» происходит либо печать, либо выход из BADI и из программы печати.
Вызов из формуляра нужен, когда в системе нет отдельной программы печати или когда значительная часть логики перенесена в формуляр.
Особенности вызова
- Из программы печати вызывается формуляр. Из него нужно вызвать код Saby, затем выйти из формуляра, а после — из программы.
- Передаваемые в SAPPER данные формуляра должны быть объявлены глобально.
- Вызов кода Saby нужно вставлять в элемент смартформы «строки программы» — там есть доступ к подготовленным данным печати. Например, в основной цикл по позициям.
- Не нужно вставлять код Saby в инициализацию. В ней у SAPPER нет доступа к глобальным переменным формуляра через assign. Также в инициализации не обеспечивается корректный выход из формуляра «/ФМ» со значением «rc=0».

Пример кода Saby:
Как правило, программа печати не требует изменений и сама формирует код возврата.
Вызов из формуляра нужен, когда в системе нет отдельной программы печати или когда значительная часть логики перенесена в формуляр.
Особенности вызова
- Из программы печати вызывается формуляр. Из него нужно вызвать код Saby, затем выйти из формуляра, а после — из программы.
- Вызов кода Saby нужно вставлять в интерфейсе формуляра в код инициализации или в подпрограмму — там есть доступ к подготовленным данным печати.

Пример кода Saby:
В программе печати нужно предусмотреть корректный выход с правильным кодом возврата.
Пример:
Возможные доработки программ печати
В программе печати данные, которые нужны для корректного формирования xml, должны храниться в отдельных полях. Например, в программе печати данные о контрагенте (наименование, ИНН/КПП) содержатся в одном поле, а в печатной форме документа — в отдельных строках.