Меню

Работа с замещениями FI

|

В статье изложены принципы использования замещений FI. Рассмотрено практическое использования замещений, на примере проводки документа инвентаризации ММ, где номер документа инвентаризации копируется в позиции документа FI.

Точенюк Олег, консультант по SAP MM, занимал должности консультанта по SAP ММ в различных компаниях, с 1997 года, занимался внедрением модулей FI-FM (контроль исполнения бюджета), Управления материальными потоками (ММ), Управление складом СУС (WMS), был консультантом по интеграции MM<->ТОРО, занимался разработками расширений системы на языке ABAP, uukrul@hotmail.com.

 

В статье изложены принципы использования замещений FI. Рассмотрено практическое использования замещений, на примере проводки документа инвентаризации ММ, где номер документа инвентаризации копируется в позиции документа FI.

Категории: SAP FI / MM, ABAP Расширение логики работы системы при проводках документов FI

Постановка задачи

Будем считать, что есть следующая задача:

При проводке инвентаризационных разниц, в позицию документа FI, которая формируется для оцениваемых материалов, требуется записать номер документа инвентаризации.

Так как документы FI при создании являются уже третьими в цепочке документов инвентаризации (если материал не оцениваемый или цена оценки нулевая, то документа может и не быть), то делать занесение данных в позиции документа FI нужно из модуля FI. Я считаю, что замещения FI наиболее правильное решение этой задачи.

В статье предлагается решение именно этой задачи, и не ставится цель описать порядок работы с замещениями. Однако, статья будет полезна для ознакомления с функциональностью замещения с использованием программы пользователя.

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

Начало работы

Начинаем работу с проверки того, какие поля можно замещать в системе, потому что не все поля, к которым имеется доступ, можно замещать. Для этого идем в табличку GB01, Рис.1, там задаем следующие параметры:

 

  • BOOLCLASS = 9, если проверяем возможность замещения полей для позиций документа FI или 8 - если требуется замещать поля в заголовке документа FI.
  • CLASSTYPE = S, типа показать замещаемые поля

 

Рис. 1 GB01-1

Далее увеличиваем количество записей в поле «максимальное количество совпадений» (2000 должно хватить), и выполняем выборку данных. Пример результата приведен на Рис.2. Фактически это - список полей таблицы BSEG. Теперь можно найти по имени поле, требующее замещения.

Рис. 2 GB01-2

Внимание: Как узнать техническое имя поля? Надеюсь, что тот, кто будет выполнять действия по этой инструкции, все-таки более-менее будет подкован в этом вопросе, а иначе «ну не надо оно вам!».

Далее смотрим на признак в поле BEXCLUDE. Если там ничего не стоит, значит поле можно замещать.

Но если там стоит значение Х, то это значит, что данное поле не рекомендуется к замещению пользователем, например, поле текста позиции документа BSEG-SGTXT разрешено к замещению, а вот счет главной книги BSEG-HKONT - нет. Однако, если очень хочется сделать замещение поля счета главной книги, то это сделать можно, но только в том случае, если Вы понимаете возможные последствия своих действий. При этом поля суммы, я вам очень не рекомендую замещать. Для «нерекомендованного» замещения нужно сбросить признак Х в поле BEXCLUDE (напротив замещаемого поля). Если этого не сделать, то после вызова замещения, система вернет все значения полей со статусом BEXCLUDE = "Х", на значения которые поля содержали до вызова вашего замещения.

Смену поля можно сделать любым из описанных ниже способов:

 

  • В ручном режиме, используя ключ отладчика /h для выбранной записи, через транзакцию SE11/SE16.
  • Использовать небольшую программку YXXX_CHANGE_GB01, текст которой приведен ниже.
  • Спасибо гостю fdu4 (с одного из форумов), но с версии системы, кажется ECC 5.0, можно использовать ракурс ведения транзакция SE30 имя ракурса VWTYGB01. Данный вариант, похоже, является самым оптимальным и простым для использования.

 

 

