В крупных торговых и производственных компаниях часто возникает задача разграничения прав доступа сотрудников к складским данным. Классический сценарий, который в профессиональной среде называют системой «свой – чужой», формулируется следующим образом: пользователь должен беспрепятственно видеть остатки и документы по всем складам компании (для оперативной консультации клиентов или планирования логистики), но создавать, изменять и проводить документы может только по своему конкретному складу.
Решить эту задачу стандартными средствами платформы 1С не всегда просто, так как типовой механизм ограничения доступа на уровне записей (RLS — Record Level Security) по умолчанию скрывает объекты целиком. Если у пользователя нет прав на склад, он не увидит ни сам склад, ни документы по нему. В этой статье мы подробно разберем, как обойти это ограничение, настроить систему «чтение всех, запись своего», решить неизбежно возникающую проблему с перемещениями товаров и не допустить падения производительности информационной базы.
Рассмотрим по шагам все этапы реализации этой задачи в современных типовых конфигурациях 1С (ERP, Комплексная автоматизация, Управление торговлей) на базе платформы 1С:Предприятие 8.3.
Поскольку стандартное включение RLS для склада скрывает его из всех отчетов и списков, нам потребуется скомбинировать права доступа. Платформа 1С объединяет права пользователя из разных групп доступа по принципу логического ИЛИ. Это означает, что если одна роль разрешает чтение объекта, а вторая роль его запрещает — объект все равно будет доступен для чтения.
Для реализации схемы без изменения конфигурации выполним следующие действия:
Склады и всех необходимых документов (например, Чтение документов продаж, Чтение запасов и закупок).Добавление изменение документов продаж).Склады укажем значение «Ограничивать».В результате такого объединения система позволит пользователю открывать отчеты по любым складам и видеть чужие документы, но при попытке записать или провести документ по любому складу, отличному от «Склада А», платформа выдаст ошибку нарушения прав доступа.
При внедрении схемы «свой – чужой» администраторы сразу же сталкиваются с технической проблемой проведения документов межскладского перемещения. Проанализируем причину ее возникновения.
Документ ПеремещениеТоваров содержит два ключевых реквизита: СкладОтправитель и СкладПолучатель. При проведении этот документ делает движения (записи) в регистры накопления (например, Товары на складах, Выручка и себестоимость продаж) одновременно по двум складам: списывает остатки с одного и приходует на другой.
Если у кладовщика «Склада А» есть права на запись только по своему складу, система заблокирует проведение перемещения на «Склад Б», так как у пользователя нет прав на запись движений по складу-получателю. Документ просто откажется проводиться.
Выделим три практических способа решения этой проблемы:
Это наиболее правильный методологический подход, не требующий программирования. Процесс перемещения разделяется на шаги:
Заказ на перемещение или само Перемещение товаров в статусе «К отгрузке».Расходный ордер на товары. Для этого ему нужны права только на свой склад.Приходный ордер на товары. Для этого ему также требуются права только на свой склад-получатель.Перемещение оформляется не напрямую, а через промежуточный виртуальный склад (например, «Товары в пути»). Доступ на запись к этому виртуальному складу открывается для всех участников процесса. Кладовщик «Склада А» делает перемещение на транзитный склад, а получатель со «Склада Б» забирает товары с транзитного склада на свой.
Если бизнес-процесс требует проведения документов перемещения напрямую одним пользователем, программисту придется доработать шаблон ограничения доступа. В стандартном RLS условие проверяет доступность обоих складов (используется логическое И). С помощью расширения конфигурации шаблон переписывается так, чтобы запись разрешалась, если пользователю доступен хотя бы один из складов (ИЛИ отправитель, ИЛИ получатель):
// Пример логики изменения шаблона RLS для Перемещения товаров
ГДЕ ДоступенСклад(СкладОтправитель) ИЛИ ДоступенСклад(СкладПолучатель)
Многие специалисты отказываются от RLS, мотивируя это тем, что «РЛС замедляет абсолютно всё». Действительно, в старых версиях платформ (до 8.3) и конфигурациях на обычных формах (например, Управление производственным предприятием 1.3) RLS существенно замедлял работу СУБД. При каждом запросе платформа динамически дописывала к SQL-запросам сложные подзапросы с соединениями таблиц прав, что приводило к неоптимальным планам выполнения на сервере базы данных.
В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) разработан и успешно применяется Производительный режим RLS (RLS 2.0). Выясним, как он устроен:
КлючиДоступаКОбъектам, ТаблицыГруппДоступа).Важная особенность: производительный режим смещает нагрузку с чтения на запись. Сами отчеты и списки открываются мгновенно, но при записи новых документов или изменении структуры групп доступа система запускает фоновые задания для пересчета этих служебных регистров. Чтобы избежать зависания базы, необходимо регулярно следить за актуальностью индексов СУБД и регламентными заданиями очистки устаревших ключей доступа.
Включить данный режим можно в меню: НСИ и администрирование — Настройка пользователей и прав — установить флаг Ограничивать доступ на уровне записей и выбрать производительный режим работы.
Если ваша база данных работает на пределе мощностей, или если вы хотите избежать любых рисков, связанных с фоновым расчетом ключей доступа RLS, существует отличная альтернатива — программное ограничение записи документов.
Этот способ называют «мягким», так как он не скрывает данные из видимости пользователей на уровне СУБД, а лишь блокирует попытку физического изменения информации. Реализуется это с помощью небольшого расширения конфигурации.
Разберем по шагам алгоритм создания такой защиты:
ДоступныеСкладыПользователей с измерениями Пользователь и Склад.ПередЗаписью для всех документов, которые содержат реквизит Склад.Проанализируем пример программной реализации этого механизма:
&НаСервереБезКонтекста
Функция ДоступРазрешен(ТекущийПользователь, ТекущийСклад)
// Если склад не указан в документе, пропускаем проверку (или обрабатываем отдельно)
Если Не ЗначениеЗаполнено(ТекущийСклад) Тогда
Возврат Истина;
КонецЕсли;
// Запрос к нашему регистру сведений разрешенных складов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоступныеСклады.Склад КАК Склад
|ИЗ
| РегистрСведений.ДоступныеСкладыПользователей КАК ДоступныеСклады
|ГДЕ
| ДоступныеСклады.Пользователь = &Пользователь
| И ДоступныеСклады.Склад = &Склад";
Запрос.УстановитьПараметр("Пользователь", ТекущийПользователь);
Запрос.УстановитьПараметр("Склад", ТекущийСклад);
Выборка = Запрос.Выполнить().Выбрать();
Возврат Выборка.Следующий(); // Если запись найдена, значит доступ разрешен
КонецФункции
// Обработчик события ПередЗаписью для документов складского учета
Процедура ПередЗаписьюДокументаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Исключаем проверку при загрузке данных (например, через обмен)
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем наличие реквизита "Склад" у записываемого объекта
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Источник, "Склад") Тогда
ТекущийСклад = Источник.Склад;
ТекущийПользователь = Пользователи.АвторизованныйПользователь();
// Дополнительно проверяем, является ли пользователь администратором
Если РольДоступна("ПолныеПрава") Тогда
Возврат;
КонецЕсли;
Если Не ДоступРазрешен(ТекущийПользователь, ТекущийСклад) Тогда
Отказ = Истина;
ВызватьИсключение "Внимание! У вас нет прав на создание или изменение документов по складу: " + СокрЛП(ТекущийСклад);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Преимущества программного подхода:
Выбор конкретного метода зависит от масштаба вашей системы и требований к безопасности. Если политика компании категорически запрещает сотрудникам даже видеть остатки на чужих складах — используйте двойной профиль в производительном режиме RLS 2.0, предварительно оптимизировав процессы перемещения товаров через ордерную схему.
Если же главной задачей является защита от случайных или намеренных изменений чужих документов, а видимость остатков должна оставаться сквозной — смело внедряйте «мягкое» программное ограничение в расширении. Это сохранит высокую скорость работы вашей базы данных и сбережет нервы пользователям.