Взгляд IT-специалиста на SAP ERP
В этой статье я не буду рассказывать о плюсах и сильных сторонах этой системы с точки зрения функциональности – пусть этим занимаются маркетологи. Я, как IT-специалист, хочу поделиться с вами своими впечатлениями о реализации этого продукта.
Статья будет полезна в первую очередь тем, кто планирует начать работать с SAP ERP как в качестве IT-специалиста (консультанта/программиста), так и в качестве конечного пользователя.
Бывают такие интерфейсы, на которые смотришь и сразу становится понятно, куда нужно нажать, чтобы выполнить то или иное действие. Так вот…это не про SAP. Первый раз, когда я увидел стартовый экран SAP, подумал, что это просто очень-очень старая версия, которую я как-то случайно запустил. Ан нет, это была вполне современная версия. Интерфейс разрабатывали где-то в 90-х, там он и остался до сих пор.
Для работы с системой нужно запускать так называемые транзакции (к транзакциям БД они отношения не имеют). Транзакция SAP – это что-то типа «ярлыка» для вызова программы, с помощью которой можно выполнить какое-то действие в системе (например, просмотреть список заказов на поставку или отредактировать какой-либо документ). Имена у транзакций абсолютно ничего неговорящие (ME21, IW33, MIRO…). Запустить транзакцию можно двумя способами: из древовидного меню слева или введя код транзакции в специальное поле. В меню можно заблудиться, поэтому чаще всего транзакции запускаются путем ввода её кода. Поэтому у каждого пользователя есть блокнотик, в котором все эти коды записаны.
Стартовый экран SAP ERP
Запускаю я, значит, транзакцию для просмотра списка объектов ремонта, кое-как заполняю селекционный экран, жму «Выполнить» и получаю…дамп (так в SAP называется критическая ошибка, прерывающая выполнение программы без возможности продолжить её работу).
Вчитываюсь в этот страшный, совершено непонятный простому пользователю, экран и понимаю, что передал слишком много входных данных.
Это я сейчас знаю, что нельзя передавать слишком много значений в поля селекционного экрана, так как SQL-запрос превышает какой-то там допустимый размер в килобайтах и из-за этого программа прерывается с исключением DBIF_RSQL_INVALID_RSQL. Причем, нет никакой конкретной цифры, всё зависит от длины передаваемых значений, но экспериментальным путем получена цифра равная примерно 1500-1800 значений. Но как всё это объяснить пользователю? Как объяснить, что он должен 4 раза запустить транзакцию, если ему хочется получить отфильтрованный по 5000 значений список. К тому же, в одних транзакциях нет никаких ограничений, а в других есть.
Матерюсь, перезапускаю транзакцию, заново заполняю селекционный экран, уменьшив объем входных данных, и, наконец, подождав 15 минут, получаю список объектов. Выделяю нужную мне строку списка и отчаянно пытаюсь найти кнопку «Редактировать». Ага, размечтался. Для редактирования, оказывается, существует отдельная транзакция, в которую я, в большинстве случаев, не могу попасть из транзакции просмотра списка объектов. Мне надо скопировать системный номер нужного мне объекта из списка, запустить отдельное окно SAP (которое называется режимом), открыть там транзакцию для редактирования объекта и вставить туда скопированный номер. Таких режимов я могу открыть по умолчанию не более шести. Если все 6 уже открыты, а мне надо отредактировать объект, то придется каким-то режимом пожертвовать. Для просмотра, создания и даже удаления объекта тоже существуют отдельные транзакции.
Еще ситуация. Открываю я транзакцию «MIRO – создание входящего счета-фактуры», долго заполняю шапку, указываю системный номер документа входящей поставки, на основании которого автоматически заполняется позициями табличная часть счета-фактуры. Из тысячи позиций мне нужно было 100 удалить. Я нахожу эти позиции, долго выделяю их и жму кнопку «Удалить». Как думаете, что должно произойти после выделения позиций и нажатия кнопки «Удалить»? Вот я тоже так же подумал. А разработчики SAP думали как-то по-другому – удалилось 900 невыделенных позиций. «Ладно», — подумал я, — «сейчас нажму CTRL+Z и все верну назад». Ну, вы поняли уже, да? Отменить это действие нельзя, поэтому пришлось перезапускать транзакцию и заново забивать все данные.
Это я уже потом прочитал всплывающую подсказу к кнопке «Удалить», где было сказано, что удалятся невыделенные позиции. Такое поведение кнопки только в этой транзакции. В остальных транзакциях кнопка «Удалить» удаляет выделенные позиции.
Сообщения об ошибках не несут вообще никакой смысловой нагрузки. Вот что может означать ошибка «Код налога V0 еще существует»? Сначала я подумал, что это какой-то кривой перевод, но английский вариант «Tax code V0 also exist» и немецкий «Es existiert noch das Steuerkennzeichen V0» тоже неинформативны. А означает она то, что код налога в табличной части не совпадает с кодом налога в шапке. Часто на профильных форумах можно найти темы «У меня такая-то ошибка. Что она означает?», в которых люди играют в угадайку, пока тот, кто уже наступил на грабли, не даст ответ.
Интерфейс никак не стандартизирован. Где-то меню слева, где-то справа. Где-то кнопки сверху, где-то снизу. Где-то вообще никаких кнопок нет, а все действия выполняются через главное меню. Где-то иконки на кнопках одни, где-то на тех же кнопках другие. Даже горячие клавиши в разных транзакциях для одних и тех же действий отличаются. И это касается не только кнопок, но и табличных частей, вкладок и т.д. – единства нет, везде всё по-разному. Видно, что каждый разработчик лепил интерфейс, как ему вздумается, и никакого контроля за этим не велось. Дизайнеров в команде не было. Похоже, это из-за того, что в момент разработки особо серьезных конкурентов на рынке не наблюдалось, поэтому решили, что нужно развивать функциональность, а интерфейс пользователи «проглотят» любой.
С этим интерфейсом можно научиться работать двумя способами: либо кто-то долго будет вас обучать этому, рассказывая тонкости каждой транзакции и показывая подводные камни, либо самостоятельно, не переставая наступать на бесконечные грабли. Чаще всего обучение проходит по комбинированному сценарию: консультанты пишут операционные инструкции с минимально необходимыми для работы сведениями, а дальше пользователь сам бродит в этом дремучем лесу, постоянно обеспечивая консультантов зарплатой обращаясь к консультантам за помощью.
В последнее время в SAP поняли, что сели попой в лужу с приходом эффективных менеджеров, избалованных айфонами и выбирающих софт по внешнему виду, нужно что-то менять в интерфейсе. Тем более, конкуренты уже давно подтянулись по функциональности. Поэтому SAP пытается делать какие-то шаги в этом направлении и создает взамен старых транзакций новые, которые называются enjoy-транзакции. Появляются какие-то новые темы оформление с кнопками в стиле Android, но пока, как говорится, «сколько на осла бантиков не вешай…».
Рассказывать о прелестях интерфейса можно бесконечно, но давайте пойдём дальше…
Складывается впечатление, что на русский язык интерфейс переводился следующим образом. Сначала в каком-нибудь Magic Gooddy перевели все фразы с немецкого на английский, потом там же с английского на русский. Затем распределили переведенные фразы между людьми и они начали их вручную перепечатывать в SAP ERP, иногда внося правки. Причем, часть людей либо вообще русский язык не понимали, либо они были настолько ленивы, что никаких правок не вносили.
Почему переводили в Magic Gooddy? Потому что не может человек перевести пункт настроек «Country-specific requirements» как «Страновые требования».
Почему перепечатывали вручную? Потому что встречаются опечатки и грамматические ошибки. Например, «Щапрос на перенос», «налогооблАжение» и «вниматИльно» явно печатали руками. Встречаются также сокращения слов, чтобы не выходить за рамки допустимой длины текста.
Почему люди не понимали русский язык? Потому что даже при перепечатывании русскоговорящий человек должен был усомниться, увидев фразу «Пушномолочная свинья-несушка» — так до определенного времени называлась программа RAIMEWMS (сейчас название уже исправили). В оригинале она называется «Eierlegende Wollmilchsau», что переводится как «Мастер на все руки», но умный Magic Gooddy посчитал, что Wollmilchsau – это 3 отдельных слова (Woll, milch, sau) и перевел фразу «Eierlegende Woll milch sau» как «Яйцо укладки шерсти молока свиноматки». Остается только гадать, как это потом превратилось в «Пушномолочная свинья-несушка».
Да-да, я всё ещё рассказываю о том самом SAP ERP, лицензии которого стоят много тысяч долларов и за внедрение которого организации выкладывают сотни миллионов рублей.
В открытом доступе нет практически никакой официальной справочной информации. Нет ни руководств пользователя, ни описания программных модулей, ни спецификаций. Хочешь научиться пользоваться SAP – добро пожаловать на малоэффективные курсы (3-5 дней) стоимостью 1500-2000$ каждый, где тебе расскажут, какую кнопку нажать. Раздаточный материал на этих курсах зачастую на английском языке. Понять что-то только из раздаточного материала можно, но очень поверхностно. Курсов много (и для пользователей, и для консультантов, и для программистов), но даже они не дают всеобъемлющую информацию. SAP не стесняется «впаривать» на курсах устаревший материал, ценность которого относительно новых версий SAP ERP равна нулю.
Большая часть знаний консультантов и разработчиков либо передается по наследству от старшего поколения к младшему, либо получается методом «тыка». Если повезет, то можно что-то найти на профильных форумах и в частных блогах, если нет – ковыряйся сам, отладчик тебе в помощь.
Если консультант находит какую-то ошибку в функционале SAP (а они встречаются в огромных количествах), то первым делом он пытается найти подходящую SAP Note (ноту) для ее исправления. Нет конкретного определения, что такое нота. Нота – это либо патч, исправляющий ошибку в стандартном функционале, либо инструкция, которую пользователь должен выполнить в системе, либо описание настроек, либо доработка функциональности под изменившееся законодательство, либо просто пояснение некоторых моментов.
Если найти нужную ноту труда не составляет, то установка может оказаться вполне нетривиальной задачей. Ноты могут быть зависимы друг от друга и перед установкой одной ноты нужно установить с десяток других нот, которые тоже имеют зависимости. В процессе установки нот может потребоваться выполнить какие-либо действия вручную. Например, принести яйцо дракона из пещеры на вершине горы. Утрирую, конечно, но порой установить ноты, исправляющие ошибки, тяжелее, чем самому эти ошибки исправить. Недавно на Гиктаймс была статья, в которой говорилось о том, что люди через чат Arch Linux устанавливали. Так вот, некоторые ноты (особенно связанные с изменением функциональности под законодательство) устанавливаются так же: люди на форуме коллективно пытаются пройти квест (так, а теперь давайте нажмем все вместе на счет три вот эту кнопку…). Причем, ноты устанавливаются в нескольких системах с одинаковой версией и везде возникают разные ошибки.
Разработка в SAP ERP осуществляется на языке ABAP. Для обращения к базе данных используются Open SQL-запросы, которые очень похожи на SQL-запросы. Синтаксис тут обсуждать не буду – субъективная вещь. Он мне не нравится, но привык к нему быстро.
Названия таблиц, полей и переменных, как и названия транзакций, никакого смысла в себе не несут. Глядя на Open SQL-запрос SELECT, невозможно даже близко догадаться, что за данные он выбирает из базы. Нужно либо заранее знать, что хранится в обрабатываемой таблице, либо по ходу действия в эту таблицу лезть через браузер данных и пытаться понять, что в ней.
В SAP предусмотрена возможность доработки стандартной функциональности. Править стандартный код, предварительно получив специальный ключ разработчика для стандартного объекта, можно, но крайне нежелательно. Вместо этого разработчику предлагается использовать так называемые USER-EXIT. По сути, это пустые функции с заранее заданными входными и выходными параметрами, разбросанные по стандартному коду. Вызываются эти функции до или после какого-то события. Для правки кода этих функций специального ключа не требуется. Позже к USER-EXIT добавилась еще одна возможность расширять стандартную функциональность – BADI. Это то же самое, что USER-EXIT, только объектно-ориентированное. Зачем оно появилось и почему, раз уж оно появилось, не отказались от USER-EXIT – мне непонятно, только лишней путаницы добавилось.
Так как никакой официальной документации по USER-EXIT и BADI нет, то, чтобы найти подходящее место, куда можно дописать свой код, нужно либо сидеть в отладчике в поисках этих пустых функций, либо штудировать форумы в надежде, что кто-то уже сталкивался с такой необходимостью. Часто бывает, что для одной и той же задачи подходят разные USER-EXIT и BADI. Из-за этого случается так, что на одном проекте разные разработчики/консультанты выбирают различные USER-EXIT/BADI, и код, который должен бы логически быть в одном месте, разбросан по нескольким местам.
Хочется еще упомянуть про отладчик. Их два: старый и новый. В старом отладчике есть функции, которых нет в новом, а в новом есть функции, которых нет в старом. Например, в старом отладчике есть функция просмотра ABAP Memory и SAP Memory, в новом – нет. Переключаться между старым и новым можно прямо в процессе отладки. Хотя слово «новый» тут не очень уместно, так как он существует уже почти 10 лет. Почему за это время его не доработали и не избавились от старого – загадка.
Складывается впечатление, что этот продукт делали какие-то другие немцы: не те, что делают BMW, Mercedes и AUDI. Процесс разработки какой-то совершенно бесконтрольный: в коде огромное множество ошибок, которые могут годами не исправляться; каждый разработчик называет переменные, как ему вздумается; обновления кривые; новые инструменты появляются недоработанными и такими остаются, пока не станут старыми; …продолжать можно долго.
Тем не менее, я не хочу, чтобы моя статья выглядела как обливание SAP грязью. У любого продукта есть плюсы и минусы. На каждый мой абзац можно написать такой же о плюсах SAP ERP и я соглашусь с ними. Но мне хочется, чтобы люди, решившие связать свою работу с SAP ERP, знали чуточку больше, чем «SAP ERP – это такая крутая немецкая программа, которая стоит много денег».