Почему в 1С:ЗУП 3.1 сумма к выплате в ведомости завышается в 10 раз при нажатии кнопки Выплатить?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Бухгалтерский учет
← На главную

В практике работы с конфигурацией 1С:Зарплата и управление персоналом, редакция 3.1 (особенно в релизе 3.1.15.139) бухгалтеры и системные администраторы могут столкнуться с аномальным поведением системы. Проблема заключается в следующем: при попытке сформировать выплату непосредственно из документа Начисление зарплаты и взносов с помощью кнопки Выплатить, итоговая сумма в созданной ведомости оказывается завышенной ровно в 10 раз. При этом, если создавать документ Ведомость в банк или Ведомость в кассу вручную через раздел «Выплаты», суммы подтягиваются корректно.

В этой статье мы подробно разберем, почему возникает такая ситуация, какие механизмы программы задействованы в этом процессе, и как поэтапно диагностировать и устранить данную ошибку.

Анализ механизмов формирования ведомостей в 1С

Для начала проанализируем, в чем заключается принципиальная разница между ручным созданием ведомости и использованием кнопки «Выплатить» внутри документа начисления. Рассмотрим эти процессы подробнее:

  1. Ручное заполнение ведомости: В этом случае система обращается к регистру накопления ЗарплатаКВыплате. Она анализирует остатки по сотрудникам, учитывая разрезы подразделений, периодов и статей финансирования. Поскольку в регистре уже зафиксированы корректные движения после проведения документа начисления, ведомость заполняется правильно.
  2. Кнопка «Выплатить»: Этот механизм работает по принципу «создания на основании». Он инициирует алгоритм, который собирает данные из оперативной памяти (из табличных частей текущего документа) и временных таблиц, которые еще могут быть не зафиксированы в базе данных окончательно. В определенных релизах, таких как 3.1.15.139, логика обработки этих временных данных содержит ошибку преобразования типов или некорректного суммирования записей.

Разберем, почему сумма увеличивается именно в 10 раз. Как показывают исследования подобных багов, это часто связано с ошибкой обработки разделителей дробной части в платформе 8.3 при передаче параметров между серверным и клиентским вызовами. Если программный код ожидает число с плавающей точкой, но получает его в формате, который интерпретируется некорректно, происходит смещение десятичного разряда.

Шаг 1. Диагностика регистров через Универсальный отчет

Прежде чем приступать к исправлению кода, нам необходимо убедиться, что данные в регистрах накопления не повреждены. Проанализируем ситуацию с помощью инструмента «Универсальный отчет».

Выполним следующие действия:

  1. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Универсальный отчет.
  2. В поле «Тип объекта» выберем Регистр накопления.
  3. В поле «Имя объекта» выберем Зарплата к выплате.
  4. Установим период, соответствующий месяцу начисления, и настроим группировку по Сотруднику и Документу-основанию.

Если в универсальном отчете мы видим правильные суммы, значит, проблема локализована именно в программной обработке формы документа Начисление зарплаты и взносов. Если же в регистре суммы уже завышены, причину нужно искать в алгоритмах расчета самого документа начисления или в корректировках прошлых периодов.

Шаг 2. Проверка регистра «Бухгалтерские взаиморасчеты с сотрудниками»

Проанализируем еще один важный регистр — Бухгалтерские взаиморасчеты с сотрудниками. Именно из него механизм кнопки «Выплатить» зачастую черпает аналитику по статьям финансирования. Посмотрим на ситуацию под другим углом: если по сотруднику (особенно по договорнику ГПХ) существуют незакрытые остатки за прошлые годы с противоположными знаками, система может попытаться «схлопнуть» их при автоматическом формировании, что приводит к непредсказуемым математическим результатам.

Проверим отсутствие дублирующих записей в регистре КадроваяИсторияСотрудниковИнтервальный. Хотя для договорников ГПХ записей там может не быть, для штатных сотрудников ошибки в интервальных регистрах часто становятся причиной некорректного распределения сумм по подразделениям.

