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

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

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

Выясним причину: Представление ссылки vs Данные реквизитов

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

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

Разберем проблему составных типов (Полиморфные поля)

Поле Регистратор является составным. В него могут входить десятки различных видов документов: от «Оприходования запасов» до «Реализации товаров и услуг». Рассмотрим особенности работы платформы:

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

Способ 1. Использование функции ВЫРАЗИТЬ (CAST)

Чтобы обойти проблему «все или ничего», мы можем явно указать системе, с какими типами документов мы работаем. Это заставит СКД обращаться только к конкретным таблицам, игнорируя те, к которым доступа нет. Посмотрим на пример изменения запроса в наборе данных СКД:


ВЫБРАТЬ
    Запасы.Номенклатура,
    Запасы.Склад,
    Запасы.Регистратор,
    // Явно ограничиваем тип для получения даты и номера
    ВЫРАЗИТЬ(Запасы.Регистратор КАК Документ.ОприходованиеЗапасов).Дата КАК ДатаОприходования,
    ВЫРАЗИТЬ(Запасы.Регистратор КАК Документ.ОприходованиеЗапасов).Номер КАК НомерОприходования
ИЗ
    РегистрНакопления.ЗапасыНаСкладах КАК Запасы

Если типов регистраторов много, такой подход может показаться громоздким, но он является самым надежным с точки зрения производительности и безопасности данных. Мы исключаем лишние соединения с таблицами, которые не нужны в контексте данного отчета.

Способ 2. Проверка прав Просмотр и RLS

Проанализируем настройки ролей (в этом поможет обработка для анализа прав и ролей). Пройдите по шагам:

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

Способ 3. Перевод отчета в привилегированный режим

Если бизнес-логика позволяет пользователю видеть даты и номера всех документов, независимо от его личных прав на эти документы, мы можем использовать Привилегированный режим. Это радикальный способ, который полностью игнорирует RLS при выполнении запроса.

Для этого нам потребуется программная инициализация компоновки. Рассмотрим, как это сделать в модуле отчета:


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

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

Способ 4. Диагностика через Журнал регистрации

Если вы не знаете точно, на какой именно документ не хватает прав, воспользуйтесь системным журналом. Попросите пользователя сформировать отчет. Сразу после этого откройте Журнал регистрации и установите фильтр по событию Отказ в доступе. Система зафиксирует попытку обращения к таблице документа, на который у пользователя нет прав. Это самый быстрый способ найти «виновника» среди десятков возможных регистраторов.

Резюме

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

← На главную