Как скрыть определенные виды документов от пользователей в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Архитектурные ограничения платформы 1С 7.7

Выясним причину, по которой стандартная настройка прав не скрывает строки в общем журнале:

  1. Устройство общего журнала: Таблица _1SJOURN на уровне базы данных содержит сводную информацию обо всех документах. Стандартный объект метаданных «Общий журнал документов» выводит все зарегистрированные виды документов без возможности исключить один из них на уровне структуры.
  2. Ограничения метода УстановитьОтбор(): Штатный механизм отборов в 1С 7.7 поддерживает фильтрацию только по точному совпадению с одним конкретным значением. Задать отбор по списку разрешенных видов или условие «НЕ РАВНО» стандартным языком 1С 7.7 невозможно.
  3. Отсутствие RLS: В платформе 1С 7.7 нет встроенного механизма ограничения доступа на уровне записей (Row-Level Security), который появился только в 1С 8.

Проанализируем практические варианты реализации задачи разграничения видимости документов.

Вариант 1. Разделение документов по дополнительным журналам метаданных

Рассмотрим наиболее надежный штатный способ, не требующий сторонних библиотек и глубокой модификации логики:

  1. В дереве метаданных создадим несколько специализированных журналов (например, СкладскиеДокументы, КассовыеДокументы, ЗарплатныеДокументы).
  2. В свойствах каждого вида документа укажем соответствующий журнал в реквизите Журнал.
  3. Для набора прав кладовщика полностью запретим доступ к объекту «Общий журнал» и журналу «Зарплатные документы».
  4. В пользовательском интерфейсе для кладовщика удалим пункты меню и кнопки панелей инструментов, ведущие к общему журналу, оставив доступ только к журналу складских документов.
  5. При открытии системы настроим автоматическое открытие разрешенного специализированного журнала.

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

Вариант 2. Использование компоненты 1С++ и прямых SQL-запросов

Если пользователю требуется единый журнал с возможностью комплексной фильтрации, но без запрещенных видов документов, разберем решение на базе внешней компоненты 1С++:

  1. Создадим форму обработки или отчета, на которой разместим элемент управления ТабличноеПоле от 1С++.
  2. Настроим выборку данных прямым SQL-запросом к таблице _1SJOURN, отсекая скрываемые виды документов через условие WHERE IDDOCDEF NOT IN (...).
  3. Используем класс ПоставщикДанныхТабличногоПоля для постраничной подгрузки записей при прокрутке.

Посмотрим на пример формирования текста прямого запроса для получения списка документов:


ТекстЗапроса = "
|SELECT 
|    Жур.IDDOC as [Документ $Документ],
|    Жур.DATE_TIME_IDDOC as Позиция,
|    Жур.DOCNO as Номер,
|    Жур.IDDOCDEF as ВидДокумента
|FROM 
|    _1SJOURN as Жур
|WHERE 
|    Жур.IDDOCDEF NOT IN (" + СписокЗапрещенныхВидов + ")
|ORDER BY 
|    Жур.DATE_TIME_IDDOC DESC
|";

Такой подход полностью исключает попадание конфиденциальных документов в клиентскую выборку и обеспечивает высокое быстродействие.

Вариант 3. Визуальное маскирование строк через FormEx

Если необходимо скрыть конфиденциальную информацию (суммы, наименования) непосредственно в стандартном интерфейсе без перестройки структуры журналов, применим внешнюю компоненту FormEx:

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

Процедура ПриОткрытии()
    Если НазваниеНабораПрав() = "Кладовщик" Тогда
        Предупреждение("Недостаточно прав для просмотра документа!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Таким образом, для полного сокрытия документов рекомендуется использовать разделение по специализированным журналам с ограничением интерфейса, либо переходить на табличные поля с прямыми запросами при помощи 1С++.

← На главную