В процессе работы с конфигурацией 1С:Зарплата и управление персоналом 3.1 расчетчики часто сталкиваются с необходимостью корректировки уже проведенных и выплаченных отпусков. Для этого в программе предусмотрен штатный механизм создания документов-исправлений. Однако при печати унифицированной формы Т-60 «Записка-расчет о предоставлении отпуска работнику» из исправленного документа может возникнуть неприятная ситуация: сумма удержанного НДФЛ в печатной форме удваивается или складывается из показателей исходного и корректирующего документов.
В этой статье мы подробно разберем технические причины такого поведения системы, проанализируем код запроса печатной формы, выясним, почему эта проблема не зависит от расчетного периода, и рассмотрим практические способы ее решения.
Представим стандартную рабочую ситуацию. По сотруднику был оформлен и рассчитан документ Отпуск. Спустя некоторое время (в том же или в следующем расчетном периоде) возникла необходимость скорректировать данные отпуска — например, из-за болезни сотрудника или отзыва из отпуска. Расчетчик нажимает ссылку «Исправить» в исходном документе и создает документ-исправление.
При формировании печатной формы Т-60 из последнего, актуального документа-исправления обнаруживается, что:
Давайте выясним, почему так происходит, обратившись к логике построения запросов в программном коде 1С.
Для того чтобы понять природу этой ошибки, проанализируем фрагмент запроса, который система использует для формирования данных печатной формы Т-60. Разработчики применили принципиально разный подход для получения обычных удержаний и для расчета налога на доходы физических лиц (НДФЛ).
Рассмотрим первую часть запроса, отвечающую за сбор информации об удержаниях и погашении займов:
|ВЫБРАТЬ
| Отпуск.Ссылка КАК Ссылка,
| УдержанияОтпуска.Удержание,
| СУММА(УдержанияОтпуска.Результат) КАК Результат
|ИЗ
| Документ.Отпуск КАК Отпуск
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Отпуск.Удержания КАК УдержанияОтпуска
| ПО Отпуск.Ссылка = УдержанияОтпуска.Ссылка
|ГДЕ
| УдержанияОтпуска.Ссылка В(&МассивОбъектов)
|
|СГРУППИРОВАТЬ ПО
| Отпуск.Ссылка,
| УдержанияОтпуска.Удержание
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ОтпускПогашениеЗаймов.Ссылка,
| "Погашение займов",
| ОтпускПогашениеЗаймов.ПогашениеЗайма + ОтпускПогашениеЗаймов.ПогашениеПроцентов + ОтпускПогашениеЗаймов.НалогНаМатериальнуюВыгоду
|ИЗ
| Документ.Отпуск.ПогашениеЗаймов КАК ОтпускПогашениеЗаймов
|ГДЕ
| ОтпускПогашениеЗаймов.Ссылка В(&МассивОбъектов)
|ИТОГИ ПО
| Ссылка
|;
Как мы видим, в данном блоке наложено жесткое ограничение по параметру &МассивОбъектов. В этот массив передается ссылка только на тот конкретный документ, из которого пользователь инициировал печать формы Т-60. Данные собираются строго по табличным частям текущего документа-исправления, поэтому удержания выводятся корректно.
Теперь обратим внимание на второй запрос в пакете, который собирает информацию по исчисленному НДФЛ:
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Отпуск.Ссылка КАК Ссылка,
| СУММА(НДФЛОтпуска.Налог) КАК Налог
|ИЗ
| ВТЦепочкаОтпусков КАК Отпуск
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Отпуск.НДФЛ КАК НДФЛОтпуска
| ПО Отпуск.ДокументЦепочки = НДФЛОтпуска.Ссылка
|
|СГРУППИРОВАТЬ ПО
| Отпуск.Ссылка
|ИТОГИ ПО
| Ссылка";
Проанализируем ключевое отличие этого запроса. Вместо обращения к табличной части конкретного документа через условие В(&МассивОбъектов), здесь происходит соединение со специальной временной таблицей ВТЦепочкаОтпусков.
В эту временную таблицу система предварительно помещает всю цепочку связанных документов: и самый первый (исходный) отпуск, и все последующие документы-исправления. В результате внутреннее соединение происходит по полю Отпуск.ДокументЦепочки = НДФЛОтпуска.Ссылка. Программа выбирает строки НДФЛ из всех документов, входящих в данную цепочку исправлений, а затем суммирует их функцией СУММА(НДФЛОтпуска.Налог). Именно это и приводит к некорректному сложению налога.
Среди расчетчиков и методологов часто возникает спор: нужно ли вообще создавать документ-исправление, если корректировка отпуска происходит внутри одного и того же расчетного периода? Некоторые специалисты утверждают, что в рамках одного периода достаточно просто перезаписать и пересчитать исходный документ без ввода исправления.
Однако на практике создавать документ-исправление внутри одного периода не только можно, но в ряде случаев и необходимо (например, если первоначальный отпуск уже был выплачен и отправлен в банк, а итоговая сумма после перерасчета уменьшилась).
Кроме того, эксперименты показывают, что создание документа-исправления в следующем расчетном периоде никак не решает проблему с печатной формой Т-60. Независимо от того, в каком месяце создано исправление, виртуальная таблица ВТЦепочкаОтпусков все равно свяжет эти документы вместе, и запрос просуммирует НДФЛ по всей цепочке.
Таким образом, мы имеем дело с зарегистрированной программной ошибкой релиза. В официальном реестре ошибок фирмы 1С этот баг зарегистрирован под номером 000048292 (внутренний код 00111102).
Важное дополнение: Точно такая же ошибка долгое время присутствовала и при формировании печатной формы Т-61 «Записка-расчет при увольнении». При создании документа-исправления для увольнения сумма удержанного НДФЛ из первоначального документа суммировалась с налогом из документа-исправления по аналогичным алгоритмам сбора цепочки документов.
Рассмотрим несколько практических способов, которые помогут обойти или полностью устранить данную ошибку в вашей информационной базе.
Самый простой и быстрый способ, не требующий привлечения программистов и изменения кода системы. Подходит в тех случаях, когда документов-исправлений в базе немного.
Отпуск.Этот способ позволяет автоматизировать процесс и избежать ручных ошибок. Мы можем скачать или разработать внешнюю печатную форму Т-60, в которой запрос по получению НДФЛ изменен. Вместо обращения к цепочке документов мы настроим получение налога напрямую из текущей ссылки.
Для исправления запроса в модуле внешней печатной формы фрагмент получения НДФЛ необходимо привести к следующему виду:
ВЫБРАТЬ
Отпуск.Ссылка КАК Ссылка,
СУММА(НДФЛОтпуска.Налог) КАК Налог
ИЗ
Документ.Отпуск КАК Отпуск
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Отпуск.НДФЛ КАК НДФЛОтпуска
ПО Отпуск.Ссылка = НДФЛОтпуска.Ссылка
ГДЕ
Отпуск.Ссылка В(&МассивОбъектов)
СГРУППИРОВАТЬ ПО
Отпуск.Ссылка
ИТОГИ ПО
Ссылка
Такая внешняя печатная форма подключается через меню НСИ и администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки и заменяет собой стандартную кнопку печати Т-60.
Если вы хотите исправить поведение системы глобально для всех пользователей, не снимая конфигурацию с поддержки, оптимальным решением станет создание небольшого расширения. В этом расширении перехватывается метод формирования данных печатной формы в модуле менеджера документа Отпуск.
В процедуре формирования запроса расширение подменяет исходный текст запроса, убирая из него обращение к ВТЦепочкаОтпусков для расчета НДФЛ и заменяя его на прямое получение данных по массиву объектов. Этот метод хорош тем, что исправление продолжит работать при последующих обновлениях конфигурации.
Поскольку ошибка официально признана фирмой 1С, разработчики исправили её в последующих релизах конфигурации 1С:ЗУП 3.1. Если у вас установлена устаревшая версия (например, релизы линейки 3.1.8, 3.1.11 или ранние сборки 3.1.14), мы рекомендуем запланировать регулярное обновление программы до актуального релиза поддержки.
В современных версиях логика работы с виртуальными таблицами цепочек исправлений переработана, и данные по НДФЛ в печатных формах Т-60 и Т-61 выводятся корректно, отражая только актуальные сведения из итоговых документов.