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

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

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

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

Суть проблемы: механизм «интеллектуального» исключения полей

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

Проанализируем пример запроса, который может вызвать подобное поведение:


ВЫБРАТЬ
    ПродажиПоФамильно.Период,
    ПродажиПоФамильно.Регистратор,
    ПродажиПоФамильно.Сотрудник,
    ПродажиПоФамильно.Количество КАК Количество,
    ПродажиПоФамильно.Регистратор.Склад КАК Склад
ИЗ
    РегистрНакопления.ПродажиПоФамильно КАК ПродажиПоФамильно
ГДЕ
    ПродажиПоФамильно.Товар = &Номенклатура

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТоварыВРознице.Период,
    ТоварыВРознице.Регистратор,
    ВЫБОР
        КОГДА ТоварыВРознице.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
            ТОГДА ТоварыВРознице.Регистратор._Продал
        ИНАЧЕ ТоварыВРознице.Регистратор.Ответственный
    КОНЕЦ,
    ТоварыВРознице.Количество,
    ТоварыВРознице.Склад
ИЗ
    РегистрНакопления.ТоварыВРознице КАК ТоварыВРознице
ГДЕ
    ТоварыВРознице.Номенклатура = &Номенклатура

В данном случае поле Сотрудник формируется из разных источников. Обратите внимание на конструкцию ВЫБОР во втором блоке. Здесь идет обращение к реквизитам _Продал и Ответственный через поле Регистратор.

Причина №1: Права на объекты в составных типах (Регистратор)

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

Если хотя бы на один тип документа (например, КорректировкаСерийИХарактеристикТоваров или ВозвратТоваровОтПокупателя) у пользователя отсутствует право Просмотр или Чтение, СКД может посчитать все выражение с разыменованием ссылки недоступным. Выясним причину на конкретном примере: автор темы обнаружил, что забыл установить галочку «Просмотр» для документа КорректировкаСерийИХарактеристикТоваров. Несмотря на то, что этот документ мог даже не присутствовать в данных за выбранный период, само его наличие в метаданных как возможного регистратора блокировало вывод поля для пользователя.

Причина №2: Использование конструкции ВЫРАЗИТЬ

Для оптимизации работы с правами и повышения производительности запросов крайне рекомендуется использовать конструкцию ВЫРАЗИТЬ. Проанализируем, как это помогает: когда мы явно указываем тип, система перестает проверять права на все остальные возможные типы составного поля.

Вместо обращения Регистратор.Ответственный в блоке ИНАЧЕ, правильнее будет написать:


ВЫБОР
    КОГДА ТоварыВРознице.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
        ТОГДА ВЫРАЗИТЬ(ТоварыВРознице.Регистратор КАК Документ.ВозвратТоваровОтПокупателя)._Продал
    ИНАЧЕ ВЫРАЗИТЬ(ТоварыВРознице.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Ответственный
КОНЕЦ

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

Причина №3: Отсутствие ключевого слова РАЗРЕШЕННЫЕ

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

В СКД использование ВЫБРАТЬ РАЗРЕШЕННЫЕ является обязательным стандартом. Если этого слова нет, и система безопасности находит записи, к которым нет доступа, СКД может повести себя непредсказуемо — либо выдать ошибку, либо скрыть данные целиком. Проверьте, чтобы каждый блок ВЫБРАТЬ в вашем запросе начинался именно так:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ...

Алгоритм диагностики проблемы «пропадающих полей»

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

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

Рекомендации по написанию безопасных запросов

Чтобы избежать подобных проблем в будущем, придерживайтесь следующих правил при работе с СКД:

Подводя итог, можно сказать, что проблема автора темы была классической: СКД обнаружила потенциальную возможность обращения к документу КорректировкаСерийИХарактеристикТоваров через поле Регистратор, и, не найдя у пользователя прав на этот объект, превентивно скрыла все зависимые поля. Будьте внимательны к составным типам — именно они чаще всего являются причиной «магии» в правах доступа 1С.

← На главную