Почему в ЗУП 2.5 после объединения баз появляется ложный долг за организацией и как восстановить движения по выплатам?

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

При объединении нескольких информационных баз конфигурации «1С:Зарплата и Управление Персоналом 2.5» с помощью типовой обработки выгрузки и загрузки данных XML нередко возникает критическая ошибка: в отчетах внезапно появляется крупный долг за организацией или за сотрудниками, уходящий корнями в старые закрытые периоды. При этом типовые документы выплат проведены, но программа их словно «не видит». Попытка просто перепровести документы прошлых лет натыкается на блокировки типовых механизмов контроля НДФЛ. Разберем детально, почему так происходит, какие механизмы платформы и конфигурации приводят к сбою, и как восстановить корректные движения взаиморасчетов с помощью программной обработки.

Выясним причины возникновения ложного сальдо

Проанализируем архитектуру подсистемы взаиморасчетов с персоналом в ЗУП 2.5. Нарушение целостности данных при объединении баз обычно обусловлено следующими факторами:

  1. Развернутое сальдо по измерению ПериодВзаиморасчетов. В регистре накопления ВзаиморасчетыСРаботникамиОрганизаций ключевую роль играет не только дата самой записи (Период), но и измерение ПериодВзаиморасчетов (всегда первое число месяца, за который начислена или выплачена сумма). Если начисление зарегистрировано за один месяц, а выплата прошла с пустым или неверным месяцем взаиморасчетов, общее математическое сальдо равно нулю, но в разрезе измерений формируются встречные остатки — одновременно долг за организацией и долг за сотрудником.
  2. Особенности загрузки через XML и поиск дублей. Обработка ВыгрузкаЗагрузкаДанныхXML работает в режиме ОбменДанными.Загрузка = Истина. При таком режиме стандартные модули проведения объектов не вызываются, движения загружаются «как есть». Последующее объединение дублей физических лиц и сотрудников нередко приводит к тому, что ссылки в шапках документов и табличных частях обновляются, а в наборах записей регистров остаются старые значения или сбиваются итоги.
  3. Рассинхронизация смежных зарплатных регистров. Расчетные листки и своды начислений строятся не только по регистру ВзаиморасчетыСРаботникамиОрганизаций, но и по регистру ЗарплатаЗаМесяцОрганизаций. Если движения выплат потеряны или искажены хотя бы в одном из них, отчетность показывает долги.
  4. Контроль хронологии удержанного НДФЛ. Попытка пакетно перепровести документы выплат (ЗарплатаКВыплатеОрганизаций) заблокирована процедурой ПроверитьХронологиюУчетаУдержанногоНДФЛ. Конфигурация выдает список ошибок о наличии более ранних или поздних документов и прерывает проведение, требуя последовательного перепроведения тысяч документов за несколько лет, что на рабочей базе недопустимо.

Диагностика состояния регистров

Прежде чем приступать к исправлению, выясним истинное состояние данных. Рассмотрим последовательность проверки:

  1. Проверим настройку учетной политики по персоналу: перейдем в меню «Предприятие» — «Настройка учета» — «Параметры учета» и проверим вкладку «Выплата зарплаты». Убедимся, какой способ регистрации выплат установлен (документами выплаты или кассовыми/банковскими ордерами), а также включен ли учет долгов в разрезе месяцев.
  2. Сформируем отчет «Универсальный отчет (по регистрам, документам, справочникам)» по регистру накопления ВзаиморасчетыСРаботникамиОрганизаций (тип данных — «Остатки и обороты»). Настроим группировки: Организация, Физлицо, ПериодВзаиморасчетов. Если в отчете видны одинаковые положительные и отрицательные суммы по разным месяцам взаиморасчетов одного сотрудника — налицо развернутое сальдо.
  3. Проверим состояние активности записей (свойство Активность) в наборах записей документов выплаты. При сбоях обмена записи могут оказаться неактивными.

Программное восстановление движений без перепроведения документов

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