В конечном итоге, результатом будет то, что желаемое поле будет разрешено к замещению в системе. Теперь надо перегенерировать программы обработки замещений, чтобы они узнали о том, что появились новые поля для замещения. Если этого не сделать, то замещение работать не будет. Для этого нужно через транзакцию SE38, выполнить программу RGUGBR00 – Генерация ABAP-кодировки для проверок/замещений/правил. Причем, если измененную запись в таблице GB01 можно перенести транспортом в продуктивную систему, то программу генерации данных для замещения желательно выполнить в каждой системе, куда будет переноситься транспорт вашего замещения. Выполнять программу надо для области FI и для всех «моментов использования», галочки ставим все, как на Рис.3.

Рис. 3 RGUGBR00

Если в замещениях нет синтаксических ошибок, то генерация должна пройти без проблем. Если никто до вас ничего не трогал, то ошибок генерации вы получить не должны, зато теперь система знает, что было добавлено новое поле замещения. Если же поле изначально позволяет выполнять свое замещение, то запускать генерацию не нужно. Например, поле BSEG-SGTXT может быть замещено изначально.

Создание программы замещения.

Как и user-exits замещение это - фактически abap-программа, в которой вы должны написать логику определения данных замещения, однако в отличии от экзитов, в которых сразу вставлен инклуд начинающийся на Z*, с замещениями все работает немного по другому:

 

  • Во-первых, программа замещения указывается в настройке для прикладной области, причем прикладные области системой определены заранее;
  • Во-вторых, SAP предлагает вам шаблон программы, который вы должны скопировать в свою программу, начинающуюся на Z*, после чего для нужной вам прикладной области следует заменить стандартную программу на вновь вами созданную.
  • В-третьих, все замещения для прикладной области «живут» в одной программе, т.е. если для прикладной области уже стоит программа начинающаяся на Z*, то это значит, что кто-то уже использует замещения в вашей системе, и вы должны будете вставить код замещения в эту уже существующую программу, ну и само собой, ваш код должен быть, как минимум, без синтаксических ошибок, а иначе вы «завалите» работу всех замещений для прикладной области.

 

Итак, идем в настройку системы: SPRO: Финансы - Специальные регистры - Основные параметры настройки - Программы пользователя - Ведение пользовательских программ, зависящих от манданта. Для версии 4.6 и ниже, возможно путь будет немного другим, но где-то в районе настройки спецрегистров. Пример для ECC 6.0 на Рис.4. Если зайти в настройку, для замещения документов FI на уровне заголовка и позиции, нас будет интересовать строка прикладной области = GBLS.

Рис. 4 GBLS-1

Если замещения не использовались, то там будет стоять программа RGGBS000. Считаем, что так и есть, поэтому копируем эту программу, например, в свою, с именем ZGGBS000. Копируем только текст этой программы без инклудов, т.е. именно текст этой программы, для чего в SE38 вводим имя этой программы и выбираем копирование Ctrl+F5. После чего вставляем имя своей программы для прикладной области, как на Рис.5.

Рис. 5 GBLS-2

Теперь выполняем сохранение. При сохранении необходимо ввести имя запроса для транспорта изменений и система выполнит синтаксическую проверку заданной вами программы. Если ошибок не обнаружено и генерация кода пройдет успешно, то система позволит вам сохранить изменения. В нашем случае программа свежая, мы в нее «своими ручками не лезли», так что теоретически все будет сохранено без проблем. Затем идем в изменение программы и добавляем свою подпрограмму замещения. Имя подпрограммы можно использовать любое, длина имени - 4 символа. По стандарту имена начинаются на U*, традиция хорошая можно ее продолжить. Для этого надо в программе ZGGBS000, найти следующую подпрограмму:

И где-то в конце этой подпрограммы GET_EXIT_TITLES, но перед командами:

Вставте свой код:

где U777 - имя нашего замещения, оно, кстати, не должно пересекаться с уже существующими именами. Вместо TEXT-777 можно просто написать комментарий, но «кошерно» будет сделать именно так, через текстовую переменную. Потом двойной клик мышью на TEXT-777, и в открывшемся окне вводим текст комментария. Кстати, для вставки своего кода нужно стать курсором мыши в требуемую позицию программы и нажать кнопку вверху редактора "Вставить", так как это будет модификация специальной программы и система оформит вставку с комментариями запроса в котором создано замещение.

