При организации многопользовательской работы в конфигурациях на платформе 1С:Предприятие 7.7 (в частности, в «Торговля и Склад 7.7») часто возникает задача скрыть чужие документы от менеджеров или операторов. В отличие от платформы 1С 8.x, где реализован механизм RLS (Record Level Security) на уровне СУБД, в 1С 7.7 встроенного разграничения доступа на уровне отдельных записей нет. Разберем основные штатные и программные методы решения этой задачи, а также способы защиты от обхода ограничений.
Штатный механизм платформы 7.7 позволяет жестко зафиксировать отбор по реквизиту документа при открытии формы журнала. Для этого необходимо выполнить следующие условия:
Автор должен быть назначен как Общий реквизит документов с включенным признаком Отбор.ПриОткрытии формы журнала программно устанавливается фильтрация по текущему пользователю.Рассмотрим пример кода в модуле формы журнала:
Процедура ПриОткрытии()
// Проверяем, требуется ли ограничение для текущего пользователя
Если глТекущийПользователь.ОграничиватьДоступ = 1 Тогда
// Устанавливаем жесткий отбор по общему реквизиту Автор
УстановитьОтбор("Автор", глТекущийПользователь);
// Блокируем элементы формы, позволяющие сбросить или изменить отбор
Форма.КнопкаОтбор.Доступность(0);
КонецЕсли;
КонецПроцедуры
Ограничение метода: Платформа 1С 7.7 поддерживает одновременно только один отбор в журнале. Нельзя штатно отобрать документы одновременно по автору и складу или контрагенту. Для составного отбора разработчикам приходится создавать специальный общий реквизит-склейку (например, ЗначениеВСтрокуВнутр(Автор) + ЗначениеВСтрокуВнутр(Склад)), что увеличивает нагрузку на базу данных и размер индексных файлов .CDX.
Если требуется оставить пользователю общий список документов (например, для контроля номеров), но скрыть коммерческую информацию (суммы, клиентов), можно динамически вычислять значения колонок журнала и блокировать интерактивное открытие чужих объектов.
Разберем реализацию вывода данных через формулу в графе журнала:
Функция глПолучитьСуммуДляЖурнала(ТекДок) Экспорт
Если (ТекДок.Автор = глТекущийПользователь) Или (глКонтрольДоступа(глТекущийПользователь) = 0) Тогда
Возврат ТекДок.Итог("Сумма");
Иначе
Возврат "<Скрыто>";
КонецЕсли;
КонецФункции
Чтобы пользователь не мог открыть чужой документ двойным кликом, в модуле документа или в централизованных процедурах накладывается запрет:
Процедура ПриОткрытии()
Если (глТекущийПользователь.ОграничиватьДоступ = 1) И (Автор <> глТекущийПользователь) И (Выбран() = 1) Тогда
Предупреждение("У вас нет прав на просмотр и редактирование чужих документов!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Чтобы не модифицировать формы всех существующих документов вручную, в конфигурации «Торговля и Склад 7.7» целесообразно использовать типовые глобальные механизмы.
глПроверкаРазрешенияРедактирования. Модифицировав ее в глобальном модуле, мы закрываем доступ ко всем документам конфигурации сразу:
Функция глПроверкаРазрешенияРедактирования(Конт) Экспорт
// Дополнительная проверка на принадлежность документа автору
Если глТекущийПользователь.ТолькоСвоиДокументы = 1 Тогда
Если (Конт.Выбран() = 1) И (Конт.Автор <> глТекущийПользователь) Тогда
Предупреждение("Доступ к документу запрещен!");
Возврат 0;
КонецЕсли;
КонецЕсли;
// Штатная логика проверки
...
КонецФункции
глПечатьДокумента открывает форму документа с параметром СписокПараметров, в котором передается команда печати. Поскольку в процедуре документа ПриОткрытии выполняется обработка команды и завершение работы через СтатусВозврата(0), встроенная в начало формы проверка прав заблокирует прямую печать чужого документа из журнала.глФильтрПоПеременнойЗапроса, куда внедряется обязательный отбор по автору для ограниченных пользователей.При настройке прав в 1С 7.7 важно помнить о дополнительных интерфейсных возможностях платформы:
ВводНаОсновании может переносить данные из чужого документа в новый без интерактивного открытия оригинала. Требуется проверка прав в процедуре ВводНаОсновании.ПодборОбъектов), которые могут прочитать данные напрямую.