Почему в 1С:ЗУП дата запрета проверяется по первому числу месяца и как ограничить редактирование документов прошлых дней?

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

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

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

Архитектурные особенности механизма даты запрета в 1С:ЗУП 3.1

Проанализируем, почему типовой механизм даты запрета изменений (подсистема БСП) в 1С:ЗУП ведет себя не так, как в оперативных системах (например, в 1С:Управление торговлей):

  1. Привязка к расчетным периодам, а не к дате документа. Зарплатный учет базируется на регистрах расчета, регистрах накопления и регистрах сведений. Большинство кадрово-расчетных регистров имеют периодичность Месяц. Документ, созданный сегодня (например, 15 числа), формирует движения с периодом 1-е число текущего месяца (или период регистрации начисления).
  2. Проверка движений по регистрам. Механизм запрета изменений проверяет не только дату самого документа, но и даты всех формируемых им движений. Если установить дату запрета на вчерашний день (14-е число), то движения документа с периодом 1-го числа текущего месяца окажутся в закрытом интервале, и программа заблокирует проведение.
  3. Назначение механизма. Дата запрета редактирования создана исключительно для фиксации выверенных и закрытых учетных периодов (месяц, квартал, год), чтобы расчет зарплаты, налогов и взносов за закрытый месяц оставался неизменным.

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

Разделение двух принципиально разных задач

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

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

Рассмотрим практические способы реализации второй задачи без нарушения типовой логики расчета.

Способ 1. Реализация через расширение конфигурации (рекомендуемый)

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

Разберем код серверной проверки в модуле подписки на событие ПередЗаписью для требуемых типов документов:


Процедура Расш_ПроверитьДатуДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

    // Проверяем только существующие документы при интерактивной записи
    Если Источник.ЭтоНовый() Или Отказ Тогда
        Возврат;
    КонецЕсли;

    // Если у пользователя есть полные права или спец. роль — пропускаем
    Если РольДоступна("ПолныеПрава") 
        Или РольДоступна("Расш_ПравоРедактированияДокументовПрошлыхДней") Тогда
        Возврат;
    КонецЕсли;

    // Получаем первоначальную дату документа из базы данных
    ДатаДокументаВБазе = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "Дата");
    ТекущееНачалоДня = НачалоДня(ТекущаяДатаСеанса());

    Если ДатаДокументаВБазе < ТекущееНачалоДня Тогда
        Отказ = Истина;
        ТекстСообщения = СтрШаблон(
            "Редактирование документов за прошлые дни запрещено! Документ от %1.",
            Формат(ДатаДокументаВБазе, "ДФ=dd.MM.yyyy")
        );
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, Источник.Ссылка);
    КонецЕсли;

КонецПроцедуры

Для улучшения пользовательского интерфейса дополним доработку блокировкой формы в обработчике ПриЧтенииНаСервере или ПриСозданииНаСервере формы документа:


&НаСервере
Процедура Расш_ПриЧтенииНаСервереПосле(ТекущийОбъект)
    
    Если РольДоступна("ПолныеПрава") 
        Или РольДоступна("Расш_ПравоРедактированияДокументовПрошлыхДней") Тогда
        Возврат;
    КонецЕсли;

    Если ТекущийОбъект.Дата < НачалоДня(ТекущаяДатаСеанса()) Тогда
        ЭтаФорма.ТолькоПросмотр = Истина;
    КонецЕсли;
    
КонецПроцедуры

Способ 2. Использование типового механизма исправлений и сторнирования

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

  1. Документы-исправления. Внизу проведенных расчетных документов (например, БольничныйЛист, Отпуск, ОплатаПоСреднемуЗаработку) предусмотрена кнопка Исправить. При нажатии создается новый экземпляр документа в текущем месяце расчета, который сторнирует старые движения и делает правильные начисления.
  2. Документ «Сторнирование». Позволяет полностью отменить движения ошибочно проведенного документа без изменения исходного объекта.
  3. Организационные регламенты. Закрепление правила, по которому рядовые расчетчики имеют право только создавать новые документы, а исправление проведенных документов выполняется ведущими специалистами через ссылки исправления.

Способ 3. Аудит изменений через версионирование объектов

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

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

Резюме

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

  1. Использовать типовую дату запрета только помесячно для закрытия расчетных периодов.
  2. Для контроля оперативных изменений внутри текущего месяца использовать расширения с проверкой даты документа или типовые инструменты версионирования и механизмы документов-исправлений.
← На главную