Затем нужно перейти ниже по тексту программы, например, сразу после подпрограммы GET_EXIT_TITLES и создать свою подпрограмму с именем U777, такого типа:

Вставка тоже оформляется через модификацию. Теперь сохраняем все это «произведение искусства» и генерируем текст программы. Если вы сделали все правильно, то ошибок генерации быть не должно. Само замещение будем писать позже, а пока займемся следующим шагом: оформлением вызова замещения.

Для проверки работы в дальнейшем можете вставить в подпрограмму оператор прерывания BREAK-POINT. А пока запоминаем имя программки ZGGBS000, она нам понадобиться в дальнейшем и имя своей подпрограммы U777.

Оформление замещения.

Теперь займемся собственно самим замещением. В общем виде замещение FI не обязательно должно приводить к написанию программы замещения, так как очень часто само замещение может выступать как проверка на допустимость операции. Например, можно просто без всякого программирования написать замещение с такой функциональностью: если будет использоваться счет затрат ХХХ, то контировка должна быть обязательно только на МВЗ с кодом ZZZ, а если это условие не соблюдается, то выдается сообщение пользователю и запрещается проводка документа. Это все можно сделать, используя редактор замещений без кодирования на ABAP.

Для работы редактора замещения нужно перейти в настройку SPRO: Финансы - Бухгалтерия дебиторов и кредиторов - Бизнес-операции - Проводка по альтернативному контрольному счету - Прочие операции особой главной книги - Выполнение и проверка настройки для документа - Замещение в бухгалтерских документах, или осуществить прямой вызов транзакции OBBH (так как для версий младше 6.0 путь может быть другой). После вызова настройки вы попадете в таблицу как на Рис.6, данные в таблицы зависят от количества БЕ).

Рис. 6 OBBH-1

Основное правило – замещения работают и настраиваются для балансовой единицы. В принципе если две БЕ работают по одинаковым правилам, то для них можно и нужно использовать один код замещения. Если для вашей БЕ в списке уже присвоен какой-то код замещения, то вы должны использовать уже созданный код, так как возможно, что группа FI уже использует замещения в своих целях, следовательно, вы должны будете добавить свой шаг в уже созданный код замещения. Если замещения для БЕ не использовались, то нажмите кнопку "Новые записи" затем введите код БЕ и выберите момент замещения. Так как мы как бы замещаем поле BSEG-SGTXT, то это - строка документа FI, значит, нас интересует замещение на уровне позиции документа. Вообще если исходить из Рис.7, то часто будут актуальны моменты 0001 - заголовок документа, 0002 - позиция документа и 0003 - весь документ полностью, при этом, если нужно использовать моменты 1 и 2 то вы должны будете добавить 2 записи в таблицу.

Рис. 7 OBBH-2

Выбираем момент 0002 для позиции документа и затем нажимаем ввод. Внизу система сообщит, что выбрана одна запись. Теперь нужно создать код замещения, в поле замещение. В данном поле работает вызов допустимых значений ввода по F4, система вам предложит выбрать значение из уже введенных кодов замещений, которые присвоены другим БЕ. В нашем случае, для БЕ 2000 мы создаем свой код. Для этого вводим любой текст, например MYEXT, после чего делаем двойной клик мышью на введенном имени, в противном случае, если вы нажмете ввод, то система выдаст ошибку, с уведомлением, что замещение не существует. При клике мышью, вам будет предложено создать новое замещение, пример на Рис.8. Подтверждаем желание создать новое замещение и попадаем в редактор замещений.

Рис. 8 OBBH-3

Редактор замещений.

Редактор замещений выглядит достаточно серьезно, «пацаны поработали», им спасибо, но особо сложного при работе с ним нет; как видно на Рис.9 новый код замещения MYEXT для момента позиция документа добавлен в дерево замещений, в котором уже присутствуют другие коды для момента 0002.

Рис. 9 OBBH-4

