Работа с системой компоновки данных (СКД) в платформе 1С:Предприятие открывает перед разработчиком безграничные возможности по формированию отчетов, однако часто ставит сложные задачи по управлению интерфейсом для конечного пользователя. Одной из наиболее частых проблем является необходимость скрыть определенные поля, отборы или параметры настройки, которые важны для логики работы, но не должны быть видны в окне настройки отчета. Это может потребоваться для защиты от некорректного ввода данных, упрощения интерфейса для рядовых пользователей или реализации специфической бизнес-логики.
Существует несколько подходов к решению этой задачи, начиная от простых настроек в макете компоновки и заканчивая программной модификацией структуры отчета в обработчике события КомпоновщикНастройкиПередЗаписью. Выбор конкретного метода зависит от того, на каком этапе жизненного цикла отчета происходит скрытие и требуется ли динамическое управление видимостью элементов в зависимости от прав доступа или других условий.
В данной статье мы детально разберем механизмы скрытия отборов, полей и параметров, а также обсудим подводные камни, с которыми сталкиваются программисты 1С при работе с консолью схем компоновки данных. Особое внимание будет уделено различиям между скрытием элемента в списке доступных полей и полным исключением его из структуры отчета, что является критически важным нюансом для стабильной работы системы.
Основные понятия видимости в СКД
Прежде чем приступать к программной реализации, необходимо четко разграничить понятия видимости в контексте системы компоновки данных. В СКД существует несколько уровней настройки отображения элементов: видимость поля в списке доступных полей, видимость отбора в списке доступных отборов и видимость конкретного параметра настройки в диалоговом окне. Важно понимать, что скрытие элемента не всегда означает его исключение из выборки данных.
Часто разработчики путают отключение видимости параметра с его удалением из структуры. Если вы скрываете параметр, но он остается в структуре настроек, пользователь просто не сможет изменить его значение через стандартный интерфейс, но само значение будет использоваться при формировании отчета. Это часто применяется для передачи служебных фильтров, которые формируются программно на основе прав пользователя или контекста запуска.
Механизм управления видимостью тесно связан с правами доступа (RLS) и ролевой моделью приложения. В некоторых случаях нет смысла программно скрывать поле, если у пользователя просто нет прав на чтение соответствующего реквизита. Однако для сложных отчетов, где логика видимости зависит от комбинации нескольких факторов, требуется использование встроенных средств платформы 1С для манипуляции объектом КомпоновщикНастроек.
Используйте свойство "Доступность" (Available) вместо полного удаления параметра, если вы планируете вернуть его видимость в будущем или управлять им динамически в зависимости от других настроек.
Скрытие отборов через макет компоновки данных
Самый простой и декларативный способ управления тем, что видит пользователь при запуске отчета, — это редактирование макета компоновки данных непосредственно в конфигураторе. Этот метод подходит для статических отчетов, где набор видимых полей и отборов не меняется в зависимости от внешних условий. Для реализации достаточно открыть макет и перейти на вкладку настроек.
В структуре макета можно найти элемент Настройки, внутри которого определены списки доступных полей, отборов, сортировок и группировок. Чтобы скрыть конкретный отбор, необходимо найти соответствующее поле в списке доступных отборов и снять галочку или удалить его из списка видимых элементов. При этом само поле остается в наборе данных и может использоваться в других частях отчета, например, в условиях вычисляемых полей.
Однако у этого подхода есть существенный недостаток: изменения применяются ко всем пользователям и во всех случаях запуска данного отчета. Если бизнес-требования предполагают, что для одних ролей отбор должен быть виден, а для других — скрыт, то редактирование макета не подойдет. В таких случаях необходимо переходить к программным методам управления структурой.
- 🔍 Откройте макет компоновки данных в конфигураторе 1С через окно свойств объекта отчета.
- ⚙️ Перейдите на вкладку "Настройки" и раскройте узел "Отборы".
- 🚫 Снимите флажок "Видимость" у ненужных полей или удалите их из списка доступных.
- 💾 Сохраните макет и проверьте результат в режиме предприятия.
Программное скрытие в обработчике событий
Для реализации гибкой логики скрытия отборов необходимо использовать обработчик события КомпоновщикНастройкиПередЗаписью. Этот событие срабатывает непосредственно перед тем, как настройки отчета будут сохранены или применены, что дает разработчику полный контроль над объектом КомпоновщикНастроек. Именно здесь можно программно манипулировать коллекциями доступных полей и отборов.
Код обработки события позволяет проанализировать текущие права пользователя, значение других параметров или внешние данные, и на основе этого принять решение о видимости конкретных элементов. Например, если пользователь не является руководителем отдела, мы можем программно скрыть отбор по полю "Менеджер", оставив его видимым только для администраторов.
При работе с коллекциями Если же требуется полностью запретить использование поля в отборе, необходимо также проверить логику формирования запроса, чтобы избежать ошибок при попытке использования скрытого поля через расширенные настройки.
Процедура КомпоновщикНастройкиПередЗаписью(КомпоновщикНастройки)
Параметры = КомпоновщикНастройки.Параметры;
Для Каждого Параметр Из Параметры Цикл
Если Параметр.Имя = "Организация" Тогда
Параметр.Доступность = Ложь; // Скрываем параметр
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Нюансы работы с коллекциями
При переборе коллекции настроек в цикле "Для Каждого" изменения свойств применяются к объекту-ссылке, поэтому дополнительные действия по обновлению коллекции обычно не требуются, но будьте осторожны при удалении элементов внутри цикла.
Управление видимостью параметров и полей
Помимо отборов, часто возникает необходимость скрыть сами параметры, которые используются в запросе. Параметры в СКД могут быть как явными (видимыми пользователю), так и скрытыми (служебными). Различие между ними определяется свойством Использование (Usage) и флагом доступности. Служебные параметры часто применяются для передачи контекста, например, текущего пользователя или рабочей даты.
При скрытии поля в списке доступных полей пользователь лишается возможности добавить его в группировки или отборы через стандартный интерфейс. Однако, если пользователь обладает навыками работы с расширенными настройками или имеет доступ к консоли СКД, он теоретически может попытаться добавить поле вручную. Поэтому для критически важных ограничений рекомендуется комбинировать скрытие с проверкой прав доступа на уровне запроса.
Важно различать скрытие параметра и его удаление. Удаление параметра из структуры может привести к ошибке выполнения отчета, если этот параметр используется в тексте запроса или в выражениях. Скрытие же оставляет параметр в структуре, но делает его невидимым для редактирования, сохраняя при этом его значение (по умолчанию или установленное программно).
| Тип элемента | Свойство видимости | Влияние на запрос | Рекомендуемый метод |
|---|---|---|---|
| Параметр | Доступность = Ложь |
Не влияет, значение берется из структуры | Обработчик ПередЗаписью |
| Поле в отборе | Удаление из списка доступных | Пользователь не может создать отбор | Макет или код |
| Группировка | Видимость = Ложь |
Группировка не отображается в настройках | Настройки макета |
| Вычисляемое поле | Скрытие в структуре | Поле доступно в запросе, но не в интерфейсе | Макет компоновки |
Скрытие параметра не отменяет его вычисление. Если параметр зависит от сложной логики, она будет выполняться даже при скрытом интерфейсе, что может влиять на производительность.
Особенности работы с консолью СКД
Консоль схем компоновки данных — это мощный инструмент отладки и анализа, который часто используется разработчиками для проверки структуры отчета. Однако при тестировании скрытия отборов в консоли можно столкнуться с поведением, отличным от режима предприятия. Консоль по умолчанию показывает все доступные поля и параметры, игнорируя некоторые ограничения макета, если они не закреплены жестко.
Для корректной проверки скрытых элементов в консоли необходимо загружать не только схему компоновки, но и конкретный макет, а также применять настройки, сформированные в режиме предприятия. Иногда требуется вручную редактировать XML-представление настроек, чтобы убедиться, что скрытые элементы действительно не попадают в итоговую структуру.
Следует учитывать, что в консоли СКД есть режим "Расширенные настройки", который позволяет добавлять любые поля из набора данных, даже если они скрыты в стандартном интерфейсе. Это особенность инструмента разработки, а не ошибка платформы. При проверке безопасности всегда тестируйте отчет в обычном режиме пользователя, а не только в консоли.
☑️ Проверка скрытия элементов
Частые ошибки и способы их решения
Одной из самых распространенных ошибок является попытка скрыть обязательный параметр, который используется в условии соединения таблиц или в группировке. В результате отчет перестает формироваться или выдает ошибку "Недостаточно параметров". Решение заключается в том, чтобы не скрывать параметр полностью, а сделать его доступным только для чтения или установить жесткое значение по умолчанию.
Другая проблема возникает при динамическом изменении структуры набора данных. Если вы программно удаляете поле из набора данных, но забываете удалить соответствующий отбор из настроек, система выдаст ошибку при попытке применить настройки. Всегда синхронизируйте изменения в наборе данных с изменениями в структуре настроек.
⚠️ Внимание! Изменение структуры набора данных (удаление полей) в обработчике
КомпоновщикНастройкиПередЗаписьюможет привести к нестабильной работе отчета, если эти поля уже используются в сохраненных вариантах настроек пользователей. Рекомендуется использовать механизм версионирования настроек или предупреждать пользователей о сбросе.
Также стоит упомянуть проблему с кэшированием настроек. Пользователи могут сохранить вариант отчета, в котором скрытые поля были видны. При последующем запуске система может попытаться восстановить эти настройки, что вызовет конфликт. Для решения этой проблемы можно использовать событие ПриЧтенииНастроек для очистки устаревших элементов.
Как сбросить сохраненные настройки?
Если пользователи столкнулись с ошибками из-за устаревших сохраненных настроек, администратор может очистить таблицу вариантов настроек или принудительно сбросить настройки через обработку "Администрирование" -> "Настройки пользователей".
Безопасность и права доступа в отчетах
Скрытие отборов в интерфейсе не является методом защиты данных. Опытный пользователь может обойти ограничения интерфейса, используя внешние обработки или прямые запросы к базе данных. Поэтому, если цель скрытия отбора — запретить доступ к определенной информации (например, зарплате или коммерческой тайне), необходимо использовать механизмы RLS (Record Level Security) или проверки прав доступа в самом запросе.
В тексте запроса внутри СКД можно использовать предопределенные переменные, такие как &ПраваДоступа, или вызывать функции, проверяющие роль пользователя. Это гарантирует, что даже если отбор будет каким-то образом активирован, данные не будут выведены в результат для неавторизованных лиц.
⚠️ Внимание! Никогда не полагайтесь только на скрытие элементов интерфейса для обеспечения информационной безопасности. Скрытие — это элемент юзабилити, а не защиты. Всегда дублируйте ограничения на уровне прав доступа или в условиях запроса.
Для сложных сценариев, где видимость данных зависит от иерархии подразделений или конкретных документов, рекомендуется выносить логику фильтрации в общие модули и вызывать их при формировании набора данных. Это делает код более поддерживаемым и позволяет централизованно управлять правилами безопасности.
Можно ли скрыть отбор, но оставить его значение активным?
Да, это стандартная практика. Вы устанавливаете значение параметра или отбора программно, а свойство Доступность устанавливаете в Ложь. В этом случае фильтр будет работать, но пользователь не увидит его в настройках и не сможет изменить.
Почему скрытое поле все равно отображается в консоли СКД?
Консоль СКД является инструментом разработчика и часто игнорирует ограничения видимости макета для упрощения отладки. Для проверки реальной видимости используйте запуск отчета в режиме предприятия под учетной записью тестового пользователя.
Как скрыть стандартные отборы, такие как "Период"?
Стандартные отборы, добавляемые автоматически, можно скрыть через макет компоновки данных, найдя их в списке доступных отборов и сняв галочку видимости, либо программно в обработчике события, обратившись к ним по имени.
Влияет ли скрытие отбора на производительность отчета?
Само по себе скрытие элемента интерфейса не влияет на производительность выполнения запроса. Однако, если скрытие сопровождается установкой сложных фильтрационных условий программно, это может повлиять на скорость формирования выборки данных.
Что делать, если после скрытия отчет перестал открываться?
Проверьте логи ошибок. Скорее всего, вы скрыли параметр, который является обязательным для работы запроса, или удалили поле, используемое в группировке. Восстановите элемент в структуре или сделайте его доступным только для чтения.