Как в 1С:Управление торговлей 10.3 ограничить права так, чтобы можно было перемещать товары на склад, но нельзя было с него списывать?

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

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

Способ 1. Проверка в модуле документа через процедуру ПередЗаписью

Самый быстрый и очевидный способ — добавить условие непосредственно в логику проведения документа. Мы проанализируем ситуацию: если склад-отправитель входит в список запрещенных для текущего пользователя, система должна прервать запись и выдать предупреждение.

Разберем реализацию в модуле объекта документа ПеремещениеТоваров. Нам необходимо найти предопределенную процедуру ПередЗаписью и вставить туда проверку. Рассмотрим пример кода:


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

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

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

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

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

Проанализируем шаги по созданию такой подписки:

  1. Создаем новый объект Подписка на событие в дереве конфигурации.
  2. В поле Источник выбираем ДокументОбъект.ПеремещениеТоваров.
  3. В поле Событие выбираем ПередЗаписью.
  4. В поле Обработчик указываем процедуру в неглобальном общем модуле.

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


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

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

Способ 3. Ограничение на уровне записей (RLS)

Механизм RLS (Row Level Security) позволяет скрыть данные или запретить их выбор на уровне SQL-запроса платформы. Это самый «чистый» способ с точки зрения безопасности, так как пользователь даже не сможет выбрать склад в поле, если на то нет прав. Однако в УТ 10.3 стандартный RLS по складам работает глобально: если склад запрещен, то его не видно ни в отправителях, ни в получателях.

Выясним причину, почему стандартный шаблон RLS нам не подходит, и как его доработать. Нам нужно изменить шаблон доступа так, чтобы он анализировал контекст использования склада. В документе ПеремещениеТоваров мы можем прописать условие в ограничении прав на Чтение или Изменение.

Пример логики запроса RLS для роли менеджера:

ГДЕ СкладОтправитель В (&СписокРазрешенныхСкладовДляСписания) ИЛИ СкладПолучатель В (&СписокВсехСкладов)

Таким образом, документ будет доступен для записи только в том случае, если поле СкладОтправитель проходит проверку по списку разрешенных «на выход» складов, в то время как СкладПолучатель может быть любым.

Способ 4. Механизм «Дополнительные права пользователей»

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

  1. Добавим новый элемент в план видов характеристик ПраваПользователей (например, «РазрешитьСписаниеСЦентральногоСклада»).
  2. В коде проверки (из Способа 1 или 2) будем обращаться к значению этого права для текущего пользователя.

Это позволит администратору системы гибко управлять доступом без изменения конфигурации в будущем, просто переключая «галочки» в интерфейсе программы.

Способ 5. Использование Групп доступа к складам

Если складов много, прописывать каждый в коде нецелесообразно. Посмотрим на ситуацию шире: в УТ 10.3 есть справочник Группы доступа к объектам. Мы можем объединить все склады, с которых запрещена отгрузка, в одну группу (например, «Только приход»).

Затем в коде проверки мы проверяем не конкретную ссылку на склад, а его принадлежность к группе:


Если Источник.СкладОтправитель.ГруппаДоступаКОбъекту = Справочники.ГруппыДоступаКОбъектам.НайтиПоНаименованию("ТолькоПриход") Тогда
    // Выполняем блокировку записи
КонецЕсли;

Способ 6. Контроль через ордерную схему

Если на предприятии используется ордерная схема документооборота, задачу можно решить организационно-техническим путем. Проанализируем этот вариант:

  1. Менеджеры имеют право создавать любые документы Перемещение товаров.
  2. На «запрещенном» складе устанавливается признак использования ордерной схемы (документ Расходный ордер на товары).
  3. Права на создание Расходного ордера ограничиваются только для определенных кладовщиков.

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

Резюме

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

← На главную