Один из кодов REG_SUB я раскрыл, и видно, что в нем уже существует 5 этапов. Фактически этап это - отдельный шаг проверки для строки документа. На каждом шаге вы можете менять любое из допустимых полей позиции документа. При этом учтите, что если на каком-то шаге с порядковым номером, большим относительно вашего этапа, будет изменение того же поля, которое меняете вы, то само собой, система сохранит последнее изменение. При этом вам, как пользователю, ничего не будет сообщено о том, что поле было переопределено несколько раз на разных этапах. Так что, если вы сделали свой этап, а таких этапов уже - «целый вагон», желательно пройтись по всем и посмотреть: не использует ли кто-то уже поле, то же что и вы, для каких-то своих целей? Вдруг кто-то (начальник) ещё раньше что-то написал, вы поломаете или чуть заденете, а «оно вам надо потом получать не материальную помощь»? В данном случае, замещение новое, так что этап будет только наш. Для примера, желательно бы конечно назвать наше замещение слева от дерева замещений, например "Замещение MM-IV". Теперь надо добавить свой шаг в замещение. Вопрос почему в дереве оно называется "Этап", а кнопка на панели инструментов называется "Шаг", наверное следует адресовать переводчикам, тем не менее, чтобы создать этап замещения, надо нажать кнопку "Шаг". Система выведет экран, Рис.10, со списком полей, которые можно замещать.

Рис.10 OBBH-5

В принципе можно выбрать первое пустое значение, что значит: хотим создать только экзит без привязки к полям, что замещать решим по ходу дальше, но в данном случае, мы знаем, что хотим замещать текст позиции документа, поэтому, выберем ниже по списку, позицию BSEG-SGTXT и нажмем ОК. Система спросит: какой тип операции замещения для поля мы хотим использовать?. Пример на Рис.11. Как видим вариантов 3:

Рис.11 OBBH-6

 

  • Константа, т.е. всегда полю будет присваиваться какое-то определенное значение. Это - весьма полезный вариант, очень часто используется присвоение именно констант: это делается путем создания разных этапов, для каждого этапа определяется свое условие срабатывания, например, по виду документа. Таким образом, можно создать набор соответствующих постоянных присвоений в зависимости от какого-то конечного набора правил. Для поля «текст позиции» это не актуально, но, к примеру, какие-то объекты контировки типа МВЗ/СПП-элементы/Финансовые позиции, очень часто именно так и замещают, в автоматическом режиме.
  • Программа пользователя. Обратите внимание: два первых шага, описанные выше, как раз и были подготовкой для работы замещения через программу пользователя.
  • Присвоение поле-поле, позволяет копировать значение из любого поля документа в замещаемое поле, например, можно сделать при определенных

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти

Обсуждения Количество комментариев9

Комментарий от  

Виталий Тарусин

  |  25 октября 2010, 11:35

Хорошая, понятная и полезная статья!
 
Мы давно используем замещения для нужд ММ, FI и СО.
Кроме того знаю и про доступ к глобальным данным вызывающих программ,
но соединить это воедино, скорее всего, не догадался бы.))
Спасибо за идею!
(видел неоптимальные методы решения этой проблемы путем записи данных в БД (в одном из ранее вызываемых экзитов) и считывания этих данных в нужном месте (другой экзит))
 
Тема раскрыта!

Комментарий от  

Анатолий Рогачиков

  |  12 ноября 2010, 13:00

Спасибо за статью.
Интересная статья. Если уж есть такая потребность - видеть ссылку на документ инвентаризации в FI , то можно так решить. Вполне изящно.
Единственное, что напрягает, так это предложение курочить контент стандартных таблиц в дебаге.
## Смену поля можно сделать любым из описанных ниже способов: ##
Тем более крос-клиентный кастомайзинг. Кастомайзинговая вьюха ищется элементарно - для этого не надо ходить на форум, достаточно запустить SM30,
подставить имя таблички и нажать кнопку "Find Maintanance Dialog".
Хочешь посмотрать все вьюхи - SE11 ->Where-Used List, Views.
Уж в крайнем случае можно запустить SE16N, имя таблицы ->  &sap_edit в окно ввода транакции.
Этот способ по крайней мере позволит создать транспорт через Table Entry -> Transport.
А настройку надо будет оттранспортить по ланшафту в обязательном порядке (либо проделовать тоже самое ручками в кажной ситеме выше - тесте и продуктиве).
Предложение писать ABAP для изменения контента поля вообще из разряда моделирования шарообразных
коней в вакууме -  создать свою кастомайзинговую вьюху подобную VWTYGB01в SE11 занимает 5-10 минут, решает проблему с транспортами и не требует знаний ABAP.

