Почему в отчете на СКД не выводятся данные регистра при наличии полных прав?

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

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

Анализ проблемы: поведение СКД и механизм функциональных опций

Рассмотрим стандартный запрос к регистру сведений, например к ТоварныеОграничения в конфигурации «1С:Управление торговлей 11»:


ВЫБРАТЬ Первые 10
    ТоварныеОграничения.Склад,
    ТоварныеОграничения.Номенклатура,
    ТоварныеОграничения.Характеристика,
    ТоварныеОграничения.Группировка,
    ТоварныеОграничения.СтраховоеКоличествоЗапаса,
    ТоварныеОграничения.МинимальноеКоличествоЗапаса,
    ТоварныеОграничения.МаксимальноеКоличествоЗапаса,
    ТоварныеОграничения.СреднедневноеПотребление,
    ТоварныеОграничения.МетодОбеспеченияПотребностей,
    ТоварныеОграничения.УпаковкаЗаказа,
    ТоварныеОграничения.ОбеспечениеЗаказовПриПоддержанииЗапаса
ИЗ
    РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения

Если выполнить этот запрос через классический объект Запрос встроенного языка или в консоли запросов, платформа вернет строки. Однако в отчете на СКД поля просто исчезают из структуры доступных полей, отборов и группировок.

Выясним причину такого поведения. Дело в механизме Функциональных опций (ФО):

  1. В отличие от прямого запроса к базе данных, движок СКД перед выполнением сверяет метаданные с составом функциональных опций. Если объект конфигурации или его реквизиты привязаны к функциональной опции, значение которой равно Ложь, СКД исключает эти поля из доступных полей схемы.
  2. Если все поля группировки или выбранные поля отчета были исключены механизмом функциональных опций, платформа автоматически схлопывает структуру отчета. В итоге формируется пустой табличный документ — без строк и без шапки.
  3. Полные права и привилегированный режим здесь бессильны. Функциональные опции предназначены для управления прикладным интерфейсом, а не правами доступа (RLS). Поэтому даже суперпользователь с ролью ПолныеПрава не увидит отключенный функционал через СКД.

Способ 1. Поиск и включение соответствующей функциональной опции

Разберем по шагам, как найти опцию, блокирующую вывод данных:

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

После включения опции поля станут видимыми для СКД, и отчет сформируется корректно.

Способ 2. Сброс настроек варианта отчета

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

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

  1. В форме отчета нажмем кнопку Еще.
  2. Выберем пункт Стандартные настройки.
  3. Если используется сохраненный пользовательский вариант, перевыберем базовый вариант или удалим старую настройку через меню управления вариантами отчетов.

Способ 3. Использование внешнего набора данных (обход функциональной опции)

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

Посмотрим на пример реализации в модуле отчета или внешней обработки в событии ПриКомпоновкеРезультата:


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

В самой схеме СКД при этом создается Набор данных - Объект с именем ТаблицаДанных, где вручную объявляются поля Склад, Номенклатура и СтраховоеКоличествоЗапаса. Такой подход гарантирует вывод данных независимо от состояния функциональных опций в конфигурации.

← На главную