В общем, все прозаично получилось со Стандартными Измерениями. Мы их заполнили только на уровне одиночных Счетов, поэтому политики групп счетов не проверяются и между значениями Стандартных Измерений разных уровней конфликтов быть не должно. В случае конфликта между стандартными измерениями, которые не удается разрешить на основе установленных приоритетов, применяются следующие правила : если два счета с конфликтующими значениями Ст. Измерений имеют одинаковые приоритеты или относятся к одному типу, конфликт разрешается в пользу счета, введенного последним. Так, на примере Акта Списания в Codeunit - е 12 формируется строка "Gen. Jnl. Line" Фин. Журнала, а только в каком порядке вводятся Счета одному NAVISION - у известно и например при списании со Счета 20.02.22.1 измерение CPL в таблице Счетов настроено в "Единый Код" = 02.22, но при Учете с пустым измерением CPL ошибка не формируется. В итоге в том же Codeunit - е 12 написал функцию по проверке Стандартных Измерений. Добавил вот такой кусочек в InitGLEntry (т.е. это уже этап формирования Фин. Книги Операций):
Код:
{IF (GenJnlLine."Account Type" = GenJnlLine."Account Type"::"G/L Account") THEN BEGIN
TableID[1] := DimMgt.TypeToTableID1(GenJnlLine."Account Type"::"G/L Account");
AccNo[1] := GLAccNo;
IF NOT CheckJnlLineDimValuePosting(TempJnlLineDim,TableID[1],AccNo[1]) THEN BEGIN
IF GenJnlLine."Line No." <> 0 THEN
ERROR(
Text013,
GenJnlLine.TABLECAPTION,GenJnlLine."Journal Template Name",
GenJnlLine."Journal Batch Name",GenJnlLine."Line No.",
DimMgt.GetDimValuePostingErr);
END;
END;
и написал две функции : CheckJnlLineDimValuePosting и CheckDefaultDimensionAccount - для контроля только Фин. Счетов.
Код:
CheckJnlLineDimValuePosting(VAR JnlLineDim : Record "Journal Line Dimension";TableID : Integer;No : Code[20]) IsChecked : Boolean
TempDimBuf2.RESET;
TempDimBuf2.DELETEALL;
IF JnlLineDim.FINDSET THEN BEGIN
i := 1;
REPEAT
TempDimBuf2.INIT;
TempDimBuf2."Table ID" := DATABASE::"Journal Line Dimension";
TempDimBuf2."Dimension Code" := JnlLineDim."Dimension Code";
IF JnlLineDim."Dimension Value Code" <> '' THEN BEGIN
TempDimBuf2."Entry No." := i;
TempDimBuf2."Dimension Value Code" := JnlLineDim."Dimension Value Code";
TempDimBuf2.INSERT;
i := i + 1;
END;
IF JnlLineDim."New Dimension Value Code" <> '' THEN BEGIN
TempDimBuf2."Entry No." := i;
TempDimBuf2."Dimension Value Code" := JnlLineDim."Dimension Value Code";
TempDimBuf2.INSERT;
i := i + 1;
END;
UNTIL JnlLineDim.NEXT = 0;
END;
IF (NOT CheckDefaultDimensionAccount(TableID, No, TempDimBuf2)) THEN
EXIT (FALSE)
ELSE
EXIT (TRUE);
Код:
CheckDefaultDimensionAccount(VAR TableID : Integer;VAR No : Code[20];VAR TempDimBuf2 : Record "Dimension Buffer") IsChecked : Boolean
boolExitCode := TRUE;
recDefaultDImension.SETFILTER ( "Value Posting", '<>%1', recDefaultDImension."Value Posting"::" ");
IF ( (No <> '') AND (TableID > 0) ) THEN BEGIN
IF TableID = 15 THEN BEGIN
recDefaultDImension.SETFILTER ("Table ID", '%1', TableID);
recDefaultDImension.SETFILTER ("No.", '%1', No);
IF recDefaultDImension.FINDSET THEN BEGIN
REPEAT
TempDimBuf2.SETRANGE("Dimension Code",recDefaultDImension."Dimension Code");
CASE recDefaultDImension."Value Posting" OF
recDefaultDImension."Value Posting"::"Code Mandatory":
BEGIN
IF (NOT TempDimBuf2.FINDFIRST) OR
(TempDimBuf2."Dimension Value Code" = '') THEN BEGIN
DimValuePostingErr :=
STRSUBSTNO(
Text50008,
recDefaultDImension."Dimension Code",
recDefaultDImension."Dimension Code",
recDefaultDImension."No."
);
boolExitCode := FALSE;
ERROR ( DimValuePostingErr );
END
ELSE
BEGIN
IF recDefaultDImension.FilterValues <> '' THEN BEGIN
recDimensionValue.RESET;
recDimensionValue.FILTERGROUP (10);
recDimensionValue.SETFILTER ( "Dimension Code", '%1',
TempDimBuf2."Dimension Code");
recDimensionValue.SETFILTER ( Code,
recDefaultDImension.FilterValues );
recDimensionValue.FILTERGROUP (11);
recDimensionValue.SETFILTER ( Code, TempDimBuf2."Dimension Value Code" );
IF recDimensionValue.ISEMPTY THEN BEGIN
DimValuePostingErr :=
STRSUBSTNO(
Text50009,
recDefaultDImension."Dimension Code",
recDefaultDImension."Dimension Code",
TempDimBuf2."Dimension Value Code",
recDefaultDImension."No.",
recDefaultDImension.FIELDCAPTION (FilterValues) + ' ' + recDefaultDImension.FilterValues
);
ERROR (DimValuePostingErr);
END;
END;
END;
END;
recDefaultDImension."Value Posting"::"Same Code":
BEGIN
IF (NOT TempDimBuf2.FINDFIRST) OR
(TempDimBuf2."Dimension Value Code" = '') THEN BEGIN
DimValuePostingErr :=
STRSUBSTNO(
Text50030,
recDefaultDImension."Dimension Code",
recDefaultDImension."Dimension Code",
recDefaultDImension."No.",
recDefaultDImension."Dimension Value Code"
);
ERROR ( DimValuePostingErr );
END
ELSE
BEGIN
IF ((TempDimBuf2."Dimension Value Code" <> recDefaultDImension."Dimension Value Code") AND
(TempDimBuf2."Dimension Value Code" <> recDefaultDImension.FilterValues)) THEN
BEGIN
DimValuePostingErr :=
STRSUBSTNO (
Text50031,
recDefaultDImension."Dimension Code",
recDefaultDImension."Dimension Code",
TempDimBuf2."Dimension Value Code",
recDefaultDImension."No.",
recDefaultDImension."Dimension Value Code"
);
boolExitCode := FALSE;
ERROR ( DimValuePostingErr );
END;
END;
END;
recDefaultDImension."Value Posting"::"No Code":
BEGIN
IF TempDimBuf2.FINDFIRST THEN
BEGIN
DimValuePostingErr :=
STRSUBSTNO (
Text50032,
recDefaultDImension."Dimension Code",
recDefaultDImension."Dimension Code",
recDefaultDImension."No."
);
ERROR ( DimValuePostingErr );
END;
END;
END;
UNTIL recDefaultDImension.NEXT = 0;
END;
END;
END;
EXIT (boolExitCode);
В результате перед формирование каждой записи в Фин. Книгу будет выполнена проверка Стандартных Измерений последовательно для каждой формируемой записи, правда без учета приоритетов, но нам это и не нужно пока.