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