Как ограничить доступ к конкретным складам для определенных пользователей в 1С:Управление торговлей 10.3

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В практике торговых компаний часто возникает ситуация, когда менеджерам или материально ответственным лицам выделяются «личные» склады (например, для выставок, выдачи образцов или работы на удаленных точках). Стандартный функционал 1С:Управление торговлей ред. 10.3 не всегда позволяет гибко настроить права доступа так, чтобы пользователь видел только «свой» склад и не мог совершать операции с чужими. Разберем подробно, какими способами можно решить эту задачу, начиная от программных доработок и заканчивая изменением методологии учета.

Способ 1. Использование механизма подписок на события

Это наиболее гибкий и рекомендуемый программный метод. Вместо того чтобы менять логику внутри каждого документа (что затруднит будущие обновления конфигурации), мы создадим Подписку на событие. Наша цель — перехватить момент записи документа ПеремещениеТоваров и проверить, имеет ли текущий пользователь право работать со складами, указанными в документе.

Рассмотрим алгоритм реализации по шагам:

  1. Добавление реквизита: В справочник Склады желательно добавить реквизит Ответственный (тип СправочникСсылка.Пользователи). Это позволит системе «понимать», за кем закреплен конкретный склад.
  2. Создание подписки: Создадим новую подписку на событие в конфигураторе. В качестве источника выберем документ ПеремещениеТоваров, событие — ПередЗаписью.
  3. Написание кода проверки: В обработчике события проанализируем поля СкладОтправитель и СкладПолучатель.

Проанализируем пример кода, который может быть размещен в модуле подписки:


Процедура ПроверитьПраваНаСкладыПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    // Получаем текущего пользователя
    ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
    
    // Если это администратор, проверку можно пропустить
    Если ТекущийПользователь.Наименование = "Администратор" Тогда
        Возврат;
    КонецЕсли;

    // Проверяем склад-отправитель
    Если ЗначениеЗаполнено(Источник.СкладОтправитель) И 
         ЗначениеЗаполнено(Источник.СкладОтправитель.Ответственный) И 
         Источник.СкладОтправитель.Ответственный <> ТекущийПользователь Тогда
        
        ОбщегоНазначения.СообщитьОбОшибке("У вас нет прав на перемещение товаров со склада: " + Источник.СкладОтправитель);
        Отказ = Истина;
    КонецЕсли;

    // Проверяем склад-получатель
    Если ЗначениеЗаполнено(Источник.СкладПолучатель) И 
         ЗначениеЗаполнено(Источник.СкладПолучатель.Ответственный) И 
         Источник.СкладПолучатель.Ответственный <> ТекущийПользователь Тогда
        
        ОбщегоНазначения.СообщитьОбОшибке("У вас нет прав на перемещение товаров на склад: " + Источник.СкладПолучатель);
        Отказ = Истина;
    КонецЕсли;

КонецПроцедуры

Важный момент: Как было отмечено в обсуждении, проверку нужно делать именно в событии ПередЗаписью. Это защитит систему от ситуации, когда пользователь пытается изменить склад в уже существующем или проведенном документе. Если мы будем проверять только при проведении, данные в базе могут быть перезаписаны без фактического движения товаров, что приведет к путанице в учете.

Способ 2. Настройка RLS (Record Level Security)

Механизм RLS позволяет ограничить видимость данных на уровне СУБД. Если настроить RLS для справочника Склады, то менеджер Сидоров в списке складов будет видеть только свой склад, а остальные 29 для него просто «исчезнут».

Разберем особенности этого подхода:

Способ 3. Изменение схемы учета: Передача на комиссию

Если «личные склады» используются для выдачи товаров сотрудникам (например, менеджер берет товар на выставку), рассмотрим альтернативный вариант без создания десятков складов. Выясним, почему схема с контрагентами может быть эффективнее.

Вместо создания склада создадим для каждого менеджера карточку в справочнике Контрагенты. Передачу товара будем оформлять документом Реализация товаров и услуг с видом операции «на комиссию».

Преимущества данного метода:

  1. Типовой контроль: В 1С уже встроены механизмы ограничения доступа по контрагентам. Можно настроить права так, чтобы менеджер видел только «свои» взаиморасчеты и свои товары.
  2. Прозрачность остатков: Вы всегда можете сформировать отчет «Товары, переданные на комиссию» и увидеть, за кем из сотрудников числится долг по ТМЦ.
  3. Возврат: Когда выставка закончилась, менеджер делает «Возврат товаров от комиссионера», и товар возвращается на основной склад.

Способ 4. Резервирование через Внутренние заказы

Посмотрим на ситуацию под другим углом: если задача состоит в том, чтобы закрепить товар за конкретным человеком, чтобы его не продал другой менеджер, можно использовать документ Внутренний заказ.

В этом случае товар остается на основном складе, но числится в резерве под конкретного «Ответственного». При этом нет необходимости плодить сущности в справочнике Склады. Если же товар физически покидает склад, ответственное лицо (кладовщик) выписывает перемещение, но контроль за тем, кто именно перемещает, возлагается на административные регламенты или программную проверку «Ответственного» в документе.

Резюме и рекомендации

Выбор метода зависит от ваших технических ресурсов и требований к производительности:

Если вы программист и вам нужно быстрое и надежное решение, используйте Подписку на событие. Это самый «чистый» способ с точки зрения кода, который не нагружает систему так сильно, как RLS.

Если вы бизнес-аналитик и хотите решить задачу без программирования, попробуйте внедрить схему с Передачей на комиссию. Это потребует обучения пользователей, но сохранит конфигурацию типовой.

Если важна полная секретность (чтобы менеджеры даже не знали о существовании других складов), придется настраивать RLS, предварительно протестировав производительность на копии базы.

← На главную