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