Где формируются выражения и поля макета СКД, если их нет в запросе?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При доработке или исследовании отчетов на базе системы компоновки данных (СКД) разработчики часто сталкиваются с ситуацией: в макете оформления или в настройках отчета выводятся определенные поля (например, начисления, удержания, периоды), однако в схеме компоновки данных текст запроса либо отсутствует вовсе, либо не содержит подобных полей. Разберем по шагам, где объявляются такие поля, как работает механизм их наполнения и где искать программный код, отвечающий за расчет данных.

Анализ наборов данных в схеме компоновки

Выясним причину такого поведения системы. В СКД данные могут поступать не только напрямую из базы через набор данных Запрос, но и через другие типы источников:

  1. Набор данных типа Объект (внешний набор данных).
  2. Набор данных типа Объединение, включающий несколько вложенных наборов.

Если в схеме компоновки данных на вкладке Наборы данных добавлен набор типа Объект, то перечень полей в схеме задается вручную разработчиком. В этой таблице фиксируются имя поля, путь к данным, тип значения и заголовок. Однако сам набор данных схеме физически не принадлежит — он пуст до момента программного выполнения отчета. Именно поэтому искать происхождение данных внутри схемы компоновки данных бесполезно: схема лишь описывает метаданные и структуру отображения.

Где искать программный код заполнения данных

Рассмотрим подробнее места в конфигурации, где обычно располагается код формирования таблиц для внешнего набора данных. Передача данных в схему всегда выполняется программно через встроенный язык 1С.

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

Как устроен механизм передачи внешнего набора данных

Посмотрим на пример классической программной инициализации отчета, использующего внешний источник данных. Для передачи таблицы значений или дерева значений в процессор компоновки формируется структура, где ключом выступает точное строковое имя объекта из набора данных СКД.


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

В этом примере метод Инициализировать() объекта ПроцессорКомпоновкиДанных связывает описанные в схеме поля с колонками переданной таблицы ТаблицаДанных.

Особенности вывода полей внешнего набора в макетах СКД

Разберем важные нюансы, которые необходимо учитывать при настройке пользовательских макетов и выражений:

  1. Доступность полей в группировках: если в пользовательском макете ячейка привязана к выражению или полю внешнего набора данных, это поле обязательно должно входить в состав выбранных полей соответствующей группировки СКД. Если поле отсутствует в структуре группировки, макет вернет пустое значение.
  2. Строгая типизация: в наборе данных Объект крайне важно явно задавать типы колонок. Если типы колонок в ТаблицаЗначений не согласованы с типами в схеме СКД, платформа может некорректно обрабатывать вычисляемые выражения, формулы макетов и агрегатные функции итогов.
  3. Оптимизация фильтрации: СКД не может транслировать пользовательские отборы непосредственно в алгоритм внешнего источника. Если не применить отборы вручную в процедуре получения данных, таблица будет полностью рассчитана и заполнена в оперативной памяти сервера, а фильтрация произойдет уже на этапе компоновки. Для оптимизации следует считывать параметры из КомпоновщикНастроек.Настройки непосредственно перед формированием таблицы.

Альтернативные подходы к организации наборов

Проанализируем ситуации, когда использование внешнего набора данных можно оптимизировать или заменить другими механизмами:

  1. Использование набора данных «Запрос»: если вычисления можно перенести в язык запросов 1С, предпочтительно использовать стандартный запрос схемы. Это позволяет СУБД самостоятельно оптимизировать выборку и накладывать пользовательские отборы на этапе чтения данных.
  2. Использование объекта МенеджерВременныхТаблиц: если часть данных необходимо подготовить алгоритмически в коде, таблицу можно предварительно выгрузить во временную таблицу. Передав МенеджерВременныхТаблиц в ПроцессорКомпоновкиДанных, можно строить отчет на базе набора данных Запрос, объединяя физические таблицы базы данных с подготовленной временной таблицей.
← На главную