Почему дата запрета редактирования в ЗУП 3.1 ведет себя по-разному для одиночных и списочных увольнений?

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

При настройке и администрировании программы «1С:Зарплата и управление персоналом» (ЗУП 3.1) специалисты часто сталкиваются с неочевидным поведением даты запрета изменения данных. Особенно много вопросов возникает при работе с кадровыми и кадрово-расчетными документами, такими как «Увольнение» и «Увольнение списком». Официальные информационные материалы разработчиков (например, ИТС) утверждают, что документы блокируются по максимальной дате из даты документа и даты кадрового события. Однако на практике в некоторых релизах поведение программы кардинально расходится с описанием.

В этой статье мы подробно разберем, как эволюционировал алгоритм проверки дат запрета в ЗУП 3.1, почему в релизе 3.1.8 одиночный документ «Увольнение» блокировался вопреки заявленным правилам, где в программном коде крылась ошибка разработчиков и как этот механизм работает в современных версиях программы.

Эволюция логики проверки дат запрета изменения в ЗУП 3.1

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

  1. До версии 3.1.3: Система контролировала редактирование строго по дате события. Если дата приема на работу, увольнения или перевода попадала в закрытый период, программа полностью блокировала документ. Это создавало огромные трудности на практике, так как пользователи не могли отразить кадровые изменения задним числом, даже если сам корректирующий документ создавался в текущем (открытом) месяце.
  2. С версии 3.1.3 по 3.1.8: Разработчики изменили логику на противоположную — проверка стала ориентироваться исключительно на дату самого документа. Если документ создавался текущим днем, система позволяла проводить его, даже если регистрируемое событие относилось к далекому прошлому (закрытому периоду). Но возникла другая проблема: расчетчики не могли рассчитать и утвердить такое увольнение, если дата документа кадровика попадала на самый конец предыдущего месяца (который уже успели закрыть), а дата самого увольнения и период регистрации приходились на открытый будущий месяц.
  3. Начиная с версии 3.1.8: Был предложен компромиссный вариант. В кадровые и кадрово-расчетные документы разработчики внедрили скрытый служебный реквизит ДатаЗапрета. По задумке, при записи любого документа в этот реквизит должно автоматически помещаться максимальное значение из двух реквизитов: даты документа (Дата) и даты кадрового события (например, ДатаУвольнения). Блокировка должна была срабатывать только в том случае, если эта максимальная дата оказывалась меньше или равна установленной дате запрета.

Суть проблемы и несоответствия в релизе 3.1.8

Рассмотрим конкретный практический пример, с которым столкнулись пользователи. В системе установлена дата запрета редактирования для всех пользователей — 31.12.2018 (конец прошлого года без отсрочки закрытия).

Кадровый специалист создает два документа:

  1. Одиночный документ «Увольнение»: дата документа — 28.12.2018 (закрытый период), дата увольнения (события) — 14.01.2019 (открытый период), период регистрации — Январь 2019.
  2. Документ «Увольнение списком» с точно такими же параметрами: дата документа — 28.12.2018, дата увольнения сотрудника внутри списка — 14.01.2019, период регистрации — Январь 2019.

Проанализируем поведение системы под учетной записью кадровика и расчетчика:

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

Технический анализ: Ошибка в общем модуле конфигурации

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

В проблемных релизах линейки 3.1.8 (например, 3.1.8.214) для документа «Увольнение» правила проверки были настроены следующим образом:


ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.Увольнение", "Дата", "КадровыйУчет", "Организация");

Обратим внимание на третий параметр функции — "Дата". Это имя конкретного реквизита объекта, то есть стандартной даты создания документа. В данном коде нет никакого упоминания нового реквизита ДатаЗапрета или механизмов отсрочки. Система проверяет блокировку строго по дате создания одиночного увольнения (в нашем примере это 28.12.2018), игнорируя дату события.

В то же время для документа «Увольнение списком» в этой же процедуре была прописана принципиально иная строка:


ДатыЗапретаИзменения.ДобавитьСтроку(ИсточникиДанных, "Документ.УвольнениеСписком", "ДатаЗапрета", "КадровыйУчет", "Организация");

Здесь проверка корректно перенаправлена на новый служебный реквизит "ДатаЗапрета". Именно из-за этой несогласованности в коде поведение одиночных документов увольнения отличалось от списочных. Разработчики попросту забыли обновить настройки источников данных для одиночного документа «Увольнение» при внедрении новой концепции.

В модуле менеджера одиночного документа «Увольнение» при этом корректно присутствовал вызов процедуры заполнения даты запрета:

ЗаполнитьДатуЗапретаРедактирования(ОбъектДокумента, ИмяРеквизитаДатаСобытия);

Эта процедура действительно записывала в скрытое поле объекта максимальное значение между датой документа и датой увольнения. Однако из-за старой настройки в общем модуле ЗарплатаКадрыБазовый система при проведении документа обращалась к реквизиту Дата вместо заполненного реквизита ДатаЗапрета.

В последующих исправлениях и обновлениях ЗУП 3.1 эта программная ошибка была устранена, и одиночные кадровые документы также были переведены на контроль по реквизиту ДатаЗапрета.

Правило «хотя бы одна дата» в стабильных версиях ЗУП 3.1

Рассмотрим, как функционирует корректно работающий механизм проверки даты запрета изменений. В стабильных релизах ЗУП 3.1 система при проведении кадровых документов одновременно анализирует две даты: дату самого документа и дату регистрируемого кадрового события (приема, увольнения, начала отпуска).

Документ считается открытым для проведения и редактирования, если хотя бы одна из этих двух дат находится в открытом периоде (то есть превышает установленную дату запрета редактирования):

Почему блокировка кадровой части закрывает расчет для бухгалтера?

Часто возникает вопрос: почему расчетчик (бухгалтер) не может рассчитать документ увольнения, если кадровик создал его в закрытом по кадровому учету периоде, даже если расчетный период («Зарплата») еще открыт?

Кадрово-расчетные документы в ЗУП 3.1 являются едиными объектами базы данных. Они содержат реквизиты, относящиеся как к кадровому ведомству (даты, статьи увольнения), так и к расчетному (начисления, показатели, учет времени). При нажатии расчетчиком кнопок «Рассчитать» или «Утвердить» программа производит полноценную запись объекта в базу данных.

В момент записи срабатывает общая подписка на событие ПриЗаписиПроверкаЗапретаИзменения. Она выполняет проверку по всем разделам учета, к которым привязан данный документ. Если для раздела «Кадровый учет» дата документа попадает под запрет, платформа выдает отказ от записи. Бухгалтер не может сохранить свои расчеты, так как система не позволяет перезаписать «закрытый» с точки зрения кадров документ. Для проведения расчетов в таких случаях требуется временно открывать период для кадровиков либо использовать механизмы исправления документов.

Современные возможности точечной настройки контроля дат запрета

Начиная с версий ЗУП 3.1.20.71 и выше, разработчики предоставили администраторам и аналитикам мощный инструмент для кастомизации этого поведения без привлечения программистов и изменения кода конфигурации. В системе появился справочник «Разделы дат запрета изменения объектов» (его можно найти через функции технического специалиста или в меню настройки сервиса).

С помощью этого справочника мы можем гибко управлять проверками:

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

← На главную