A self complementing code for Base-10 is a code for which the complement of a given encoded digit d [0-9] will result in 9-d, the 9's complement.
To encode Base-10 numbers in binary, we need to be able to represent 10 values [0-9] which means we require 4 bits because 3 bits can represent 8 values which is not enough; 4 bits can represent 16 values, which is more than we need, but we don't have (or want) fractional bits.
There are numerous encoding schemes possible within these 4 bits, the most intuitive of which is the 8-4-2-1 scheme, or straight binary encoding of the decimal value. To encode 12 using 8-4-2-1, you would separately encode [1] and [2] as their respective binary representations [0001] and [0010].
The 9's complement is relevant in the context of binary encoding decimal/Base-10 numbers because 9 is the largest value required when encoding Base-10 numbers.
Your example implies Base-16, displayed as decimal, for which you are correctly generating the 15's complement rather than the 9's complement. 8-4-2-1 is intuitively a self complementing code for Base-16, because taking the complement of a 4 digit binary number is the same as subtracting it from 15.
The same cannot be said for a Base-10 number represented the same way, because we are representing only 10 values in 16 member code space, which is why a number of more intricate systems have been devised to generate self-complementing codes for representation of decimal numbers in 4 digit binary numbers.
Table 13.1 here: [ http://www.inf.fu-berlin.de/lehre/WS00/19504-V/Chapter1.pdf ] shows two self-complementing codes for decimal encoding, namely the 8,4,-2,-1 and excess-3 encoding schemes, and the subsequent section describes the purpose and theory behind self-complementing codes.