Шаг 3. Влияние региональных настроек и кэша

Иногда корень проблемы кроется не в коде конфигурации, а в окружении платформы. Выясним причину возможного сдвига разряда. Рассмотрим влияние региональных настроек ОС:

Если на сервере 1С или на рабочем месте пользователя в качестве разделителя дробной части установлена точка вместо запятой (или наоборот), а код 1С в конкретном релизе не учитывает это при парсинге строк, число 100,00 может превратиться в 1000. Это объясняет, почему сумма возрастает именно в 10 раз.

Рекомендуется выполнить очистку кэша:

  1. Удалить базу из списка запусков 1С.
  2. Добавить её заново.
  3. Либо вручную очистить содержимое папок %AppData%\1C\1Cv8\.

Шаг 4. Анализ программного кода (для программистов)

Если вы имеете доступ к конфигуратору, стоит изучить общий модуль, отвечающий за логику заполнения ведомостей. В релизах линейки 3.1.15 это чаще всего модуль СозданиеНаОснованииЗарплатаКадры или ВыплатыЗарплатыПереопределяемый.

Найдем процедуру, которая вызывается при нажатии кнопки «Выплатить». Рассмотрим примерный фрагмент кода, где может скрываться ошибка:


// Пример упрощенного алгоритма подбора сумм
Процедура ЗаполнитьВедомостьПоОснованию(ПараметрыВыплаты) Экспорт
    ДанныеНачисления = ПолучитьДанныеИзДокумента(ПараметрыВыплаты.ДокументОснование);
    // Ошибка может быть в цикле обработки строк
    Для Каждого Строка Из ДанныеНачисления Цикл
        // Если здесь происходит повторное суммирование или неверное приведение типов
        СуммаКВыплате = СуммаКВыплате + Строка.Результат; 
    КонецЦикла;
КонецПроцедуры

Проанализируем ситуацию: в проблемных релизах ошибка возникала из-за того, что система дважды или трижды обходила одни и те же временные таблицы, суммируя данные по разным разрезам (например, по НДФЛ и по сумме на руки), не очищая предыдущие значения в переменных. Чтобы исправить это в коде, необходимо убедиться, что выборка из временных таблиц строго ограничена уникальным идентификатором текущего сеанса расчета.

Шаг 5. Обходное решение проблемы

Поскольку внесение изменений в типовую конфигурацию может снять базу с поддержки, рассмотрим наиболее эффективные «народные» способы решения:

  1. Отказ от автоматической кнопки: Самый надежный способ — приучить пользователей создавать ведомости через журнал документов Выплаты — Ведомости в банк/кассу. При нажатии кнопки Заполнить внутри новой ведомости ошибка в 10-кратном размере не проявляется, так как используется другой программный путь (Query по регистрам накопления).
  2. Перепроведение документов: Попробуйте отменить проведение документа начисления, очистить все ведомости, помеченные на удаление за этот месяц, и провести начисление заново. Это обновит записи в регистре Зарплата к выплате и может помочь алгоритму кнопки «Выплатить» отработать корректно.
  3. Обновление релиза: Данная проблема была официально признана багом и исправлена в последующих патчах и релизах (начиная с 3.1.15.174 и выше). Если есть возможность, обновите конфигурацию до актуального состояния.

Итоги и рекомендации

Мы выяснили, что десятикратное завышение суммы — это следствие программного сбоя в алгоритме формирования ведомости «на лету» из формы начисления. Это не связано с неправильным расчетом зарплаты как таковой, а является ошибкой интерфейсного механизма заполнения.

Краткий план действий при обнаружении проблемы:

Используя данный подход, вы сможете оперативно решить проблему выплаты и избежать финансовых потерь организации из-за технических ошибок программного обеспечения.

← На главную