Using drop command to find the impact position of a bullet, like in SoldierEPilot's example, works fine, but it always needs an external script to be executed to get the position. Here is an easier way to calculate the impact point without crashing the game (this method can be used in a single script or a function, no need for external scipts or functions to be executed.):
_crt=nearestobject[_pos,"Crater"]; // _pos is the last known position of the bullet, as with SoldierEPilot's script.
if ((format["%1", _crt])=="NOID krater") then {_pos=getpos _crt}; // checks if the string for the found object is the same as the string for the crater.
No crashes, no FPS loss. Works great, feel free to use.
CraterOnVehicle ("NOID CraterOnVehicle") can be also searched for if there is no crater on the ground. This, however, requires that, in the main config, a model has been set to class "CraterOnVehicle". (Its model is empty by default)
Older craters may still be incorrectly considered as the impact point by the script. Moving used craters to [0,0,0] with setpos works, but there won't be any visible craters on the ground. (Although a fake crater can be added to the position.) This doesn't work with CraterOnVehicles unfortunately.
Here is an example of that (Searches also for the CraterOnVehicle):
_crt=nearestobject[_pos,"Crater"];
if ((format["%1", _crt])=="NOID krater") then {_pos=getpos _crt;_crt setpos [0,0,0]} else {_crt=nearestobject[_pos,"CraterOnVehicle"];if ((format["%1", _crt])=="NOID crateronvehicle") then {_posEST=getpos _crt}};