Борьба с копеечными разницами (свод по зарплате, свод проводок, проводки)
При сложном распределении по проводкам в конфе ЗиК образуются копеечные разницы в итоговых суммах отчетов "Свод по заработной плате" и "Свод проводок и данных налогового учета". Соответственно и разница между расчетками и сформированными проводками имеется.
При разборе полетов, оказалось, что это ошибка округления. В типовой конфе распределение идет с точностью 10 знаков после запятой, а проводки формируются с 2 знаками. И в журнале "Зарплата" результаты хранятся с 2 знаками.
После перебора возможных изменений (искал вариант с минимальными изменениями и так, чтобы легко восстанавливать после обновлений) нашел следующее решение (все изменения в глобальном модуле):
В функции "глКВыплатеЗаПериод" строку ТаблицаРаспределения.НоваяКолонка("Сумма","Число",15,10,,) исправить на ТаблицаРаспределения.НоваяКолонка("Сумма","Число",15,2,,)
В принципе, после этого все пошло нормально, но дополнительно подстраховался:
Сделал контроль
//КонтрольРаспределения
//
//Параметры
// Сумма - распределяемая сумма
// ТабЗн - таблица значений с распределением в поле "Сумма"
//
//Возвращаемое значение.
// Нет
//
//Описание
// Процедура проверяет, равна ли сумма распределенного исходной
// (может получиться в результате округления) и, в случае необходимости, изменяет распределение
// предварительно делается контроль, чтобы изменяемая сумма не стала отрицательной.
// При разнице больше 0,01 ничего не изменяется (причина отличия - другая)
//
Процедура КонтрольРаспределения(Сумма, ТабЗн)
Перем Разница, Итог;
Если ПустоеЗначение(ТабЗн)=1 Тогда
Возврат;
КонецЕсли;
Разница=Сумма-ТабЗн.Итог("Сумма");
Разница=Сумма-Итог;
Если (Разница<0.01) И (Разница>-0.01) Тогда
ТабЗн.ВыбратьСтроки();
Пока ТабЗн.ПолучитьСтроку()=1 Цикл
Если (ТабЗн.Сумма+Разница)<0 Тогда
Продолжить;
КонецЕсли;
ТабЗн.Сумма=ТабЗн.Сумма+Разница;
Прервать;
КонецЦикла;
Если Сумма<>ТабЗн.Итог("Сумма") Тогда
Сообщить("Ошибка округления.","!!!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
И в конце "глПолучитьРаспределениеРезультата" добавил строку
КонтрольРаспределения(Результат, ТаблицаРаспределения);
После этих изменений все точно до копейки.
При разборе полетов, оказалось, что это ошибка округления. В типовой конфе распределение идет с точностью 10 знаков после запятой, а проводки формируются с 2 знаками. И в журнале "Зарплата" результаты хранятся с 2 знаками.
После перебора возможных изменений (искал вариант с минимальными изменениями и так, чтобы легко восстанавливать после обновлений) нашел следующее решение (все изменения в глобальном модуле):
В функции "глКВыплатеЗаПериод" строку ТаблицаРаспределения.НоваяКолонка("Сумма","Число",15,10,,) исправить на ТаблицаРаспределения.НоваяКолонка("Сумма","Число",15,2,,)
В принципе, после этого все пошло нормально, но дополнительно подстраховался:
Сделал контроль
//КонтрольРаспределения
//
//Параметры
// Сумма - распределяемая сумма
// ТабЗн - таблица значений с распределением в поле "Сумма"
//
//Возвращаемое значение.
// Нет
//
//Описание
// Процедура проверяет, равна ли сумма распределенного исходной
// (может получиться в результате округления) и, в случае необходимости, изменяет распределение
// предварительно делается контроль, чтобы изменяемая сумма не стала отрицательной.
// При разнице больше 0,01 ничего не изменяется (причина отличия - другая)
//
Процедура КонтрольРаспределения(Сумма, ТабЗн)
Перем Разница, Итог;
Если ПустоеЗначение(ТабЗн)=1 Тогда
Возврат;
КонецЕсли;
Разница=Сумма-ТабЗн.Итог("Сумма");
Разница=Сумма-Итог;
Если (Разница<0.01) И (Разница>-0.01) Тогда
ТабЗн.ВыбратьСтроки();
Пока ТабЗн.ПолучитьСтроку()=1 Цикл
Если (ТабЗн.Сумма+Разница)<0 Тогда
Продолжить;
КонецЕсли;
ТабЗн.Сумма=ТабЗн.Сумма+Разница;
Прервать;
КонецЦикла;
Если Сумма<>ТабЗн.Итог("Сумма") Тогда
Сообщить("Ошибка округления.","!!!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
И в конце "глПолучитьРаспределениеРезультата" добавил строку
КонтрольРаспределения(Результат, ТаблицаРаспределения);
После этих изменений все точно до копейки.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Можно еще попробовать в обработке глПроводкиЗаПериод поискать все округления (функция Окр()) и где точность 2 заменить на 10.
Расхождения еще станут меньше, но в своде проводок могут вылезти колонки с нулевыми значениями.
Кстати, отчет свод проводок не идеальный, мне часто у больших клиентов попадается не учитываемые суммы НДФЛ, также он может ругаться на какую-то проводку, а у кого не правильно не говорит. Поэтому я советую сделать внутри отчета анализ с данными из журналов расчетов, а данные взять из
глПроводкиЗаПериод(ДатаАктуальности,СписокФизЛиц,ТаблицаКорреспонденций,ТаблицаУчетаННП,ТаблицаУчетаНалоговННП,Контекст,,,,0,2,СобитатьДанныеНУ);
ТаблицаКорреспонденций - и есть по людям проводки.
Мне это очень помогает.
Расхождения еще станут меньше, но в своде проводок могут вылезти колонки с нулевыми значениями.
Кстати, отчет свод проводок не идеальный, мне часто у больших клиентов попадается не учитываемые суммы НДФЛ, также он может ругаться на какую-то проводку, а у кого не правильно не говорит. Поэтому я советую сделать внутри отчета анализ с данными из журналов расчетов, а данные взять из
глПроводкиЗаПериод(ДатаАктуальности,СписокФизЛиц,ТаблицаКорреспонденций,ТаблицаУчетаННП,ТаблицаУчетаНалоговННП,Контекст,,,,0,2,СобитатьДанныеНУ);
ТаблицаКорреспонденций - и есть по людям проводки.
Мне это очень помогает.
Нда, маладцы! теперича главное - чтобы эти разницы не вылезли в квартальной или готодой отчетности ;). Пример:
Сотр1: з/п=642руб.30коп, ТФОМС(2%)=12,846 (окр. 12,85)
Сотр2: з/п=642руб.30коп, ТФОМС(2%)=12,846 (окр. 12,85)
Итого: ТФОМС(Сотр1)+ТФОМС(Сотр2) = 12,85+12,85=26,70
Налоговая база по Сотр1+Сотр2 = 642,30+642,30=1284,60. ТФОМС(2%)=25,692 (окр. 26,69)
т.о. копеечная разница всё равно вылазит в зависимости от алгоритма расчета :)))
Сотр1: з/п=642руб.30коп, ТФОМС(2%)=12,846 (окр. 12,85)
Сотр2: з/п=642руб.30коп, ТФОМС(2%)=12,846 (окр. 12,85)
Итого: ТФОМС(Сотр1)+ТФОМС(Сотр2) = 12,85+12,85=26,70
Налоговая база по Сотр1+Сотр2 = 642,30+642,30=1284,60. ТФОМС(2%)=25,692 (окр. 26,69)
т.о. копеечная разница всё равно вылазит в зависимости от алгоритма расчета :)))
ЕСН считается с точностью 4 знака - копеечные разницы обеспечены, для этого в стандартной конфе предусмотрен механизм "сброса" копеек (в хозрасчетной на 91-й).
То, что я предложил - более эффективная "ловля блох", как говорят бухгалтеры. Блохи в долях копеек.
Может 1С-ники и поправили уже. Кстати, этот алгоритм я писал на buh.ru.
То, что я предложил - более эффективная "ловля блох", как говорят бухгалтеры. Блохи в долях копеек.
Может 1С-ники и поправили уже. Кстати, этот алгоритм я писал на buh.ru.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот