/**
  * Вставляет в базу заполненный клиентом объект в начальном статусе.
  *
  * @param instance - заполненный экземпляр объекта
  * @return - идентификатор созданного объекта.
  */
 public Long createInstance(Instance instance) {
   ArgumentsChecker.notNull(new Argument("instance", instance));
   try (Database database = new Database(data)) {
     ru.skycelot.plicanterra.metamodel.transfer.Template template =
         findTemplate(instance.template);
     checkStatusForSameness(instance.status, template.status, template.code);
     instance.id = database.getNextInstanceSequenceValue();
     database.saveTemplateCodeOfInstance(instance.id, instance.template.code);
     instance.version = 1L;
     InsertQuery query = new InsertQuery(instance.template.code);
     query.addInlineColumn("ID", instance.id);
     query.addInlineColumn("STATUS_ID", template.status.id);
     query.addInlineColumn("VERSION", instance.version);
     processAttributes(instance.attributes, template, query);
     List<InsertQuery> joinLinks = new LinkedList<>();
     List<UpdateQuery> referencedLinks = new LinkedList<>();
     processLinks(instance.links, template, query, joinLinks, referencedLinks, instance.id);
     database.execute(query);
     for (InsertQuery linkQuery : joinLinks) {
       database.execute(linkQuery);
     }
     for (UpdateQuery linkQuery : referencedLinks) {
       database.execute(linkQuery);
     }
     return instance.id;
   } catch (IOException e) {
     throw new RuntimeException(e);
   }
 }
 private ru.skycelot.plicanterra.metamodel.transfer.Template findTemplate(Template template) {
   ArgumentsChecker.notNull(new Argument("template", template));
   ru.skycelot.plicanterra.metamodel.transfer.Template result;
   if (template.id != null) {
     result = metamodel.getTemplate(template.id);
   } else if (template.code != null) {
     result = metamodel.getTemplate(template.code);
   } else {
     throw new IllegalArgumentException("Template id or code is not specified!");
   }
   return result;
 }