Почему в форме Т-6 неправильно рассчитывается количество дней отпуска в 1С:ЗУП 3.1.8?

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

При работе с конфигурацией 1С:Зарплата и управление персоналом (ЗУП) редакции 3.1.8 многие пользователи и технические специалисты столкнулись с неприятной ситуацией: при выводе на печать формы Т-6 из документа Отпуск количество дней отображается некорректно. Например, вместо положенных 36 дней программа выводит 72, 92 или даже более значительные цифры. При этом другие печатные формы, такие как Т-60 (записка-расчет), могут показывать верные данные, что вводит в заблуждение как бухгалтера, так и администратора системы.

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

Анализируем причину возникновения ошибки

Для начала выясним, почему эта проблема проявилась именно в ветке релизов 3.1.8. Начиная с этой версии, разработчики компании 1С начали масштабный перенос алгоритмов формирования печатных форм с программного формирования «в коде» на использование Системы компоновки данных (СКД). Это было сделано для унификации механизмов и упрощения кастомизации форм пользователями, однако на этапе внедрения привело к программным коллизиям.

Рассмотрим ситуацию подробнее. Когда мы открываем документ Отпуск, в котором установлены одновременно две галочки: Отпуск (основной) и Компенсация отпуска, система должна сложить эти дни для вывода в итоговую строку формы Т-6. Однако из-за ошибки в структуре запроса СКД, который обращается к регистрам расчета и метаданным документа, происходит не сложение, а неявное перемножение строк (так называемое «декартово произведение»).

Проанализируем, как это работает «под капотом»:

  1. Система делает запрос к табличной части документа или к соответствующим регистрам.
  2. Если в документе заполнено несколько периодов (например, основной отпуск за один период и компенсация за другой), запрос СКД ошибочно соединяет эти строки без должной группировки.
  3. В результате каждая строка отпуска дублируется столько раз, сколько строк компенсации найдено в запросе, и наоборот. Именно поэтому пользователи видят удвоение (72 вместо 36) или даже утроение результата.

Технические подробности ошибки №000047730

Данная проблема была официально зафиксирована в базе ошибок 1С под номером 000047730. Суть ошибки заключается в том, что в макете печатной формы Т-6 используется схема компоновки данных, запрос которой некорректно обрабатывает соединение данных об основном отпуске и компенсации.

Важно отметить, что ошибка проявляется избирательно. Если вы оформляете документ, где указан только отпуск или только компенсация, данные выводятся правильно. Конфликт возникает исключительно в «смешанных» документах. Также на масштаб проблемы может влиять наличие у сотрудника нескольких рабочих периодов или работа в обособленных подразделениях, так как это увеличивает количество записей в регистрах, которые СКД пытается «склеить».

Вариант решения №1: Обновление конфигурации

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

Если вы столкнулись с этой проблемой на релизе 3.1.8.113, вам необходимо рассмотреть переход на более свежие версии. Ошибка была исправлена в версиях:

Разберем процедуру исправления через обновление. Перед обновлением обязательно убедитесь, что у вас создана резервная копия базы данных. После установки обновления система обновит макеты СКД, и запрос будет отрабатывать корректно, правильно группируя строки отпуска и компенсации.

Вариант решения №2: Временный обход проблемы (Workaround)

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

Посмотрим на алгоритм действий:

  1. Откройте проблемный документ Отпуск.
  2. Снимите галочку Компенсация отпуска и запишите документ. Теперь печатная форма Т-6 для основного отпуска будет выводиться правильно.
  3. Создайте второй документ Отпуск (или используйте документ Увольнение, если компенсация выплачивается при увольнении), в котором укажите только дни компенсации.
  4. Распечатайте форму Т-6 из этого документа.

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

Вариант решения №3: Использование внешней печатной формы

Для программистов и системных администраторов есть еще один путь — подключение внешней печатной формы (ВПФ). Мы можем извлечь макет Т-6 из старого релиза (например, из ветки 3.1.7, где алгоритм еще не был переведен на проблемную СКД) или из версии 2.5 и адаптировать его под текущую конфигурацию.

Разберем пример логики, которую можно применить во внешней обработке для обхода ошибки СКД. Вместо того чтобы полагаться на автоматический сбор данных системой компоновки, мы можем программно подготовить таблицу данных:


// Пример упрощенной логики подготовки данных для Т-6
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("КоличествоДнейОтпуска");
ТаблицаДанных.Колонки.Добавить("КоличествоДнейКомпенсации");

// Программное заполнение из объекта документа
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.КоличествоДнейОтпуска = Объект.КоличествоДней;
НоваяСтрока.КоличествоДнейКомпенсации = Объект.КоличествоДнейКомпенсации;

// Итоговое суммирование без дублей
ИтогоДней = НоваяСтрока.КоличествоДнейОтпуска + НоваяСтрока.КоличествоДнейКомпенсации;

Подключив такую форму через раздел Администрирование -> Печатные формы, отчеты и обработки, вы сможете печатать корректные приказы, не дожидаясь окна для обновления всей системы.

Выясняем, почему Т-60 считает правильно, а Т-6 нет

Часто возникает вопрос: почему записка-расчет Т-60 выводит 36 дней, а Т-6 — 72? Проанализируем ситуацию. Дело в том, что в ЗУП 3.1.8 эти две формы обслуживаются разными механизмами формирования данных. Т-60 в тот период еще могла использовать старый программный метод формирования или другую схему СКД, в которой соединение таблиц было реализовано более грамотно (например, через левое соединение с предварительной группировкой).

Совет: Если вы видите расхождения между формами в одном и том же документе — это 100% признак ошибки в алгоритме формирования конкретной печатной формы, а не ошибка в учете или остатках отпусков. Проверять отчет Остатки отпусков в данном случае полезно только для того, чтобы убедиться, что в регистрах хранятся верные цифры (как в примере из темы, где отчет показывает 20.33 дня, а форма Т-6 выдает 92).

Заключение

Мы проанализировали критическую ошибку в ЗУП 3.1.8.113 и выяснили, что она носит сугубо технический характер и связана с несовершенством новых механизмов СКД для печатных форм. Для исправления ситуации рекомендуется обновить конфигурацию до версии 3.1.8.155 или выше. Если же обновление невозможно, используйте разделение отпуска и компенсации на два разных документа или воспользуйтесь внешними печатными формами.

← На главную