Посмотрим на пример кода внешней обработки, который находит все проведенные документы ЗарплатаКВыплатеОрганизаций за проблемный период и формирует для них движения по регистру ВзаиморасчетыСРаботникамиОрганизаций, минуя блокирующий контроль НДФЛ:


ОбработкаКомментариев = глЗначениеПеременной("глОбработкаСообщений");
ОбработкаКомментариев.УдалитьСообщения();

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗарплатаКВыплате.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.ЗарплатаКВыплатеОрганизаций КАК ЗарплатаКВыплате
    |ГДЕ
    |	ЗарплатаКВыплате.Проведен = ИСТИНА
    |	И ЗарплатаКВыплате.Дата >= &ДатаНачала
    |УПОРЯДОЧИТЬ ПО
    |	ЗарплатаКВыплате.Дата ВОЗРАСТ";

Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ЭтотОбъект.ДатаНачала));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    ОбработкаКомментариев.УдалитьСообщения();
    
    ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
    Отказ = Ложь;
    
    // Вызываем типовой алгоритм формирования движений по взаиморасчетам
    ЗарплатаКВыплатеОрганизацийПереопределяемый.ПровестиВзаиморасчеты(ДокументОбъект, Отказ, "ПроведениеВзаиморасчетов");
    
    Если Не Отказ Тогда
        // Записываем сформированный набор записей в регистр
        ДокументОбъект.Движения.ВзаиморасчетыСРаботникамиОрганизаций.Записать(Истина);
    КонецЕсли;
    
    ОбработкаКомментариев.ПоказатьСообщения();
КонецЦикла;

Разберем, как работает этот алгоритм:

  1. Мы выбираем ссылки только проведенных документов ЗарплатаКВыплатеОрганизаций, начиная с указанной даты.
  2. С помощью процедуры ПровестиВзаиморасчеты модуля ЗарплатаКВыплатеОрганизацийПереопределяемый мы заполняем коллекцию движений объекта Движения.ВзаиморасчетыСРаботникамиОрганизаций строго по правилам конфигурации. При этом полная процедура ОбработкаПроведения самого документа не запускается, благодаря чему проверка удержанного НДФЛ и хронологии не срабатывает.
  3. Метод Записать(Истина) принудительно перезаписывает набор записей в базе данных, замещая пустые или поврежденные движения.

Синхронизация регистра «Зарплата за месяц организаций»

Обратим внимание на важный нюанс: если восстановить движения только по взаиморасчетам, в отчетах типа «Расчетный листок» сальдо на начало и конец месяца может по-прежнему выводиться некорректно, так как они ориентируются на регистр ЗарплатаЗаМесяцОрганизаций.

Для полного закрытия вопроса в тело цикла обработки необходимо добавить аналогичную запись набора для второго регистра:


Если ДокументОбъект.Движения.Найти("ЗарплатаЗаМесяцОрганизаций") <> Неопределено Тогда
    ДокументОбъект.Движения.ЗарплатаЗаМесяцОрганизаций.Записать(Истина);
КонецЕсли;

Пересчет итогов регистров накопления

После массовой программной перезаписи наборов движений регистров накопления таблицы итогов СУБД могут стать неактуальными. Чтобы платформа корректно рассчитала остатки на текущую дату, выполним регламентный пересчет итогов:

  1. Запустим базу данных в режиме «Конфигуратор».
  2. Перейдем в меню «Администрирование» — «Тестирование и исправление...».
  3. Установим флаг исключительно напротив пункта «Пересчет итогов», остальные флаги снимем для экономии времени.
  4. Нажмем кнопку «Выполнить» и дождемся завершения служебного процесса.

После пересчета итогов сформируем отчеты «Расчетная ведомость Т-51» и «Свод начисленной зарплаты» за текущий период. Данные по историческим выплатам будут полностью восстановлены, а фиктивная задолженность организации перед сотрудниками исчезнет.

← На главную