Код возврата 49

Код возврата для электронных платежей с реестром

С 01.07.2013 ЦБ РФ ввел в оборот новый платежный документ — ED108, который представляет собой электронное поручение на общую сумму с реестром (информационное письмо от 08.04.2013 МЦИ-12-2-16/1401). Данная инициатива Центробанка была связана с необходимостью реализации п. 3.9 и п. 3.15 положения ЦБ РФ от 29.06.2012 № 384-П.

С момента ввода в оборот документа ED108 РКЦ при обработке соответствующих платежных получений должен осуществлять проверку:

  • корректности указания реквизита «Вид платежа» (при использовании системы БЭСП он не должен заполняться);
  • статуса отправителя и получателя платежа (если они входят в структуру одной и той же платежной системы территориального учреждения ЦБ, то оба должны быть участниками соответствующей системы);
  • соответствия отправителя и получателя — если они работают на разных ТУ ПС Центробанка, статусу участника электронного обмена;
  • наличия у получателя лицензии — если она отозвана ЦБ, то как раз и проставляется код 2313;
  • соответствия показателя в реквизите «Сумма перевода», который указан в реестре, значениям в реквизите «Сумма» электронного платежного поручения.

Таким образом, если контроль показал, что у получателя платежа нет лицензии Центробанка, РКЦ отклоняет перевод и фиксирует в платежном поручении код возврата со значением 2313.

Подробнее о взаимодействии налогоплательщиков с банками, у которых аннулирована лицензия ЦБ, читайте в статье «Банк остался без лицензии — что с вашими налогами?».

В статье о сигналах мы рассматривали несложный механизм, позволяющий процессам в ОС реагировать на внешние события. Рассматривались способы отправки сигналов процессам при помощи kill, а также обработка поступающих сигналов в сценариях оболочки. Аналогично сигналам, коды возврата позволяют процессам взаимодействовать с вызвавшими их процессами. Эта тема частенько игнорируется пользователями, однако довольно! Сегодня мы поговорим о кодах возврата и работе с ними.

Чем являются коды возврата

Предлагаю начать наше знакомство с простой команды известной практически каждому — mv, которая перемещает файл из одного места файловой системы в другое и, возможно, переименовывает его. Как вы уже, наверное, заметили, при работе mv могут возникать ошибки в случае, если отсутствует исходный файл, или же возникли какие-то другие обстоятельства, помешавшие mv выполнить свою работу. Например:

$ mv ~/missing ~/missing2 mv: cannot stat `/home/ashep/missing’: No such file or directory

Вы видите сообщение об ошибке. Очевидно, что команда не сработала. И в то же самое время за кулисами оболочки инициализируется переменная оболочки, содержащая так называемый «код возврата» последней выполненной команды. При желании мы можем получить значение этой переменной. Попробуйте:

$ mv ~/missing ~/missing2 mv: cannot stat `/home/ashep/missing’: No such file or directory $ echo $? 1 $ echo «Test me» Test me $ echo $? 0

Если команда выполняется без ошибок, то обычно её код возврата равен нулю. После выполнения команды оболочка автоматически устанавливает значение переменно $? равным этому коду. Если же команда завершится с ошибкой, то, как правило, её код возврата будет отличным от нуля. В примере выше мы сперва пытаемся переместить несуществующий файл при помощи команды mv. Естественно, мы получаем ошибку, о чём свидетельствует сообщение самой программы, а также код возврата равный единице. Затем мы выполняем команду echo, которая завершается успешно. Её код возврата равен нулю.

Давайте теперь обратимся к info-странице документации программы mv (info coreutils mv). В конце документа есть абзац, говорящий о том, что нулевой код возврата команды означает успешное выполнение, а ненулевой — об ошибке. Небогатый выбор, скажем честно, негде развернуться душе сисадмина!

Вот grep предлагает более широкий выбор средств диагностики результатов своей работы. Фрагмент из документации: «Обычно нулевой код возврата означает, что искомые строки были найдены, и код равный единице в противном случае. Если же при запуске grep использовалась опция -q, —quiet или —silent, строки были найдены, но возникла какая-то ошибка, то возвращается код 2.»

Ниже приведён список определённых системных кодов возврата:

  • 1: общие ошибки;
  • 2: ошибки работы встроенных средств оболочки;
  • 126: невозможно вызвать запрошенную команду;
  • 127: команда не найдена;
  • 128: некорректный аргумент exit;
  • 128 + n: сигнал критической ошибки (например, kill -9 = 137);
  • 130: скрипт прерван по Ctrl+C.

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

Использование кодов возврата

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

#!/bin/bash mkdir /usr echo \$? = $? if ; then echo «mkdir /usr failed: we have an exit code of $?» exit 1 fi echo «made the requested directory. Why is ‘/’ world writable?» exit 0

Оказывается, есть нюанс при работе с переменной $?, который вызван выполнением команд, вроде echo. Взгляните на результат работы сценария:

$ ./test.sh mkdir: /usr: File exists $? = 1 made the requested directory. Why is ‘/’ world writable?

Увидели в чём проблема? Код возврата сразу после вызова mkdir равен единице, и это логично, поскольку каталог /usr существует. Но когда мы проверяем значение переменной $? в конструкции if, оказывается, что её значение равно нулю! Почему так? Потому что в этот момент значение переменной $? содержит код возврата предыдущего вызова echo, а не команды mkdir.

Получившуюся проблему можно решить, например, так:

#!/bin/bash mkdir /usr error=$? if ; then echo «mkdir /usr failed: we have an exit code of $error» exit 1 fi

Выше показан один из случаев, когда дублирование значения глобальной переменной в локальной имеет смысл. Таким образом, вы получаете возможность затем использовать сохранённое значение глобальной переменной там, где вам нужно, не заботясь о том, что её значение может измениться в результате каких-то событий.

Конечно же, обработка ошибок далеко не всегда связана лишь с выводом сообщений и завершением работы сценария. Рассмотрим сценарий, скачивающий файл с нескольких источников до тех пор, пока не будет успешно скачен:

alternates=’ http://www.example.com/test.pdf http://www.example2.com/test.pdf http://www.example3.com/test.pdf ‘ gotit=0 for file in $alternates do wget $file if ; then echo «Unable to get $file else gotit=1 break fi done