Как скрыть документы прошлых периодов от просмотра в 1С:Комплексная автоматизация 1.1?

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

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

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

Метод 1. Настройка механизма RLS (Ограничение на уровне записей)

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

Разберем по шагам правильный алгоритм настройки RLS, при котором остатки будут рассчитываться абсолютно корректно, а сами документы за прошлый период станут невидимыми:

  1. Ограничиваем только документы: Перейдите в настройки прав нужной роли. Настройте ограничение доступа на уровне записей (RLS) на право Чтение исключительно для объектов метаданных типа Документы.
  2. Оставляем регистры открытыми: Не устанавливайте никаких ограничений RLS по дате на чтение регистров накопления, регистров сведений и регистров бухгалтерии. Система должна беспрепятственно считывать движения прошлых периодов.
  3. Как это работает на практике: При формировании отчетов (например, оборотно-сальдовой ведомости или ведомости по складам) платформа 1С обращается к таблицам регистров, а не к самим документам. Поскольку регистры открыты, начальные и конечные остатки, а также обороты за текущий период рассчитаются абсолютно правильно. Однако, если пользователь попытается расшифровать строку отчета (сделать двойной клик) и открыть документ-регистратор из закрытого периода, система выдаст сообщение об отсутствии прав доступа либо отобразит в поле ссылку вида <Объект не найден...>. В списках документов эти записи также отображаться не будут.

Для оптимизации работы RLS крайне не рекомендуется обращаться в запросах ограничений напрямую к константам. Это вызывает серьезное падение производительности базы данных, так как запрос к таблице констант будет выполняться для каждой проверяемой строки. Чтобы избежать блокировок и замедления работы, используем Параметры сеанса.

Рассмотрим пример реализации в коде. Сначала создадим параметр сеанса ДатаЗапретаПросмотра. В модуле сеанса пропишем его инициализацию при старте системы:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    
    // Получаем дату запрета из константы или персональных настроек
    ДатаОграничения = Константы.ДатаЗапретаПросмотраДокументов.Получить();
    
    Если ЗначениеЗаполнено(ДатаОграничения) Тогда
        ПараметрыСеанса.ДатаЗапретаПросмотра = ДатаОграничения;
    Иначе
        ПараметрыСеанса.ДатаЗапретаПросмотра = '00010101'; // Без ограничений
    КонецЕсли;

КонецПроцедуры

После этого в шаблоне ограничения RLS для документов на право Чтение прописываем лаконичное и быстродействующее условие:

ГДЕ Дата >= &ПараметрыСеанса.ДатаЗапретаПросмотра

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

Метод 2. Программная фильтрация списков и блокировка открытия форм

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

Для этого нам понадобится решить две задачи: скрыть документы из списков динамического просмотра и заблокировать их открытие по прямым ссылкам.

Рассмотрим подробнее, как принудительно установить отбор в формах списков документов. Добавим обработчик события при открытии формы списка или реализуем это через общий модуль интерфейса:


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

КонецПроцедуры

Пользователь больше не сможет увидеть старые документы в общем списке, однако он все еще может попытаться открыть документ по ссылке из других документов или внешних обработок. Чтобы полностью перекрыть этот канал утечки информации, настроим блокировку открытия форм документов с помощью подписок на события.

Создадим подписку на событие ПередОткрытием для форм документов. В обработчике подписки пропишем следующий код:


Процедура ПередОткрытиемФормыДокумента(Источник, Отказ, СтандартнаяОбработка) Экспорт
    
    // Проверяем, что документ уже записан в базу (не новый)
    Если ЗначениеЗаполнено(Источник.Ссылка) Тогда
        ДатаЗапрета = ПараметрыСеанса.ДатаЗапретаПросмотра;
        
        Если ЗначениеЗаполнено(ДатаЗапрета) И Источник.Ссылка.Дата < ДатаЗапрета Тогда
            Предупреждение("Доступ к документам прошлых периодов ограничен руководством компании!");
            Отказ = Истина; // Блокируем открытие формы
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

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

Метод 3. Использование распределенных информационных баз (РИБ)

Если перед нами стоит задача физически оградить определенных пользователей от конфиденциальных исторических данных, отличным решением будет создание распределенной информационной базы (РИБ) с фильтрацией по дате.

Проанализируем этот сценарий по шагам:

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

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

Метод 4. Свертка базы данных и создание архивного контура

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

Разберем данный процесс поэтапно:

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

После свертки рабочая база значительно уменьшается в объеме, начинает работать быстрее, а рядовые пользователи физически теряют доступ к детальной истории операций прошлых лет, так как этих документов в рабочей базе больше не существует. При этом остатки для текущей работы сохранены в полном объеме.

← На главную