Приветствуем вас! Сегодня мы разберем одну из самых частых и в то же время коварных проблем, с которой сталкиваются разработчики и администраторы «1С:Предприятия 8» при работе с Системой компоновки данных (СКД). Представьте ситуацию: вы создали простой и понятный отчет на базе регистра накопления в конфигурации «1С:Управление торговлей 11» (на управляемых формах). Под пользователем с полными правами отчет строится идеально, все настройки на месте, поля выводятся. Но у конкретного пользователя с ограниченными правами отчет открывается с абсолютно пустой формой настроек, поля выбора отсутствуют, а сам отчет не формируется, хотя базовые права на чтение регистра у него есть.
В этой статье мы подробно проанализируем, почему возникает такая ситуация, рассмотрим ключевые механизмы платформы, влияющие на видимость полей в СКД, и разберем по шагам, как исправить эту проблему.
Когда у одного пользователя настройки отчета заполнены, а у другого они пусты, дело почти всегда кроется в тонкостях разграничения прав доступа 1С и особенностях поведения СКД при работе в ограниченном сеансе. Рассмотрим основные технические причины этой проблемы.
1. Разница между правами «Чтение» и «Просмотр»
Это классическая методическая особенность платформы «1С:Предприятие 8». Начинающие разработчики часто путают эти два права доступа:
Если у пользователя на регистр накопления установлено право Чтение, но снят флаг Просмотр, то СКД программно выполнит запрос без ошибок СУБД, но на уровне интерфейса полностью скроет все поля этого регистра из доступных полей, группировок, отборов и выбранных полей. Как результат — пользователь увидит пустые настройки отчета.
2. Права на связанные ссылочные объекты (измерения и реквизиты)
Регистры накопления редко состоят только из простых типов данных (числа и строки). Обычно их измерениями и реквизитами являются ссылки на справочники (СправочникСсылка.Номенклатура, СправочникСсылка.Организации) или документы. Если у пользователя есть полные права на сам регистр, но при этом отсутствует право Просмотр (или даже Чтение) хотя бы на один из справочников, являющихся его измерениями, СКД автоматически исключит это поле из списка доступных.
Особого внимания требуют поля составного типа данных (например, Регистратор или владелец характеристики). Если у пользователя нет прав на просмотр хотя бы одного из типов, входящих в этот состав, СКД может полностью заблокировать доступ ко всему полю.
3. Кэширование настроек в базе данных (Хранилище настроек)
Очистка локального кэша на компьютере (удалением папок из AppData) часто не приносит результатов. Дело в том, что в управляемом интерфейсе 1С настройки вариантов отчетов для каждого пользователя сохраняются непосредственно в самой информационной базе — в системной таблице, управление которой происходит через ХранилищеСистемныхНастроек или ХранилищеНастроекДанных.
Если настройки конкретного пользователя в базе данных были повреждены или сохранены в момент, когда у него временно не было прав на определенные метаданные, отчет будет открываться с «битыми» пустыми настройками.
4. Влияние функциональных опций (ФО)
В типовых конфигурациях вроде УТ 11 активно используются функциональные опции. Если определенный реквизит или измерение привязаны к функциональной опции, которая отключена в программе или недоступна для конкретного профиля пользователя, СКД автоматически удалит эти поля из настроек и отборов отчета.
5. Ограничения доступа на уровне записей (RLS)
При включенном RLS (например, по организациям или группам партнеров) платформа неявно накладывает дополнительные условия на таблицы запроса. Если правила RLS настроены некорректно или ограничивают доступ к ключевым полям связей, СКД не сможет построить макет компоновки, что приведет к сбросу настроек и невозможности сформировать отчет.
---
Рассмотрим подробнее шаги, которые помогут нам локализовать и быстро устранить неисправность.
Проанализируем роли, назначенные нашему пользователю в конфигураторе:
Чтобы исключить проблемы с базовыми правами на чтение таблиц БД, выполним рекомендацию с форума: запустим этот запрос программно в сеансе проблемного пользователя. Для этого можно воспользоваться внешней обработкой со следующим кодом:
Процедура ВыполнитьПроверкуПравНаСервере() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ПродажиОбороты.Номенклатура КАК Номенклатура,
| ПродажиОбороты.КоличествоОборот КАК КоличествоОборот
|ИЗ
| РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты КАК ПродажиОбороты";
Попытка
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Данные получены: " + Выборка.Номенклатура + " - " + Выборка.КоличествоОборот);
КонецЦикла;
Исключение
ВызватьИсключение "Ошибка выполнения запроса: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Если при выполнении кода под интересуемым пользователем возникает ошибка доступа к таблицам, значит, у роли действительно отсутствуют права на чтение одной из задействованных таблиц. Если запрос отработал успешно, но в самом отчете поля по-прежнему отсутствуют — переходим к очистке кэша настроек в базе данных.
Для того чтобы сбросить поврежденный кэш настроек отчета в базе данных, выполним административную очистку под пользователем с полными правами в режиме «1С:Предприятие»:
При следующем запуске отчета платформа загрузит чистую схему настроек по умолчанию непосредственно из метаданных.
В ситуациях, когда пользователю нельзя давать прямые права на просмотр таблиц данных (из соображений безопасности), но отчет при этом должен формироваться, мы можем использовать программную инициализацию СКД в привилегированном режиме.
Рассмотрим, как это реализовать в модуле объекта отчета:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отменяем стандартное формирование отчета
СтандартнаяОбработка = Ложь;
// Включаем привилегированный режим для обхода ограничений RLS и прав просмотра
УстановитьПривилегированныйРежим(Истина);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Отключаем привилегированный режим после завершения вывода
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
При таком подходе СКД успешно скомпонует макет отчета без проверки прав текущего пользователя на таблицы данных, и отчет сформируется без ошибок.
Мы проанализировали ключевые причины пустых настроек СКД у пользователей с ограниченными правами. Применяя описанную последовательность шагов, вы сможете оперативно устранять подобные интерфейсные сбои в конфигурациях 1С.