'It\'s using **reference** on the given data dict object,
to avoid it copy it before inserting!
If data **will not** have ``_id`` field,
it will be generated (random 32 chars string)
:param data: data to insert'

def insert(self, data):

    if ('_rev' in data):
        self.__not_opened()
        raise PreconditionsException("Can't    add    record    with    forbidden    fields")
    _rev = self.create_new_rev()
    if (not ('_id' in data)):
        try:
            _id = self.id_ind.create_key()
        except:
            self.__not_opened()
            raise DatabaseException('No    id?')
    else:
        _id = data['_id']
    assert (_id is not None)
    data['_rev'] = _rev
    data['_id'] = _id
    self._insert_indexes(_rev, data)
    ret = {'_id': _id, '_rev': _rev}
    data.update(ret)
    return ret
