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