При администрировании и сопровождении конфигурации 1С:Зарплата и управление персоналом 3.1 разработчики и консультанты часто сталкиваются с требованием заказчика: запретить пользователям редактировать вчерашние и более ранние документы, установив дату запрета «вчерашним днем». Однако при попытке ввести документ сегодняшней датой программа выдает ошибку о попадании в закрытый период.
Разберем детально, как устроен механизм даты запрета изменений в расчетных конфигурациях, почему попытка закрывать периоды подневно ломает логику программы и какими способами можно корректно решить задачу контроля оперативного ввода первички.
Проанализируем, почему типовой механизм даты запрета изменений (подсистема БСП) в 1С:ЗУП ведет себя не так, как в оперативных системах (например, в 1С:Управление торговлей):
Таким образом, использование типовой даты запрета для блокировки редактирования документов «вчерашнего дня» архитектурно некорректно.
Выделим две отдельные задачи, которые часто путают при постановке требований:
Рассмотрим практические способы реализации второй задачи без нарушения типовой логики расчета.
Для запрета корректировки ранее созданных документов внутри текущего месяца реализуем проверку через механизм расширений. Создадим роль для привилегированных пользователей (например, ПравоРедактированияДокументовПрошлыхДней) и подписку на события.
Разберем код серверной проверки в модуле подписки на событие ПередЗаписью для требуемых типов документов:
Процедура Расш_ПроверитьДатуДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Проверяем только существующие документы при интерактивной записи
Если Источник.ЭтоНовый() Или Отказ Тогда
Возврат;
КонецЕсли;
// Если у пользователя есть полные права или спец. роль — пропускаем
Если РольДоступна("ПолныеПрава")
Или РольДоступна("Расш_ПравоРедактированияДокументовПрошлыхДней") Тогда
Возврат;
КонецЕсли;
// Получаем первоначальную дату документа из базы данных
ДатаДокументаВБазе = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "Дата");
ТекущееНачалоДня = НачалоДня(ТекущаяДатаСеанса());
Если ДатаДокументаВБазе < ТекущееНачалоДня Тогда
Отказ = Истина;
ТекстСообщения = СтрШаблон(
"Редактирование документов за прошлые дни запрещено! Документ от %1.",
Формат(ДатаДокументаВБазе, "ДФ=dd.MM.yyyy")
);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, Источник.Ссылка);
КонецЕсли;
КонецПроцедуры
Для улучшения пользовательского интерфейса дополним доработку блокировкой формы в обработчике ПриЧтенииНаСервере или ПриСозданииНаСервере формы документа:
&НаСервере
Процедура Расш_ПриЧтенииНаСервереПосле(ТекущийОбъект)
Если РольДоступна("ПолныеПрава")
Или РольДоступна("Расш_ПравоРедактированияДокументовПрошлыхДней") Тогда
Возврат;
КонецЕсли;
Если ТекущийОбъект.Дата < НачалоДня(ТекущаяДатаСеанса()) Тогда
ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
В методологии 1С:ЗУП любые изменения данных прошлых периодов или проведенных документов должны выполняться не прямой перезаписью документа, а специализированными механизмами:
БольничныйЛист, Отпуск, ОплатаПоСреднемуЗаработку) предусмотрена кнопка Исправить. При нажатии создается новый экземпляр документа в текущем месяце расчета, который сторнирует старые движения и делает правильные начисления.Если цель руководства — не столько запретить ввод, сколько исключить бесконтрольное изменение задним числом, оптимальным решением является включение типового версионирования:
При записи или При проведении.Попытка настроить типовую дату запрета изменений подневно в 1С:ЗУП 3.1 противоречит расчетной архитектуре программы. Для надежной работы учета необходимо: