Каждый практикующий специалист по внедрению или сопровождению программных продуктов семейства 1С хотя бы раз сталкивался с ситуацией, когда в отчетах по заработной плате (например, в «Анализе зарплаты по сотрудникам» или «Расчетном листке») внезапно появляются странные долги за прошлые периоды. Самое интересное, что эти суммы дублируются: одна строка идет с плюсом, а другая — с точно таким же минусом, в результате чего общая сумма долга равна нулю. Тем не менее этот «визуальный» мусор сильно мешает работе бухгалтера, искажает отчетность по НДФЛ и мешает автоматическому заполнению ведомостей.
В этой статье мы подробно разберем, почему возникает эта проблема, как она влияет на учет налога на доходы физических лиц и какими способами — как программными, так и стандартными пользовательскими — ее можно полностью устранить.
Рассмотрим первопричину этого поведения системы. Начиная с версии 1С:ЗУП 3.1.9, разработчики существенно доработали и усложнили архитектуру аналитического учета. В три важнейших регистра накопления, которые отвечают за расчеты с персоналом и формирование ведомостей, было добавлено новое обязательное измерение — СтатьяРасходов. К этим регистрам относятся:
ВзаиморасчетыССотрудниками — основной регистр, где хранится информация о том, кто, кому и сколько должен в разрезе сотрудников, периодов и документов.БухгалтерскиеВзаиморасчетыССотрудниками — регистр, отвечающий за отражение расчетов в бухгалтерском учете.ЗарплатаКВыплате — регистр, на основании которого программа понимает, какие суммы нужно подтягивать в новые ведомости при нажатии кнопки «Заполнить».При обновлении информационной базы на новые релизы система пытается автоматически сопоставить старые движения документов с новой аналитикой и по умолчанию прописать предопределенную статью расходов — «ОТ» (Расчеты по оплате труда). Однако в старых документах начислений и выплат, которые были введены до обновления, эта аналитика физически отсутствовала либо осталась незаполненной.
Как только мы пытаемся ввести документ-исправление, перепровести старый документ или сделать выплату, программа обнаруживает несоответствие: в начислении числится пустая статья расходов, а в выплате программа требует указать конкретную статью (например, «ОТ»). Чтобы сбалансировать регистры, механизм проведения документов автоматически генерирует корректирующие (сторно) записи. Программа списывает сумму с пустой аналитики (минус) и одновременно начисляет эту же сумму на статью «ОТ» (плюс). В итоге получается нулевое сальдо к выплате, но в регистрах образуется неприятный «плюс-минус» пересорт.
Аналогичная массовая волна подобных ошибок наблюдалась и при переходе на более поздние релизы (например, 3.1.14), когда разработчики добавили в эти же регистры накопления еще одно обязательное измерение — ВидДоходаИсполнительногоПроизводства.
Многие пользователи ошибочно полагают, что если итоговая сумма долга равна нулю, то проблему можно игнорировать. Это опасное заблуждение. Проанализируем, к каким последствиям приводит не устраненный вовремя пересорт аналитики:
Перед тем как приступать к исправлению, нам необходимо точно локализовать проблему и выявить всех сотрудников, по которым пошла пересортица аналитики. Для этого настроим УниверсальныйОтчет (находится в разделе Администрирование — Обслуживание — Универсальный отчет):
ФизическоеЛицо (очень важно группировать именно по физлицу, а не по сотруднику, чтобы отловить проблемы по внутренним совместителям);СтатьяРасходов;Подразделение;ДокументВзаиморасчетов.Сформируем отчет. Если мы видим строки по одному и тому же человеку, где по пустой статье расходов висит остаток, например, -15 000 рублей, а по статье расходов «ОТ» висит +15 000 рублей — перед нами классическая пересортица аналитики, которую необходимо устранить.
Если база данных большая, а пересортица затронула сотни сотрудников за несколько лет ведения учета, ручные методы будут неэффективны. В таком случае программисту целесообразно написать внешнюю обработку, которая заполнит пустые статьи расходов в регистрах накопления. Рассмотрим пример кода, который решает эту задачу.
Алгоритм работы нашего кода следующий: мы делаем запрос к регистру накопления ВзаиморасчетыССотрудниками, выбирая все различные документы-регистраторы, где статья расходов не заполнена. Затем по каждому найденному регистратору мы считываем наборы записей трех ключевых регистров, проверяем наличие пустых значений в измерении СтатьяРасходов, заменяем их на нужную статью (например, находим статью с кодом «ОТ») и записываем наборы обратно в базу данных.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВзаиморасчетыССотрудниками.Регистратор КАК Регистратор,
| ВзаиморасчетыССотрудниками.СтатьяРасходов КАК СтатьяРасходов
|ИЗ
| РегистрНакопления.ВзаиморасчетыССотрудниками КАК ВзаиморасчетыССотрудниками
|ГДЕ
| ВзаиморасчетыССотрудниками.СтатьяРасходов = ЗНАЧЕНИЕ(Справочник.СтатьиРасходовЗарплата.ПустаяСсылка)";
Результат = Запрос.Выполнить().Выбрать();
СтатьяРасходов = Справочники.СтатьиРасходовЗарплата.НайтиПоКоду("ОТ");
Если Не ЗначениеЗаполнено(СтатьяРасходов) Тогда
ВызватьИсключение "Не найдена статья расходов с кодом 'ОТ'. Проверьте справочник!";
КонецЕсли;
Пока Результат.Следующий() Цикл
// 1. Исправление регистра "Взаиморасчеты с сотрудниками"
ВзаиморасчетыРег = РегистрыНакопления.ВзаиморасчетыССотрудниками.СоздатьНаборЗаписей();
ВзаиморасчетыРег.Отбор.Регистратор.Установить(Результат.Регистратор);
ВзаиморасчетыРег.Прочитать();
МодифицированВзаиморасчеты = Ложь;
Для каждого Запись Из ВзаиморасчетыРег Цикл
Если Не ЗначениеЗаполнено(Запись.СтатьяРасходов) Тогда
Запись.СтатьяРасходов = СтатьяРасходов;
МодифицированВзаиморасчеты = Истина;
КонецЕсли;
КонецЦикла;
Если МодифицированВзаиморасчеты Тогда
ВзаиморасчетыРег.Записать();
КонецЕсли;
// 2. Исправление регистра "Бухгалтерские взаиморасчеты с сотрудниками"
БухВзаиморасчетыРег = РегистрыНакопления.БухгалтерскиеВзаиморасчетыССотрудниками.СоздатьНаборЗаписей();
БухВзаиморасчетыРег.Отбор.Регистратор.Установить(Результат.Регистратор);
БухВзаиморасчетыРег.Прочитать();
МодифицированБух = Ложь;
Для каждого Запись Из БухВзаиморасчетыРег Цикл
Если Не ЗначениеЗаполнено(Запись.СтатьяРасходов) Тогда
Запись.СтатьяРасходов = СтатьяРасходов;
МодифицированБух = Истина;
КонецЕсли;
КонецЦикла;
Если МодифицированБух Тогда
БухВзаиморасчетыРег.Записать();
КонецЕсли;
// 3. Исправление регистра "Зарплата к выплате"
ЗарплатаКВыплатеРег = РегистрыНакопления.ЗарплатаКВыплате.СоздатьНаборЗаписей();
ЗарплатаКВыплатеРег.Отбор.Регистратор.Установить(Результат.Регистратор);
ЗарплатаКВыплатеReg.Прочитать();
МодифицированЗарплата = Ложь;
Для каждого Запись Из ЗарплатаКВыплатеРег Цикл
Если Не ЗначениеЗаполнено(Запись.СтатьяРасходов) Тогда
Запись.СтатьяРасходов = СтатьяРасходов;
МодифицированЗарплата = Истина;
КонецЕсли;
КонецЦикла;
Если МодифицированЗарплата Тогда
ЗарплатаКВыплатеРег.Записать();
КонецЕсли;
КонецЦикла;
Важное предупреждение: Перед запуском любого программного кода, напрямую модифицирующего записи регистров накопления, обязательно сделайте резервную копию базы данных! Сначала протестируйте работу алгоритма на копии, проверьте результаты по конкретному сотруднику и только потом применяйте решение на рабочей базе.
Выполнение обработки по перезаписи регистров — это лишь первый этап. Если после обновления конфигурации в базе уже проводились выплаты по документам, созданным до перехода на новые релизы, то в самих документах выплаты (ведомостях) могли зафиксироваться неверные остатки. Выясним, какие действия необходимо предпринять далее:
СтатьяРасходов значением «ОТ» во всех строках табличной части, если он остался пустым.НачислениеЗарплатыИВзносов), затем ведомости на выплату, и в самом конце — документы подтверждения выплаты (например, ПодтверждениеВыплатыЗарплатыВБанк).Обратите внимание на критически важный нюанс! Если среди проблемных сотрудников есть уволенные работники или внутренние совместители, по которым трудовые отношения уже прекращены, программа может игнорировать их при автоматическом пересчете. Это происходит потому, что в карточке сотрудника автоматически устанавливается признак завершения всех операций. Чтобы решить эту проблему:
Если у вас нет возможности запускать программный код или база находится во фреше (облаке) без прав на использование внешних обработок, выровнять учет можно стандартным, но очень эффективным пользовательским методом. Разберем его по шагам:
В результате проведения такой «технической» ведомости реальной выплаты денег сотруднику не произойдет (сумма к выплате нулевая), но регистры накопления сделают движения, которые закроют («схлопнут») зависшие остатки по разным аналитикам.
В самых сложных случаях, когда техническая ведомость по каким-то причинам не проводится или не дает нужного результата, можно внести исправления напрямую в регистры с помощью специального сервисного документа ПереносДанных. Этот инструмент доступен в разделе Администрирование — Переносы данных.
Рассмотрим порядок работы с этим документом:
ПереносДанных. Нажмите кнопку «Настройка состава регистров» на панели инструментов документа.Взаиморасчеты с сотрудниками, Бухгалтерские взаиморасчеты с сотрудниками и Зарплата к выплате.Бывает так, что бухгалтер успешно исправил регистры накопления и выровнял аналитику, но при создании нового документа «Начисление зарплаты и взносов» система упорно продолжает пытаться автоматически сторнировать прошлые периоды и снова возвращает злополучные «плюсы и минусы».
Это происходит потому, что программа зафиксировала необходимость перерасчета в специальном служебном регистре сведений. Чтобы окончательно избавиться от этой проблемы, выполним следующие действия:
Пересчет зарплаты.Очистка этого регистра заблокирует автоматическое появление лишних сторнирующих записей в новых расчетных документах и сбережет ваши нервы при закрытии последующих месяцев.
Подводя итог, отметим, что появление задолженности по зарплате с плюсом и минусом в 1С:ЗУП 3.1 — это логичное следствие эволюции аналитического учета программы. Своевременный контроль аналитики с помощью Универсального отчета и умение пользоваться техническими ведомостями или корректирующими обработками позволят вам держать базу данных в идеальном порядке, а отчетность по НДФЛ сдавать легко и без ошибок.