В практической работе расчетчиков и кадровиков часто возникает необходимость скорректировать даты ранее введенной командировки. Если эта процедура выполняется в закрытом периоде, стандартный механизм исправления работает без сбоев. Однако при попытке ввести документ-исправление в том же расчетном периоде (например, в течение января корректируется январская командировка), пользователи часто сталкиваются с неприятным поведением программы. Дни, которые изначально входили в период командировки, но были исключены из него в результате исправления, в отчете Т-13 и документе «Табель» начинают отображаться пустыми значениями вместо возврата к плановой «Явке».
В рамках этой статьи мы подробно разберем, почему возникает данная проблема, проанализируем её технические причины на уровне регистров базы данных 1С и рассмотрим несколько надежных способов исправления ситуации.
Выясним причину, почему в типовом решении 1С:Зарплата и управление персоналом 3.1 возникает этот сбой. Проблема напрямую связана со сложным механизмом оперативного учета времени и вытеснения состояний. Данное поведение зарегистрировано фирмой 1С в качестве официальной ошибки под номером 30166304 (а также смежной ошибки 30161029).
Проанализируем цепочку событий, происходящих в системе при проведении документов:
Командировка программа проверяет настройки учета времени. Если в базе ведется детальный учет (например, настроена доплата за время командировки, учитываются ночные, вечерние часы или сверхурочные), документ делает движения по регистру накопления ДанныеОперативногоУчетаРабочегоВремениСотрудников.ПараметрыЗарегистрированныхДанныхУчетаВремениСотрудников.ПараметрыЗарегистрированныхДанныхУчетаВремениСотрудников не очищаются должным образом.Примечание: Данная ошибка практически никогда не воспроизводится на чистых или простых демонстрационных базах. Это связано с тем, что в демо-базах часто отключен детальный оперативный учет времени (нет доплат за ночные часы или командировки), из-за чего регистр накопления остаётся пустым, подписка на событие не отрабатывает, и проблема не проявляется.
Рассмотрим самое простое и правильное с точки зрения методологии 1С решение. Механизм создания документов-исправлений (ссылка «Исправить» в левом нижнем углу документа) спроектирован разработчиками исключительно для работы с закрытыми периодами, когда прошлый месяц уже рассчитан, выплачен и заблокирован от изменений.
Если текущий расчетный период еще открыт, пользователям категорически не рекомендуется использовать кнопку «Исправить». Вместо этого следует напрямую редактировать исходный документ Командировка.
Если кадровой службе или бухгалтерии принципиально важно сохранять историю всех изменений (так называемый «бумажный след»), настроим типовой механизм версионирования объектов по шагам:
Командировка режим сохранения версий (например, «При записи» или «При проведении»).После активации этой настройки пользователи смогут безболезненно менять даты в исходном документе. В любой момент через меню «Еще — История изменений» можно будет посмотреть, кто, когда и какие именно данные корректировал в документе, а при необходимости — вернуться к любой из предыдущих версий.
Если пользователи уже создали цепочку исправлений внутри одного месяца и в табеле появились пустые ячейки, редактирование документов может не принести результата, так как данные в регистре сведений уже заблокированы. В этом случае потребуется ручное вмешательство в базу данных.
Выполним очистку ошибочных записей в регистре сведений по следующему алгоритму:
ПараметрыЗарегистрированныхДанныхУчетаВремениСотрудников.Табель — пустые ячейки исчезнут, и программа корректно вернет плановые дни явки.Для автоматизации этой задачи или при необходимости регулярного исправления подобных последствий, разработчик может использовать программный код для точечной очистки набора записей регистра:
НаборЗаписей = РегистрыСведений.ПараметрыЗарегистрированныхДанныхУчетаВремениСотрудников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Сотрудник.Установить(ВыбранныйСотрудник);
НаборЗаписей.Отбор.ДокументОснование.Установить(ИсходнаяКомандировка);
// Прочитаем существующие записи
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
// Очищаем движения по ошибочному документу в текущем периоде
НаборЗаписей.Очистить();
НаборЗаписей.Записать();
Сообщить("Служебные записи по первичному документу успешно удалены.");
КонецЕсли;
Если вы не хотите прибегать к прямому редактированию регистров, восстановить правильное поведение программы можно путем аккуратного удаления ошибочной цепочки документов. Проанализируем последовательность действий:
Командировка и полностью распроведем его.Командировка.Табель, обновим данные по сотруднику через кнопку «Заполнить» или «Пересчитать сотрудника» и убедимся, что рабочие дни заполнились корректно.Иногда при исправлении кадровых документов задним числом проведение итогового табеля заблокировано системной ошибкой вида: «Вид времени Явка не совпадает с плановыми данными...». Чтобы успешно провести табель после исправления документов, применим следующую методику:
Табель и проведем его. Программа запишет документ без выдачи блокирующих предупреждений.Таким образом, мы детально разобрали особенности работы механизмов вытеснения времени в 1С:ЗУП 3.1. Понимание структуры регистров и соблюдение методологии работы с закрытыми и открытыми периодами позволит вам оперативно решать подобные проблемы и избегать ручных корректировок в регламентированной отчетности.