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

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

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

Способ 1. Программный отбор в динамическом списке управляемой формы

Если задача заключается только в удобстве интерфейса (чтобы документы по определенным фирмам не мешали пользователю в повседневной работе), применим программную установку отбора в динамическом списке формы списка журнала. При этом важно не просто установить отбор, но и заблокировать возможность его изменения или отключения пользователем через стандартную команду настройки списка.

Рассмотрим по шагам реализацию в обработчике ПриСозданииНаСервере формы списка документов:

  1. Находим коллекцию элементов отбора динамического списка Список.Отбор.Элементы.
  2. Добавляем новый элемент типа ЭлементОтбораКомпоновкиДанных.
  3. Указываем левое значение отбора через Новый ПолеКомпоновкиДанных("Организация").
  4. Задаем вид сравнения — например, ВидСравненияКомпоновкиДанных.НеВСписке или ВидСравненияКомпоновкиДанных.НеРавно.
  5. Заполняем правое значение конкретной ссылкой или массивом исключаемых организаций.
  6. Активируем флаг Использование = Истина.
  7. Управляем доступностью элемента для пользователя с помощью свойства РежимОтображения.

Посмотрим на пример программного кода, который решает эту задачу:


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

Значение РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный гарантирует, что установленный отбор не появится в диалоге «Настроить список», и пользователь не сможет случайно или намеренно его отключить.

Способ 2. Использование произвольного запроса в динамическом списке

Еще один надежный вариант скрыть данные на уровне формы — перевести динамический список в режим произвольного запроса. Это позволяет жестко зафиксировать условие фильтрации в тексте запроса и передавать параметры программно.

Разберем, как это настраивается:

  1. В свойствах динамического списка включаем флаг Произвольный запрос.
  2. В текст запроса в секцию ГДЕ добавляем жесткое условие: ГДЕ НЕ Таблица.Организация В (&ИсключенныеОрганизации).
  3. В модуле формы передаем значение параметра через объект параметров списка.

Посмотрим на пример инициализации параметра в коде:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    СписокОрганизаций = Новый Массив;
    СписокОрганизаций.Добавить(ПредопределенноеЗначение("Справочник.Организации.ЗакрытаяОрганизация"));
    
    Список.Параметры.УстановитьЗначениеПараметра("ИсключенныеОрганизации", СписокОрганизаций);
    
КонецПроцедуры

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

Ограничения визуального скрытия

Проанализируем важный аспект безопасности: программный отбор в форме списка не является ограничением прав доступа. Если у пользователя есть роль с правом на чтение документа ПриходныйКассовыйОрдер, он по-прежнему сможет получить доступ к данным скрытых организаций следующими путями:

  1. Через любые типовые, универсальные или внешние отчеты, использующие регистры и документы.
  2. С помощью механизма глобального поиска платформы.
  3. Через структуру подчиненности (связанные документы) из других доступных документов.
  4. При открытии ссылок на документы из задач, бизнес-процессов или истории навигации.

Если сокрытие документов продиктовано требованиями коммерческой тайны или разграничением зон ответственности, программных фильтров в форме списка недостаточно. В таких ситуациях необходимо применять механизм RLS.

Способ 3. Ограничение доступа на уровне записей (RLS)

Механизм Record-Level Security (RLS) ограничивает выборку данных непосредственно на уровне СУБД для всех запросов текущего сеанса пользователя. Если у пользователя нет прав на чтение записей конкретной организации, он не сможет увидеть документы ни в журналах, ни в отчетах, ни через глобальный поиск.

Разберем поведение механизма прав в типовых конфигурациях (на базе Библиотеки стандартных подсистем):

  1. Логика пустого списка организаций: поведение системы при отсутствии явно указанных организаций у пользователя зависит от типа профиля групп доступа. Если вид доступа настроен по правилу «Все запрещены, исключения разрешены», пользователь без назначенных организаций не увидит ни одного документа ни по одной фирме. Если же действует правило «Все разрешены, исключения запрещены», пользователь с пустым списком исключений получит доступ ко всем организациям базы данных.
  2. Особенности отображения: если документ скрытой организации оказывается в ссылочном поле другого объекта, пользователь увидит надпись <Объект не найден>.
  3. Запросы в коде: любые запросы, выполняемые в привилегированном режиме, отобразят все данные. Однако запросы в обычном режиме без ключевого слова РАЗРЕШЕННЫЕ вызовут системную ошибку «Нарушение прав доступа» при попытке прочитать закрытую запись.

Способ 4. Реализация для обычных форм (обычное приложение)

Если проект работает на обычных формах (толстый клиент, обычный интерфейс), динамические списки не используются, а отбор настраивается через объект Отбор табличного поля, связанного со списком документов.

Посмотрим на пример реализации в процедуре ПриОткрытии формы списка:


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

Свойство Доступность = Ложь блокирует редактирование данного поля в стандартной панели отборов списка, оставляя пользователю возможность использовать остальные фильтры журнала.

← На главную