При разработке сложных отчетов на системе компоновки данных (СКД) часто возникает необходимость использования вложенных схем. Одной из самых распространенных проблем в этом случае является «потеря» параметров: значения, установленные пользователем в основном отчете, почему-то не доходят до вложенного. В этой статье мы подробно разберем, как правильно настроить связи, почему стандартных действий в конструкторе иногда бывает недостаточно и как бороться с известными багами платформы 1С.
Разберем базовый механизм, который часто вводит в заблуждение начинающих разработчиков. Проблема заключается в том, что в СКД связь параметров вложенной схемы должна быть установлена в двух местах одновременно. Если выполнить настройку только в одном месте, данные переданы не будут.
Шаг 1. Настройка на закладке «Вложенные схемы»
В конструкторе основной схемы перейдем на закладку Вложенные схемы. Здесь мы описываем саму структуру. В колонке Настройки необходимо нажать на кнопку выбора. Откроется окно, в котором нужно установить соответствие между параметрами основной схемы и параметрами вложенной. Это декларативное описание связи: мы сообщаем системе, какой параметр основной схемы принципиально может быть передан во вложенную.
Шаг 2. Настройка на закладке «Настройки»
Это тот самый этап, который чаще всего пропускают. Перейдем на закладку Настройки основной схемы. В дереве настроек (слева) найдем наш вложенный отчет. Теперь обратим внимание на нижнюю часть экрана — на закладку Параметры именно для этого вложенного отчета. Здесь для каждого нужного параметра (например, НачалоПериода) необходимо:
ОбъектНастройкиВладелец.ПараметрыДанных.НачалоПериода.Проанализируем ситуацию: если мы не выполним Шаг 2, вложенная схема будет пытаться использовать свои собственные значения параметров по умолчанию, игнорируя то, что пришло «сверху» от владельца.
Иногда даже при правильной настройке отчет выдает ошибку или пустой результат. Рассмотрим случай, характерный для версий платформы 8.3.18.1208 и выше. Пользователи часто сталкиваются с тем, что конструктор ведет себя некорректно при вводе выражений.
Выясним причину: в некоторых релизах платформы существует визуальный баг. При выборе значения ОбъектНастройкиВладелец.ПараметрыДанных.НачалоПериода через выпадающий список конструктор может «склеить» строку, превратив её в ОбъектНастройкиВладелецПараметрыДанныхНачалоПериода (удалив точки). Система не распознает такое выражение и выдает ошибку компоновки. В этом случае необходимо вручную отредактировать строку, убедившись, что все точки на месте.
Также стоит помнить о кэшировании настроек. Если вы внесли изменения в структуру связей параметров, а отчет по-прежнему работает по-старому, попробуйте очистить пользовательские настройки или кэш платформы. Часто 1С сохраняет старые варианты настроек компоновки в SystemSettingsStorage, что блокирует применение новых правил передачи параметров.
В сложных случаях, когда визуальных настроек недостаточно или требуется динамическое управление параметрами (например, если параметры зависят от других настроек), мы можем прибегнуть к программному методу. Рассмотрим, как это реализовать в модуле объекта отчета.
Для этого используется предопределенная процедура ПриКомпоновкеРезультата. Нам нужно перебрать структуру настроек и принудительно установить значения для вложенных объектов. Посмотрим на пример кода:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Инициализируем компоновщик настроек
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Рекурсивно ищем вложенные отчеты в структуре
Для Каждого ЭлементСтруктуры Из КомпоновщикНастроек.Настройки.Структура Цикл
Если ТипЗнч(ЭлементСтруктуры) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда
// Получаем значение параметра из основной схемы
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.Найти("НачалоПериода").Значение;
// Устанавливаем его во вложенную схему напрямую
ПараметрВложенный = ЭлементСтруктуры.Настройки.ПараметрыДанных.Найти("НачалоПериода");
Если ПараметрВложенный <> Неопределено Тогда
ПараметрВложенный.Значение = ЗначениеПараметра;
ПараметрВложенный.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Далее следует стандартный вывод отчета...
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Этот метод гарантирует, что параметры будут переданы, так как мы обходим автоматические механизмы платформы и работаем напрямую с объектной моделью КомпоновщикНастроек. Для более детального изучения механизмов управления параметрами и отборами из кода можно использовать базовый пример программного формирования отчетов на СКД.
Разберем еще один тонкий момент. Часто в основной схеме используется один параметр типа СтандартныйПериод, а во вложенной схеме — две отдельные даты (Начало и Конец). В этом случае прямая связь через ОбъектНастройкиВладелец может не сработать автоматически.
Проанализируем, как правильно прописать выражения во вложенной схеме в такой ситуации:
ОбъектНастройкиВладелец.ПараметрыДанных.Период.ДатаНачалаОбъектНастройкиВладелец.ПараметрыДанных.Период.ДатаОкончанияВажно помнить: если во вложенной схеме параметры НачалоПериода и КонецПериода отмечены как Обязательные, а в основной схеме период не заполнен, вложенный отчет может не сформироваться вообще. В таких случаях во вложенной схеме рекомендуется снимать флаг обязательного заполнения или устанавливать проверку на пустые значения в самом запросе.
Напоследок отметим несколько важных ограничений, о которых стоит помнить при работе с вложенными схемами:
Таким образом, мы рассмотрели основные причины, по которым могут не передаваться параметры. Правильная «двухуровневая» настройка в конструкторе, внимательность к синтаксису выражений и понимание особенностей вашей версии платформы позволят создавать надежные и гибкие отчеты любой сложности. В качестве альтернативного решения можно использовать шаблон для последовательного программного вывода нескольких схем компоновки в один отчет.