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