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