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