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