В крупных торговых и производственных компаниях часто возникает задача разграничения зон ответственности менеджеров. Одной из наиболее сложных задач является ограничение доступа к документам на основании их содержимого — например, когда один отдел должен работать только с «Сыром», а другой — только с «Колбасой», и при этом они не должны видеть документы друг друга, если в них присутствуют «чужие» товары. В этой статье мы подробно разберем, как реализовать подобную логику в 1С:ERP Управление предприятием 2.4, проанализируем штатные возможности системы и рассмотрим альтернативные методы решения — есть готовый анализ прав доступа и ограничений RLS.
Рассмотрим первый и самый очевидный способ, заложенный в платформу и конфигурацию — RLS (Row Level Security) или ограничение доступа на уровне записей. Для начала разберем, как включить этот функционал. В разделе «НСИ и администрирование» необходимо перейти в «Настройки пользователей и прав» и активировать опцию «Ограничивать доступ на уровне записей».
После включения этой настройки в справочнике Номенклатура появляется возможность использования Групп доступа номенклатуры. Мы можем создать две группы: «Мясная продукция» и «Молочная продукция». Далее каждой позиции номенклатуры присваивается соответствующая группа.
Особенности работы штатного RLS:
<Объект не найден>.Проанализируем ситуацию: если ваша задача — просто скрыть товары из справочника, штатного RLS достаточно. Но если нужно скрыть весь документ Реализация товаров и услуг целиком только из-за того, что в нем есть «Колбаса», стандартных настроек «в один клик» может не хватить.
Разберем более стабильный и производительный метод, который часто применяется на практике. Если бизнес-процесс компании позволяет разделить клиентов (партнеров) по видам продукции, которую они закупают, то лучше использовать ограничение по Группам доступа партнеров.
Выясним причину, почему это эффективнее: ограничение в RLS по «шапке» документа (поле Партнер) работает значительно быстрее, чем проверка каждой строки табличной части. В ERP это стандартный функционал:
Партнеров указываем соответствующую группу.В этом случае менеджер по «Сыру» просто не увидит документы, оформленные на клиентов, покупающих «Колбасу». Это решение не требует программирования и не замедляет работу базы данных.
Рассмотрим еще один вариант — разделение прав через Виды номенклатуры. Это похоже на группы доступа, но привязано к базовой классификации товаров в системе. В профилях доступа можно настроить фильтрацию так, чтобы определенные роли имели доступ только к определенным видам.
Посмотрим на пример: если «Сыр» — это товар с типом «Товар (холодильник)», а «Колбаса» — «Товар (цех)», мы можем разграничить видимость на уровне справочника. Однако помните, что это опять же решит проблему только на уровне выбора номенклатуры и ее видимости в списках справочника, но не скроет существующие документы автоматически.
Если штатные средства не подходят и нужно именно скрывать документы в списках (поможет управление доступом и скрытие элементов в списках), проанализируем технический подход с использованием Расширений конфигурации. Это наиболее гибкий путь, позволяющий избежать изменения основной конфигурации и сохранить возможность обновления.
Суть метода заключается в перехвате запроса динамического списка (например, формы списка документов ЗаказКлиента) — для этого подойдёт настройка прав и видимости данных в списках. Мы можем программно добавить условие фильтрации. Рассмотрим пример логики, которую можно реализовать в расширении:
// В модуле формы списка документов
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определяем список запрещенных групп номенклатуры для текущего пользователя
ЗапрещенныеГруппы = ПолучитьСписокЗапрещенныхГруппAccess();
Если ЗапрещенныеГруппы.Количество() > 0 Тогда
// Добавляем условие в компоновку данных динамического списка
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписок;
// Вложенный запрос: выбираем ссылки документов, где есть запрещенная номенклатура
ЭлементОтбора.ПравоеЗначение = ПолучитьСсылкиДокументовСЗапрещеннымТоваром(ЗапрещенныеГруппы);
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Такой подход позволяет визуально скрыть «ненужные» документы от менеджера. Однако будьте осторожны: если пользователь обладает достаточными правами для построения произвольных отчетов или использования консоли запросов, он все равно сможет извлечь данные, так как на уровне базы данных (СУБД) доступ остается открытым. Этот метод является интерфейсным «костылем», а не полноценной защитой данных.
Начиная с версии 1С:ERP 2.4.7, разработчики внедрили так называемый Производительный режим RLS. Он работает иначе, чем старый механизм: вместо динамической модификации каждого запроса система заранее рассчитывает права доступа и записывает их в специальные вспомогательные таблицы (ключи доступа).
Если вы решите внедрять кастомный RLS по номенклатуре, вам придется учитывать работу этого механизма. Разберем основные сложности:
Подводя итог, можно сказать, что задачи по ограничению доступа «по строкам» всегда сложны. Разберем пошагово, как лучше поступить:
Складам решит проблему идеально и без потери производительности.RLS по номенклатуре для защиты справочника (чтобы менеджер не мог выбрать «чужой» товар в новый документ — поможет инструмент настройки произвольных ограничений без кода) и используйте фильтры в формах списков через расширения для визуальной чистоты интерфейса.Мы проанализировали ситуацию с ограничением доступа в 1С:ERP 2.4 и выяснили, что хотя прямой «галочки» для скрытия документов по товару не существует, комбинация штатных настроек и небольших доработок позволяет добиться желаемого результата без ущерба для стабильности системы.