Как ограничить доступ к определенной номенклатуре в 1С:Управление нашей фирмой

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

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

Почему в УНФ нет штатного механизма RLS для номенклатуры?

Для начала проанализируем техническую сторону вопроса. В более мощных системах, таких как 1С:ERP или 1С:Комплексная автоматизация, существует механизм RLS (Record Level Security) — ограничение на уровне записей. В УНФ этот механизм реализован в упрощенном виде. Он работает для организаций, касс и контрагентов, но намеренно исключен для номенклатуры.

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

Разберем, какими способами можно реализовать эту задачу с помощью доработок в расширении.

Способ 1. Фильтрация динамических списков (Самый быстрый путь)

Самый простой способ «скрыть» номенклатуру — это программно наложить фильтр на формы списка и формы выбора. Мы не запрещаем доступ на уровне базы данных, но делаем товар «невидимым» для пользователя в интерфейсе.

Проанализируем ситуацию: нам нужно создать дополнительный реквизит (булево) или использовать Категории номенклатуры, чтобы пометить «секретные» товары. Далее в расширении для формы списка справочника Номенклатура в событии ПриСозданииНаСервере мы добавим код, который будет отфильтровывать эти записи.

Рассмотрим пример кода для фильтрации в расширении:


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

Этот метод хорош своей легкостью, но он не решает проблему полностью. Данные всё равно «всплывут» в отчетах или при вводе товара по строке в документе.

Способ 2. Ограничение доступа через механизм RLS в расширении

Современные версии платформы 1С:Предприятие 8.3 позволяют добавлять правила RLS непосредственно в расширениях. Это более правильный и надежный метод. Мы создаем в расширении новую роль, добавляем в нее справочник Номенклатура и прописываем шаблон ограничения.

Разберем по шагам, как это сделать:

  1. Создаем расширение и добавляем в него роль (например, ОграничениеДоступаНоменклатура).
  2. Добавляем в расширение справочник Номенклатура.
  3. В правах роли для действия Чтение устанавливаем ограничение по полям.
  4. Используем стандартный шаблон #ПоЗначениям, который позволяет привязать права к группам доступа номенклатуры или категориям.

Важно помнить: после внедрения полноценного RLS необходимо тщательно протестировать скорость работы системы, особенно при формировании отчета «Остатки товаров».

Способ 3. Перехват данных в отчетах (СКД)

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

Рассмотрим подробнее: в 1С:УНФ большинство отчетов строится на базе СКД (Схема компоновки данных). Мы можем использовать общий модуль для модификации настроек компоновки перед выполнением запроса.

Проанализируем пример логики в расширении для общего модуля:


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

Способ 4. Использование функциональных опций

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

Например, при входе пользователя система определяет его категорию доступа. Если сотрудник не имеет прав на «VIP-номенклатуру», функциональная опция отключает видимость определенных колонок или доступ к данным, помеченным определенным признаком. Однако этот метод требует серьезного изменения логики работы форм документов ЗаказПокупателя, ПриходнаяНакладная и других.

Критически важные нюансы и риски

При реализации скрытия номенклатуры мы должны учитывать следующие моменты, чтобы защита не была «дырявой»:

  1. Ввод по строке: Обязательно нужно перекрывать обработчики выбора и ввода по строке в полях ввода, иначе пользователь сможет найти товар, просто начав печатать его название.
  2. Складские документы: Если сотруднику разрешено делать «Инвентаризацию» или «Перемещение», он может увидеть излишки или остатки скрытых позиций.
  3. Регистры накопления: Данные о товарах хранятся в регистрах Запасы, Продажи, Выработка. Если у пользователя есть права на чтение этих регистров (например, через универсальный отчет), он увидит всё. Ограничивать нужно не только справочник, но и связанные регистры.
  4. Связанные организации: Если скрытая номенклатура относится к отдельному бизнес-направлению, рассмотрите вариант разделения базы на уровне организаций (штатный механизм УНФ), это самый стабильный способ. Для корректной очистки каждой копии базы от лишних сведений после такого разделения применяется выборочное удаление организаций из 1С.

Резюмируем: Полное скрытие номенклатуры в 1С:УНФ — задача трудоемкая. Если бюджет ограничен, лучше всего остановиться на фильтрации списков и основных отчетов. Если же требуется безопасность уровня банковских систем, стоит рассмотреть приобретение готовых подсистем разграничения доступа, которые интегрируются в конфигурацию и расширяют возможности стандартной БСП (Библиотеки стандартных подсистем). Для этой задачи можно использовать готовое решение для управления доступом к формам.

← На главную