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