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