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