Как реализовать ограниченный доступ менеджеру, чтобы он видел только свои счета на оплату

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

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

Способ 1. Использование штатного механизма RLS (Ограничение доступа на уровне записей)

Прежде чем приступать к программированию, проанализируем возможности типового функционала. В современных версиях 1С на базе БСП (Библиотека стандартных подсистем) предусмотрен механизм RLS. Рассмотрим, как его включить и настроить.

  1. Перейдем в раздел Настройки — Настройки пользователей и прав.
  2. Развернем подраздел Ограничение доступа на уровне записей и установим соответствующий флаг.
  3. После этого в профилях групп доступа появится возможность редактировать ограничения.

В 1С:УНФ наиболее эффективно работает ограничение не напрямую по полю Автор, а через Группы доступа контрагентов. Если мы назначим менеджера ответственным в карточке контрагента и ограничим доступ к группам контрагентов, менеджер автоматически перестанет видеть счета, выставленные «чужим» клиентам. Это «чистый» способ, который не требует написания кода и корректно поддерживается при обновлениях.

Способ 2. Программная установка отбора в списке документов через расширение

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

Для реализации этого метода создадим расширение и добавим в него форму списка заказов или счетов. Используем обработчик события ПриСозданииНаСервере. Проанализируем пример кода:


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

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

В данном примере мы используем объект ПолеКомпоновкиДанных для обращения к полю Автор. Установка свойства РежимОтображения в значение Недоступный критически важна: это гарантирует, что менеджер не сможет зайти в настройки списка и просто отключить этот фильтр.

Способ 3. Гибкая фильтрация по группам пользователей

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

Посмотрим на пример логики, которую можно внедрить в процедуру ПриОткрытии или ПриСозданииНаСервере:


ГруппаДоступаПросмотрСвоих = Справочники.ГруппыПользователей.НайтиПоНаименованию("МенеджерыОграниченные");
ПользовательВГруппе = ГруппаДоступаПросмотрСвоих.Состав.Найти(ПараметрыСеанса.ТекущийПользователь, "Пользователь");

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

Здесь мы используем метод УстановитьЭлементОтбораДинамическогоСписка из типовой библиотеки общего назначения, что делает код более лаконичным и надежным.

Способ 4. Ограничение данных в типовых отчетах

Важно помнить, что даже если вы скрыли документы из списка, менеджер может увидеть их общие суммы или детали через отчеты (например, «Продажи» или «Счета на оплату»). Чтобы ограничить данные в отчетах на базе СКД, необходимо использовать расширение с перехватом процедуры ПриКомпоновкеРезультата.

Разберем, как принудительно устанавливать параметры отбора в отчете:


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

При таком подходе при формировании отчета система автоматически добавит условие в SQL-запрос, и менеджер увидит только те цифры, к которым у него есть доступ.

Важные нюансы и риски

Проанализируем ситуацию с точки зрения производительности и бизнес-процессов:

Таким образом, мы рассмотрели различные варианты реализации задачи. Для простых случаев в 1С:УНФ лучше всего подходит штатное ограничение по контрагентам. Для более специфических требований оптимальным выбором станет использование расширений с установкой фиксированных настроек динамических списков и отчетов.

← На главную