Как программно ограничить доступ к данным в стандартных отчетах 1С:Бухгалтерия 3.0?

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

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

Почему не стоит менять настройки на этапе открытия формы

Попытки программного добавления элементов в КомпоновщикНастроек в процедурах ПриОткрытии или ПриСозданииНаСервере часто оказываются неэффективными по ряду причин:

  1. Перезапись настроек: Стандартные механизмы БП 3.0 при формировании отчета часто обращаются к сохраненным вариантам настроек пользователя, которые перекрывают программные изменения.
  2. Интерфейсная доступность: Пользователь может самостоятельно удалить такой отбор из панели настроек или сбросить настройки отчета, что полностью аннулирует вашу защиту.
  3. Конфликт состояний: При каждом новом запуске или смене параметров КомпоновщикНастроек переинициализируется, что приводит к необходимости повторного внесения изменений.

Правильное решение: использование события ПриКомпоновкеРезультата

Наиболее надежный способ вмешаться в процесс формирования отчета — это использование расширения для перехвата процедуры ПриКомпоновкеРезультата. Эта процедура вызывается непосредственно перед тем, как система начинает собирать данные для вывода в табличный документ. На этом этапе у нас есть готовый объект настроек, который будет использован для построения запроса.

Пошаговая реализация ограничения через расширение

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

Шаг 1: Создайте расширение для отчета и добавьте процедуру ПриКомпоновкеРезультата с аннотацией &После.

Шаг 2: В теле процедуры получите доступ к настройкам и программно добавьте отбор. Важно понимать, что в этот момент мы работаем с объектом НастройкиОтчета, который уже прошел все этапы подготовки данных.

Ниже приведен пример того, как это можно реализовать в коде:


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

Важные рекомендации и предостережения

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

  1. Безопасность (RLS): Помните, что фильтры в отчетах — это лишь «визуальное» ограничение. Если пользователь обладает правами на открытие справочников или создание других отчетов, он может увидеть «скрытые» данные там. Для полноценного ограничения прав используйте механизмы Ограничения доступа на уровне записей (RLS) в конфигураторе (Роли — Ограничение доступа к данным). Это единственный гарантированный способ закрыть доступ к данным на уровне платформы.
  2. Режим отображения: Свойство РежимОтображенияКомпоновкиДанных.Недоступный критически важно, если вы хотите сделать фильтр «неотключаемым». Это не даст пользователю снять галочку «Использование» в панели настроек.
  3. Контроль типов данных: Всегда проверяйте, существует ли поле, к которому вы обращаетесь (например, "Номенклатура" или "Контрагент"), в схеме компоновки конкретного отчета. Иначе возникнет ошибка при формировании.

Таким образом, использование метода ПриКомпоновкеРезультата через расширение — это самый профессиональный подход. Он позволяет гибко управлять фильтрацией данных, минимизирует конфликты с типовым механизмом настроек 1С и обеспечивает прозрачность логики вашего расширения.

← На главную