Как исправить ошибку с пустыми ячейками в табеле при корректировке командировки в том же периоде в 1С:ЗУП 3.1

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

В практической работе расчетчиков и кадровиков часто возникает необходимость скорректировать даты ранее введенной командировки. Если эта процедура выполняется в закрытом периоде, стандартный механизм исправления работает без сбоев. Однако при попытке ввести документ-исправление в том же расчетном периоде (например, в течение января корректируется январская командировка), пользователи часто сталкиваются с неприятным поведением программы. Дни, которые изначально входили в период командировки, но были исключены из него в результате исправления, в отчете Т-13 и документе «Табель» начинают отображаться пустыми значениями вместо возврата к плановой «Явке».

В рамках этой статьи мы подробно разберем, почему возникает данная проблема, проанализируем её технические причины на уровне регистров базы данных 1С и рассмотрим несколько надежных способов исправления ситуации.

Технический анализ причин ошибки («под капотом» программы)

Выясним причину, почему в типовом решении 1С:Зарплата и управление персоналом 3.1 возникает этот сбой. Проблема напрямую связана со сложным механизмом оперативного учета времени и вытеснения состояний. Данное поведение зарегистрировано фирмой 1С в качестве официальной ошибки под номером 30166304 (а также смежной ошибки 30161029).

Проанализируем цепочку событий, происходящих в системе при проведении документов:

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

Примечание: Данная ошибка практически никогда не воспроизводится на чистых или простых демонстрационных базах. Это связано с тем, что в демо-базах часто отключен детальный оперативный учет времени (нет доплат за ночные часы или командировки), из-за чего регистр накопления остаётся пустым, подписка на событие не отрабатывает, и проблема не проявляется.

Способ 1. Методологически верный подход (для пользователей)

Рассмотрим самое простое и правильное с точки зрения методологии 1С решение. Механизм создания документов-исправлений (ссылка «Исправить» в левом нижнем углу документа) спроектирован разработчиками исключительно для работы с закрытыми периодами, когда прошлый месяц уже рассчитан, выплачен и заблокирован от изменений.

Если текущий расчетный период еще открыт, пользователям категорически не рекомендуется использовать кнопку «Исправить». Вместо этого следует напрямую редактировать исходный документ Командировка.

Если кадровой службе или бухгалтерии принципиально важно сохранять историю всех изменений (так называемый «бумажный след»), настроим типовой механизм версионирования объектов по шагам:

  1. Перейдем в раздел Администрирование, далее выберем пункт Общие настройки.
  2. Раскроем группу История изменений и установим флаг Хранить историю изменений.
  3. Перейдем по ссылке Настройки и укажем для документа Командировка режим сохранения версий (например, «При записи» или «При проведении»).

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

Способ 2. Техническое решение через очистку регистра сведений (для администраторов)

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

Выполним очистку ошибочных записей в регистре сведений по следующему алгоритму:

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

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


НаборЗаписей = РегистрыСведений.ПараметрыЗарегистрированныхДанныхУчетаВремениСотрудников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Сотрудник.Установить(ВыбранныйСотрудник);
НаборЗаписей.Отбор.ДокументОснование.Установить(ИсходнаяКомандировка);

// Прочитаем существующие записи
НаборЗаписей.Прочитать();

Если НаборЗаписей.Количество() > 0 Тогда
    // Очищаем движения по ошибочному документу в текущем периоде
    НаборЗаписей.Очистить();
    НаборЗаписей.Записать();
    Сообщить("Служебные записи по первичному документу успешно удалены.");
КонецЕсли;

Способ 3. Корректный откат цепочки документов вручную

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

  1. Найдем созданный документ-исправление Командировка и полностью распроведем его.
  2. Пометим документ-исправление на удаление.
  3. Распроведем исходный (первичный) документ Командировка.
  4. Откроем первичный документ, внесем в него правильные скорректированные даты командировки и проведем его заново.
  5. Откроем документ Табель, обновим данные по сотруднику через кнопку «Заполнить» или «Пересчитать сотрудника» и убедимся, что рабочие дни заполнились корректно.

Способ 4. Временное отключение проверок соответствия времени

Иногда при исправлении кадровых документов задним числом проведение итогового табеля заблокировано системной ошибкой вида: «Вид времени Явка не совпадает с плановыми данными...». Чтобы успешно провести табель после исправления документов, применим следующую методику:

  1. Перейдем в раздел меню Настройки, затем откроем пункт Расчет зарплаты.
  2. Временно снимем флаг Проверить соответствие фактического времени плановому.
  3. Вернемся в документ Табель и проведем его. Программа запишет документ без выдачи блокирующих предупреждений.
  4. Обязательно вернемся в настройки расчета зарплаты и установим снятый флаг обратно, чтобы не нарушать логику контроля ввода данных в будущем.

Таким образом, мы детально разобрали особенности работы механизмов вытеснения времени в 1С:ЗУП 3.1. Понимание структуры регистров и соблюдение методологии работы с закрытыми и открытыми периодами позволит вам оперативно решать подобные проблемы и избегать ручных корректировок в регламентированной отчетности.

← На главную