Почему пользователь не видит отдельные поля документа в отчете СКД и как это исправить?

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

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

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

Выясняем причину: почему в консоли запросов всё работает, а в СКД — нет?

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

В случае с СКД процесс устроен гораздо сложнее:

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

Влияние Библиотеки стандартных подсистем (БСП) и кэширования метаданных

В современных конфигурациях (таких как ERP, Комплексная автоматизация или Управление торговлей) права пользователей администрируются через профили групп доступа БСП. БСП хранит информацию обо всех объектах метаданных в специальных кэш-таблицах (справочник ИдентификаторыОбъектовМетаданных).

Когда мы создаем или изменяем роль в расширении, платформа и БСП не всегда мгновенно синхронизируют кэш прав. В режиме 1С:Предприятие это может выражаться в весьма странном поведении: роль в расширении настроена правильно, но система её «не видит» или применяет права лишь частично. В результате при попытке открыть форму списка или сформировать отчет система выдает ошибку вида «Не найдено поле Дата», несмотря на то, что в конфигураторе права на это поле явно предоставлены.


Способы решения проблемы

Давайте рассмотрим несколько практических вариантов решения этой проблемы, начиная от простых манипуляций в СКД и заканчивая правильной настройкой ролей в расширении.

Решение 1. Явное приведение типов с помощью конструкции ВЫРАЗИТЬ

Когда мы используем левое соединение в запросе СКД, платформа пытается проанализировать права на всю присоединенную таблицу. Мы можем «подсказать» системе компоновки данных, что нас интересуют строго определенные типы и поля. Для этого используется конструкция ВЫРАЗИТЬ.

Давайте посмотрим на пример оптимизированного запроса:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    РН.Сумма КАК Сумма,
    ВЫРАЗИТЬ(Д.Контрагент КАК Справочник.Контрагенты) КАК Контрагент,
    ВЫРАЗИТЬ(Д.Валюта КАК Справочник.Валюты) КАК Валюта
ИЗ
    РегистрНакопления.ДенежныеСредстваБезналичные КАК РН
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.СписаниеБезналичныхДенежныхСредств КАК Д
        ПО РН.ПлатежныйДокумент = Д.Ссылка

Такой подход снижает требования СКД к анализу всей таблицы документа СписаниеБезналичныхДенежныхСредств и позволяет корректно выводить данные, даже если права пользователя на сам документ сильно ограничены.

Решение 2. Обновление кэша метаданных БСП

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

Для этого выполните следующие действия:

  1. Запустите информационную базу в режиме Предприятие с параметром командной строки: /C ЗапуститьОбновлениеИнформационнойБазы.
  2. Если первый вариант не помог, запустите базу под полными правами, откройте консоль кода или внешнюю обработку и выполните программный код обновления: Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеВсейБазы();

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

Решение 3. Использование привилегированного режима при компоновке отчета

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

Для реализации этого метода выполните шаги:

  1. Откройте модуль объекта вашего отчета СКД.
  2. Определите предопределенную процедуру ПриКомпоновкеРезультата.
  3. Переведите выполнение компоновки в привилегированный режим, как показано в примере ниже:

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

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

Решение 4. Настройка флага «Обязательное» для полей в СКД

По умолчанию СКД оптимизирует результирующий запрос к СУБД: если пользователь не выбрал какое-то поле для вывода в отчет, СКД может полностью удалить его из запроса. Если это поле участвует в связях или проверках прав, логика СКД может нарушиться.

Чтобы этого избежать, мы можем принудительно запретить системе исключать ключевые поля:

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

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

Решение 5. Назначение и свойства расширения: Адаптация vs Дополнение

Важно обратить внимание на свойство самого расширения конфигурации — его Назначение. Если ваше расширение создано с назначением «Дополнение», объекты внутри него работают в режиме максимальной изоляции. Для корректной интеграции ролей и прав, особенно при взаимодействии с механизмами компоновки данных основной конфигурации, настоятельно рекомендуется использовать назначение «Адаптация». Изменить это свойство можно в свойствах расширения в дереве метаданных.

Также убедитесь, что в роли расширения для заимствованного документа предоставлены права на чтение всех необходимых функциональных опций (ФО), в которые может входить данный документ или его реквизиты. Если у пользователя нет прав на чтение связанной функциональной опции (например, «Вести учет в валюте»), платформа скроет реквизит Валюта на системном уровне, независимо от настроек роли.

← На главную