var
  autofill_direction: Boolean;

{~check_autofill_direction
  проверка системного параметра:
  расходные обязательства\автоматически заполнять РО в расходных документах.
  при этом заполняется глобальная переменная: autofill_direction.}
procedure check_autofill_direction(budgetId: String);
var
  XmlDoc: Variant;
begin
  XmlDoc := CreateOleObject('Microsoft.XmlDom');
  XmlDoc.LoadXML('<EXCH_UTILS_PROCESSOR action="get_budget_param_value" ' +
    ' BUDGET_ID="' + budgetId + '" PAGE_NAME="direction.common" PARAM_NAME="direction.autofill.in.imported.docs"/>');
  XmlDoc.LoadXML(ExecXml(XmlDoc.xml));
  autofill_direction := (XmlDoc.documentElement.getAttribute('PARAM_VALUE') = '1');
end;

procedure set_direction(id, class_id: String; replace: Boolean);
var
  isChange: Boolean;
  i, anal_kind: Integer;
  nodeName: String;
  Doc, Task, Nodes: Variant;
begin
  Doc := CreateOleObject('Microsoft.XmlDom');
  Doc.loadXml(ExecProc('DOCUMENT', ['action', 'read', 'class', class_id, 'ID', id]));

  case class_id of
    127, 128: nodeName := 'EXPASSIGNMENT';
    27, 58: nodeName := 'SOURCECHANGE';
    133, 134:
      if Doc.documentElement.selectNodes('//LINES').length > 0 then
        nodeName := 'EXPCASHPLAN'
      else
        nodeName := 'DOCUMENT';
  end;
  
  case class_id of
    127, 128, 133, 134: anal_kind := 2;
    27, 58: anal_kind := 3;
  end;

  Task := CreateOleObject('Microsoft.XmlDom');
  Task := Task.appendChild(Task.createElement('PL_DIRECTION'));
  Task.setAttribute('action', 'fill_direction_editing');
  Task.setAttribute('ANAL_KIND', anal_kind);
  Task.setAttribute('IS_REPLACE', IfThen(replace, 1, 0));
  // exchange #2422
  // требуется передать класс документа
  Task.setAttribute('DOC_CLASS', class_id);
  { exchange #2422
    для классов, у которых код цели в доходах и источниках передается не
    через поле PURPOSEFULGRAND_ID (доходы) и PURPOSEFULGRANI_ID (источники),
    а по старому - в поле PURPOSEFULGRAN_ID, требуется наличие атрибута
    OLD_PG со значением "1".}
  case class_id of
    58: Task.setAttribute('OLD_PG', '1');
  end;

  Nodes := Doc.documentElement.selectNodes('//' + nodeName + '[@ID!='''']');
  for i := 0 to Nodes.length - 1 do
  begin
    Nodes.items[i].setAttribute('ROW_ID', i);
    Task.appendChild(Nodes.items[i].cloneNode(False));
  end;

  Task := Task.ownerDocument;
  Task.loadXml(ExecXml(Task.xml));

  isChange := False;

  Task := Task.documentElement.childNodes;
  for i := 0 to Task.length - 1 do
  begin
    Nodes := Doc.documentElement.selectNodes('//' + nodeName + '[@ROW_ID=' +
      Task.items[i].getAttribute('ROW_ID') + ']');
    Nodes := Nodes.items[0];
    if ((Nodes.getAttribute('DIRECTION_ID') <>
      Task.items[i].getAttribute('DIRECTION_ID')) and
      (Task.items[i].getAttribute('DIRECTION_ID') <> '')) then
      isChange := True;
    Nodes.setAttribute('DIRECTION_ID', Task.items[i].getAttribute('DIRECTION_ID'));
  end;

  if isChange then
  begin
    Doc := Doc.documentElement;
    Doc.setAttribute('action', 'update');
    Doc.setAttribute('class', class_id);
    Doc := Doc.ownerDocument;
    ExecXml(Doc.xml);
  end;

end;

begin
end.