09.11.2011, 16:42 | #1 |
Участник
|
Доброго дня всем!
Столкнулись в NAV 5 с проблемой. Перестала работать проверка допустимых измерений при Учете. Измерения настроены как положено, в плане счетов "кликаем" "Фин. Счет Карточка" -> Измерения. Заполняем : "Код Измерения" (например CPL), "Код Значения Измерения" (например '05.33'), "Учет Значения" (например 'Единый Код'), "Фильтр значений" (например '01*'). До недавних пор данные проверки отрабатывали на Ура, но сейчас не работают вообще и "Фин. Книга Операций" кишит проводками с неправильными измерениями. Есть ли еще какие нибудь настройки в NAV - е, влияющие на работу проверки измерений, при том, что в C/AL коде этот функционал не менялся? |
|
09.11.2011, 17:07 | #2 |
Участник
|
Подозреваю, что в стандартном функционале есть некоторые режимы, когда проводки могут формироваться в обход данной проверки. Например в 4-ке у меня была такая проблема с проводками по нереализованным курсовым разницам.
Ну и еще могут быть конфликты между фин. счетом и другим справочником, для которого определено значение измерения. Например,на счете 60-01 у измерения стоит единый код 01, а на поставщике с учетной группой, настроенной на данный фин. счет определен единый код 02. В этом случае, если мне не изменяет память, следует смотреть настройку приоритетов стандартных измерений. |
|
10.11.2011, 09:10 | #3 |
Участник
|
Как вариант:
Цитата:
Таблица Приоритет измерения по умолчанию
Список полей в таблице Здесь можно указать, каким образом в программе должны разрешаться конфликты между значениями стандартных измерений, предлагаемыми для одного и того же измерения различными источниками. В строке журнала, например, можно вводить и учетный финансовый счет, и балансирующий счет. Если заданы стандартные измерения для обоих счетов, автоматически будут предложены значения стандартных измерений для обоих счетов. В такой ситуации может оказаться, что для одного и того же измерения будут предложены разные значения, что приведет к конфликту. Такой же конфликт может возникнуть между финансовыми счетами или типами счетов в документах и журналах, а также между заголовками и строками в документах. Распределяя приоритеты между типами счетов, можно влиять на то, как в программе будут разрешаться конфликты между значениями измерений. Например, если финансовым счетам присвоен более высокий приоритет, чем клиентским, в программе в случае конфликта между значениями измерений финансового и клиентского счета будет отдаваться предпочтение финансовому счету. В строке журнала: если два счета с конфликтующими значениями измерений для стандартных измерений обладают одинаковыми приоритетами или относятся к одному типу, конфликт решается в пользу счета, введенного последним. В документе продажи или покупки: измерения заголовка обладают преимуществом над измерениями строки. |
|
10.11.2011, 11:41 | #4 |
Участник
|
Спасибо большое, попробую, отпишусь.
|
|
09.12.2011, 12:48 | #5 |
Участник
|
В общем, все прозаично получилось со Стандартными Измерениями. Мы их заполнили только на уровне одиночных Счетов, поэтому политики групп счетов не проверяются и между значениями Стандартных Измерений разных уровней конфликтов быть не должно. В случае конфликта между стандартными измерениями, которые не удается разрешить на основе установленных приоритетов, применяются следующие правила : если два счета с конфликтующими значениями Ст. Измерений имеют одинаковые приоритеты или относятся к одному типу, конфликт разрешается в пользу счета, введенного последним. Так, на примере Акта Списания в 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(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); |
|
09.12.2011, 14:50 | #6 |
Участник
|
Хм, интересная штука. А вы не проверяли, в шестерке эта ошибка воспроизводится?
А можете написать по шагам небольшой кейс, который позволит воспроизвести эту ошибку? Я так понимаю, что ошибка возникает и-за российской функциональности (вы писали про учет акта списания). Или это W1-баг? |
|
12.12.2011, 15:36 | #7 |
Участник
|
Да, конечно, тест - кейс очень простой. В 5-ом NAV-e берем Акт Списания. Выбираем Общая Бизнес Группа "@20 МФМОСТ" (для определенности). Эта бизнес группа имеет настройку "Товары Коррекция Фин. Счет" = "20.02.22.1". У Фин. Счета "20.02.22.1" в карточке настроены Измерения : CPL, "Код Значения Измерения" = "02.22", "Учет Значения" = "Единый Код", "Фильтр значений" = "02.22". В закладке Измерения Акта Списания CPL не заполняем. В строках Акта заполняем одну строку с любым товаром, относящимся к данному Счету. Жмем Учет->Учет. Акт учитывается, а должно быть сообщение об ошибке в модальном окне вида : Измерение CPL является причиной ошибки ... А насчет ошибки российской функциональности мысль интересная, но в этом случае скорее всего проверки должны отрабатывать в Фин Журнале, а они там тоже игнорируются. Или я что то не правильно понял? Но в любом случае спасибо.
|
|
12.12.2011, 16:16 | #8 |
Участник
|
Странно. Попробовал на чистой кронусовской демо-базе 50 SP1. Залез в настройку ПОСТОТЕЧ-РОЗНИЦА, Товарный Коррекция Фин. Счет 41-998. Для этого счета указал измерение по-умолчанию:
Измерение ОТДЕЛ Значение Измерения АДМ Учет значения Единый Код В строку добавил товар с общей товарной группок РОЗНИЦА (товар но. 1000). Учитываю. Ошибка про выбор измерения. Вы мне написали про то, что измерения у вас заданы для определенно счета. Общую бизнес-группу вы мне тоже написали. Но про конкретный товар не написали. Ведь при учете настройка ищется не только от общей бизнес-группы, но и еще от общей товарной группы (которая берется от товара), поэтому товар важен. Посмотрите какая у него группа и убедитесь, что вы смотрите ту настройку! |
|
13.12.2011, 14:53 | #9 |
Участник
|
В случае Акта Списания проверка измерений срабатывает, если выставить настройку конкретно для товара. Товар->Измерения->Для одного и там проставить Единый Код, то Измерения проверяются, но что случилось со счетами непонятно. А настраивать каждую карточку товара у нас никто не будет, их 300000. В C/AL коде каких то доработок не нашел и сделал свою. А Общая Товарная Группа на стандартные измерения не влияет. В ней задается Общая Настройка Учета с Фин. Счетами, которые в свою очередь уже настроены на Стандартные Измерения. Есть у меня подозрения, что внедренцы где то нахамутали, только найти это вряд ли получится.
|
|
13.12.2011, 16:28 | #10 |
Moderator
|
Цитата:
Кстати, в NAV 2009 Это ошибка исправлена, так что можно оттуда фикс взять. |
|