При настройке прав доступа в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей: необходимо полностью скрыть документы определенного типа (например, Начисление Зарплаты) из поля зрения пользователей с ограниченными правами (например, кладовщиков или менеджеров).
Даже если в конфигураторе у набора прав снять все флаги доступа к конкретному документу (включая права на чтение и просмотр), пользователь все равно видит факт существования документа в Общем журнале — отображаются его дата, номер и вид, хотя открыть или отредактировать форму программа не позволяет. Разберем особенности работы платформы 1С 7.7 и рассмотрим способы решения этой задачи.
Выясним причину, по которой стандартная настройка прав не скрывает строки в общем журнале:
_1SJOURN на уровне базы данных содержит сводную информацию обо всех документах. Стандартный объект метаданных «Общий журнал документов» выводит все зарегистрированные виды документов без возможности исключить один из них на уровне структуры.УстановитьОтбор(): Штатный механизм отборов в 1С 7.7 поддерживает фильтрацию только по точному совпадению с одним конкретным значением. Задать отбор по списку разрешенных видов или условие «НЕ РАВНО» стандартным языком 1С 7.7 невозможно.Проанализируем практические варианты реализации задачи разграничения видимости документов.
Рассмотрим наиболее надежный штатный способ, не требующий сторонних библиотек и глубокой модификации логики:
СкладскиеДокументы, КассовыеДокументы, ЗарплатныеДокументы).Обратите внимание: Дополнительные журналы документов поддерживают отборы по графам отбора, однако в них отображаются только те документы, которые прямо привязаны к данному журналу в метаданных.
Если пользователю требуется единый журнал с возможностью комплексной фильтрации, но без запрещенных видов документов, разберем решение на базе внешней компоненты 1С++:
ТабличноеПоле от 1С++._1SJOURN, отсекая скрываемые виды документов через условие WHERE IDDOCDEF NOT IN (...).ПоставщикДанныхТабличногоПоля для постраничной подгрузки записей при прокрутке.Посмотрим на пример формирования текста прямого запроса для получения списка документов:
ТекстЗапроса = "
|SELECT
| Жур.IDDOC as [Документ $Документ],
| Жур.DATE_TIME_IDDOC as Позиция,
| Жур.DOCNO as Номер,
| Жур.IDDOCDEF as ВидДокумента
|FROM
| _1SJOURN as Жур
|WHERE
| Жур.IDDOCDEF NOT IN (" + СписокЗапрещенныхВидов + ")
|ORDER BY
| Жур.DATE_TIME_IDDOC DESC
|";
Такой подход полностью исключает попадание конфиденциальных документов в клиентскую выборку и обеспечивает высокое быстродействие.
Если необходимо скрыть конфиденциальную информацию (суммы, наименования) непосредственно в стандартном интерфейсе без перестройки структуры журналов, применим внешнюю компоненту FormEx:
ПриОткрытии() обязательно сохраняем строгую проверку прав, чтобы исключить возможность открытия формы документа по двойному клику:
Процедура ПриОткрытии()
Если НазваниеНабораПрав() = "Кладовщик" Тогда
Предупреждение("Недостаточно прав для просмотра документа!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Таким образом, для полного сокрытия документов рекомендуется использовать разделение по специализированным журналам с ограничением интерфейса, либо переходить на табличные поля с прямыми запросами при помощи 1С++.