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