При объединении нескольких информационных баз конфигурации «1С:Зарплата и Управление Персоналом 2.5» с помощью типовой обработки выгрузки и загрузки данных XML нередко возникает критическая ошибка: в отчетах внезапно появляется крупный долг за организацией или за сотрудниками, уходящий корнями в старые закрытые периоды. При этом типовые документы выплат проведены, но программа их словно «не видит». Попытка просто перепровести документы прошлых лет натыкается на блокировки типовых механизмов контроля НДФЛ. Разберем детально, почему так происходит, какие механизмы платформы и конфигурации приводят к сбою, и как восстановить корректные движения взаиморасчетов с помощью программной обработки.
Проанализируем архитектуру подсистемы взаиморасчетов с персоналом в ЗУП 2.5. Нарушение целостности данных при объединении баз обычно обусловлено следующими факторами:
ПериодВзаиморасчетов. В регистре накопления ВзаиморасчетыСРаботникамиОрганизаций ключевую роль играет не только дата самой записи (Период), но и измерение ПериодВзаиморасчетов (всегда первое число месяца, за который начислена или выплачена сумма). Если начисление зарегистрировано за один месяц, а выплата прошла с пустым или неверным месяцем взаиморасчетов, общее математическое сальдо равно нулю, но в разрезе измерений формируются встречные остатки — одновременно долг за организацией и долг за сотрудником.ВыгрузкаЗагрузкаДанныхXML работает в режиме ОбменДанными.Загрузка = Истина. При таком режиме стандартные модули проведения объектов не вызываются, движения загружаются «как есть». Последующее объединение дублей физических лиц и сотрудников нередко приводит к тому, что ссылки в шапках документов и табличных частях обновляются, а в наборах записей регистров остаются старые значения или сбиваются итоги.ВзаиморасчетыСРаботникамиОрганизаций, но и по регистру ЗарплатаЗаМесяцОрганизаций. Если движения выплат потеряны или искажены хотя бы в одном из них, отчетность показывает долги.ЗарплатаКВыплатеОрганизаций) заблокирована процедурой ПроверитьХронологиюУчетаУдержанногоНДФЛ. Конфигурация выдает список ошибок о наличии более ранних или поздних документов и прерывает проведение, требуя последовательного перепроведения тысяч документов за несколько лет, что на рабочей базе недопустимо.Прежде чем приступать к исправлению, выясним истинное состояние данных. Рассмотрим последовательность проверки:
ВзаиморасчетыСРаботникамиОрганизаций (тип данных — «Остатки и обороты»). Настроим группировки: Организация, Физлицо, ПериодВзаиморасчетов. Если в отчете видны одинаковые положительные и отрицательные суммы по разным месяцам взаиморасчетов одного сотрудника — налицо развернутое сальдо.Активность) в наборах записей документов выплаты. При сбоях обмена записи могут оказаться неактивными.Когда перепроведение базы через интерфейс невозможно из-за блокировок учета НДФЛ, наиболее эффективным решением является точечное формирование и запись набора движений по регистру взаиморасчетов с использованием экспортных процедур общих модулей конфигурации.
Посмотрим на пример кода внешней обработки, который находит все проведенные документы ЗарплатаКВыплатеОрганизаций за проблемный период и формирует для них движения по регистру ВзаиморасчетыСРаботникамиОрганизаций, минуя блокирующий контроль НДФЛ:
ОбработкаКомментариев = глЗначениеПеременной("глОбработкаСообщений");
ОбработкаКомментариев.УдалитьСообщения();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗарплатаКВыплате.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗарплатаКВыплатеОрганизаций КАК ЗарплатаКВыплате
|ГДЕ
| ЗарплатаКВыплате.Проведен = ИСТИНА
| И ЗарплатаКВыплате.Дата >= &ДатаНачала
|УПОРЯДОЧИТЬ ПО
| ЗарплатаКВыплате.Дата ВОЗРАСТ";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ЭтотОбъект.ДатаНачала));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ОбработкаКомментариев.УдалитьСообщения();
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
Отказ = Ложь;
// Вызываем типовой алгоритм формирования движений по взаиморасчетам
ЗарплатаКВыплатеОрганизацийПереопределяемый.ПровестиВзаиморасчеты(ДокументОбъект, Отказ, "ПроведениеВзаиморасчетов");
Если Не Отказ Тогда
// Записываем сформированный набор записей в регистр
ДокументОбъект.Движения.ВзаиморасчетыСРаботникамиОрганизаций.Записать(Истина);
КонецЕсли;
ОбработкаКомментариев.ПоказатьСообщения();
КонецЦикла;
Разберем, как работает этот алгоритм:
ЗарплатаКВыплатеОрганизаций, начиная с указанной даты.ПровестиВзаиморасчеты модуля ЗарплатаКВыплатеОрганизацийПереопределяемый мы заполняем коллекцию движений объекта Движения.ВзаиморасчетыСРаботникамиОрганизаций строго по правилам конфигурации. При этом полная процедура ОбработкаПроведения самого документа не запускается, благодаря чему проверка удержанного НДФЛ и хронологии не срабатывает.Записать(Истина) принудительно перезаписывает набор записей в базе данных, замещая пустые или поврежденные движения.Обратим внимание на важный нюанс: если восстановить движения только по взаиморасчетам, в отчетах типа «Расчетный листок» сальдо на начало и конец месяца может по-прежнему выводиться некорректно, так как они ориентируются на регистр ЗарплатаЗаМесяцОрганизаций.
Для полного закрытия вопроса в тело цикла обработки необходимо добавить аналогичную запись набора для второго регистра:
Если ДокументОбъект.Движения.Найти("ЗарплатаЗаМесяцОрганизаций") <> Неопределено Тогда
ДокументОбъект.Движения.ЗарплатаЗаМесяцОрганизаций.Записать(Истина);
КонецЕсли;
После массовой программной перезаписи наборов движений регистров накопления таблицы итогов СУБД могут стать неактуальными. Чтобы платформа корректно рассчитала остатки на текущую дату, выполним регламентный пересчет итогов:
После пересчета итогов сформируем отчеты «Расчетная ведомость Т-51» и «Свод начисленной зарплаты» за текущий период. Данные по историческим выплатам будут полностью восстановлены, а фиктивная задолженность организации перед сотрудниками исчезнет.