Не фильтрует в отчетах по наличию модуля Складской учет.
Формирую например, Галактика ERP \ Логистика \ Складской учет \ Отчеты \ Наличие \ Наличие\по складам
Ставлю фильтр по одной группе МЦ, в отчете получаю множество МЦ, в том числе не входящие в эту группу.
Возможно проявление проблемы и на других фильтрах.
Проявляется только на платформах MSSQL и Oracle, т.к. ошибка содержится в той части логики, которая завязана на использование DSQL.
Ошибка состоит в следующем
В интерфейсе L_Ostatki::Store в приватной функции function FillFiltFromPick(_pickConst: word): boolean; (код ниже) допущена ошибка.
Код: Выделить всё
function FillFiltFromPick(_pickConst: word): boolean;
{
  var sql_result, cntRec: integer;
  cntRec := 0;
  result := false;
  _loop PickFilter where (( _pickConst == PickFilter.wList ))
  {
    sql_result := sqlExecDirect('INSERT INTO pick_' + string(_pickConst) + ' (nRec) VALUES (' + ' #comp(' + string(PickFilter.cRec) + '))');
    if (sql_result = tsOk)
      cntRec++
  }
  if (cntRec > 0)
    result := true;
}
Необходимо поменять тип переменной на Longint.
При фильтрации по ОДНОЙ группе МЦ фильтрация ломается также потому, что логика сразу выбирает все МЦ, подходящие по фильтру по группе МЦ, а потом пытается закачать их в DSQL-фильтр уже не по группе МЦ, а по МЦ, и если МЦ в базе данных много, то _pickConst добирается до отрицательных значений и всё ломается.
ПИР 102.123147
Вот как можно починить до выхода патчей.
Нужно скомпилить нижеследующее счастье в компоненту L_Ostatki (#component "L_Ostatki")
Код: Выделить всё
alter interface Store 'Функция расчета остатка на дату', EscClose, Blue;
overload
  function FillFiltFromPick(_pickConst: word): boolean;
end;
function FillFiltFromPick(_pickConst: word): boolean;
{
  var sql_result : integer;
  var cntRec     : longint;
  cntRec := 0;
  result := false;
  _loop PickFilter where (( _pickConst == PickFilter.wList ))
  {
    sql_result := sqlExecDirect('INSERT INTO pick_' + string(_pickConst) + ' (nRec) VALUES (' + ' #comp(' + string(PickFilter.cRec) + '))');
    if (sql_result = tsOk)
      cntRec++
  }
  if (cntRec > 0)
    result := true;
}
end.