Как передать значение параметра в вычисляемое поле СКД при использовании внешнего набора данных?

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

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

В отличие от классического набора данных на основе запроса, где параметры определяются системой автоматически при парсинге текста, во внешних наборах данных прямое обращение вида &ИмяПараметра в вычисляемом поле может приводить к ошибкам или возвращать пустое значение. В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем причины и рассмотрим три надежных способа ее решения.

Выясняем причину: почему стандартное обращение через «&» не работает?

Когда мы используем Набор данных - запрос, СКД сама создает параметры на соответствующей вкладке. При использовании Набора данных - объект система «не знает», какие параметры могут потребоваться для вычислений, поэтому автоматического связывания не происходит. Чтобы обращение к параметру через символ амперсанда (&) заработало в вычисляемом поле, должны быть строго соблюдены три условия:

  1. Ручное создание параметра. Параметр должен быть явно добавлен на вкладке «Параметры» в конструкторе схемы компоновки данных.
  2. Доступность для пользователя. У параметра должно быть снято свойство «Ограничение доступности», чтобы пользователь мог заполнять его на форме.
  3. Корректное вычисление итогов. Если поле с параметром выводится в группировках, СКД должна понимать, как агрегировать это значение на уровне итогов. Без настройки ресурсов значение будет отображаться только в детальных записях.

Давайте подробно разберем по шагам варианты реализации этой задачи.

Решение 1. Классическая настройка параметра в СКД и вывод через ресурсы

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

Шаг 1. Создание параметра в схеме

Перейдите на вкладку Параметры в конструкторе СКД и добавьте новый параметр (например, ПериодДатаОкончания). Укажите для него тип данных Дата. Убедитесь, что флажок «Ограничение доступности» снят.

Шаг 2. Создание вычисляемого поля

Перейдите на вкладку Вычисляемые поля. Добавьте новое поле, укажите его путь к данным (например, ДатаОкончанияДляВычислений). В колонке «Выражение» напишите имя вашего параметра с префиксом &:

&ПериодДатаОкончания

Шаг 3. Настройка ресурсов (Критически важный шаг!)

Если вы просто добавите это вычисляемое поле в группировки отчета, то заметите, что на уровнях итогов поле останется пустым. Чтобы значение параметра отображалось на всех уровнях иерархии группировок, его необходимо сделать ресурсом:

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

Решение 2. Программное добавление колонки в Таблицу Значений (простой и надежный путь)

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

Давайте проанализируем, как можно модифицировать исходный код процедуры компоновки результата. Вместо жесткого поиска параметров по индексам (что часто приводит к ошибкам при изменении состава настроек пользователем), выполним поиск параметров по их именам.

Рассмотрим пример программной подготовки данных:


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

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

Решение 3. Использование экспортных функций общих модулей

Если логика расчета значения в вычисляемом поле сложная и завязана на параметры схемы, можно вызвать функцию общего модуля прямо из выражения вычисляемого поля, передав туда параметр.

Для этого в вычисляемом поле СКД в колонке «Выражение» пишем вызов функции неглобального общего модуля:

МойОбщийМодульСервер.РассчитатьПоказатель(Сотрудник, &ПериодДатаОкончания)

Сам метод в общем модуле должен быть объявлен с ключевым словом Экспорт:


Функция РассчитатьПоказатель(Сотрудник, ДатаРасчета) Экспорт
    
    // Произвольный алгоритм вычислений на сервере
    Если Не ЗначениеЗаполнено(ДатаРасчета) Тогда
        Возврат 0;
    КонецЕсли;
    
    Результат = // Ваш расчет...
    Возврат Результат;
    
КонецФункции

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


ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы, ДанныеРасшифровки, Истина);

Подведем итоги

Мы проанализировали три различных подхода к решению проблемы передачи параметров в вычисляемые поля СКД при работе с внешними источниками данных. Использование прямого обращения &Параметр отлично работает при правильной настройке вкладки «Ресурсы» в схеме компоновки. Программное добавление колонки в Таблицу Значений является максимально прозрачным и простым решением, исключающим ошибки инициализации в схеме, а использование функций общего модуля предоставляет разработчику неограниченную гибкость для сложных расчетов.

← На главную