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