Комментарий от  

Олег Точенюк

  |  13 ноября 2010, 19:02

Ну в жизни бывают разные варианты, SM30 может быть закрыта, командочка SE16N, имя таблицы -> &sap_edit, еще большая вероятность что может быть закрыта, так что просто учтены все варианты как можно поменять поле, а то была ситуация когда полномочия были на SA38, а с остальным было плохо, так что пришлось программку приблизительно для этих целей и набросать.

Комментарий от  

Ирина Сергиенко

  |  26 декабря 2012, 12:17

Спасибо за статью! Очень подробно и интересно.
Часто приходилось использовать замещения, еще раз спасибо!

Комментарий от  

Сергей Теплов

  |  28 августа 2013, 11:47

Не упомянут очень важный момент:
Из RW-интерфейса (логистика, касса, HR) момент замещения "Документ полностью" не отрабатывает. Для этого можно использовать OpenFI событие 1120. SAMPLE_PROCESS_00001120 - универсальный ФМ, срабатывает всегда при создании документа отовсюду, но OpenFI выходит за рамки данной статьи:)

Комментарий от  

Олег Точенюк

  |  28 августа 2013, 13:32

Не упомянут очень важный момент:
Из RW-интерфейса (логистика, касса, HR) момент замещения "Документ полностью" не отрабатывает. Для этого можно использовать OpenFI событие 1120. SAMPLE_PROCESS_00001120 - универсальный ФМ, срабатывает всегда при создании документа отовсюду, но OpenFI выходит за рамки данной статьи:)

Извините но вы путаете замещения и технологию BTE, это несколько разные техники.

Комментарий от  

Олег Точенюк

  |  28 августа 2013, 23:59

Извините но вы путаете замещения и технологию BTE, это несколько разные техники.

Что то еще раз перечитал, или это я не правильно понял :-) в общем я замещение на уровне документа для HR не использовал, на уровне позиции документа, замещение работает и для HR как часы.

Комментарий от  

Александр Тустановский

  |  25 декабря 2015, 15:57

Не упомянут очень важный момент:
Из RW-интерфейса (логистика, касса, HR) момент замещения "Документ полностью" не отрабатывает. Для этого можно использовать OpenFI событие 1120. SAMPLE_PROCESS_00001120 - универсальный ФМ, срабатывает всегда при создании документа отовсюду, но OpenFI выходит за рамки данной статьи:)

Там где 'Документ полностью' не отрабатывает можно сделать так:
Например для кассы (FBCJ) в конце модуля FI_DOCUMENT_PROJECT нужно вставить вызов замещений док-та полностью:
ENHANCEMENT 1  ZRGGB_ADD_1_2.    "active version
DATA: I_SUBST(1).
CALL FUNCTION 'FI_SUBSTITUTION_DOC'
   IMPORTING
      E_SUBST  = I_SUBST
   TABLES
      IO_XBSEG = XBSEG
      IO_XBKPF = XBKPF.
*Ну и вызов проверок документа полностью не помешает
   PERFORM DOCUMENT_VALIDATION.
ENDENHANCEMENT.

Комментарий от  

Олег Точенюк

  |  05 января 2016, 17:41

Там где 'Документ полностью' не отрабатывает можно сделать так:
Например для кассы (FBCJ) в конце модуля FI_DOCUMENT_PROJECT нужно вставить вызов замещений док-та полностью:
ENHANCEMENT 1  ZRGGB_ADD_1_2.    "active version
DATA: I_SUBST(1).
CALL FUNCTION 'FI_SUBSTITUTION_DOC'
   IMPORTING
      E_SUBST  = I_SUBST
   TABLES
      IO_XBSEG = XBSEG
      IO_XBKPF = XBKPF.
*Ну и вызов проверок документа полностью не помешает
   PERFORM DOCUMENT_VALIDATION.
ENDENHANCEMENT.

Можно,но к сожалению это сильно не кошерно, с точки зрения SAP. Так что это сильно на усмотрение клиента, добавлять такую модификацию или нет. Хотя решение конечно нормальное.