Попробуем теперь программно описать саму схему компоновки данных, ее наборы данных, поля, ресурсы и вычисляемые поля, используемые затем в настройке отчета. Эта задача довольно трудоемкая, но полезная с точки зрения освоения методов и свойств объектов системы компоновки данных. Информацию о них можно увидеть в разделе синтакс-помощника Общие объекты⇒Система компоновки данных⇒Схема компоновки данных…
В модуле формы документа откроем функцию АнализЦенДокумента() и отредактируем фрагмент кода следующим образом (листинг 2.68).
Листинг 2.68. Фрагмент функции «АнализЦенДокумента()»
// СхемаКомпоновкиДанных = ПолучитьМакет("АнализЦенКомплектующих");
СхемаКомпоновкиДанных = УстановитьСхему();
Настройки = УстановитьНастройки(СхемаКомпоновкиДанных);
Как видим, мы закомментировали использование схемы компоновки данных АнализЦенКомплектующих, содержащейся в макете документа, и добавили вызов функции УстановитьСхему(), которая будет возвращать программно созданную новую схему компоновки.
Функцию УстановитьСхему() будем вносить и комментировать по частям для лучшего восприятия материала. Сначала создадим новую схему компоновки данных. Добавим локальный источник данных информационной базы. Затем создадим НаборДанныхОбъединение с именем НаборДанных1 и два его элемента НаборДанныхОбъект с именами ЦеныСборки и ЦеныПоступления. Обратите внимание, что имена наборов и их полей должны совпадать с указанными именами в процедуре их программного заполнения при нажатии кнопки Анализ цен (листинг 2.69).
Листинг 2.69. Процедура программной установки схемы компоновки
&НаСервере
Функция УстановитьСхему()
СКД = Новый СхемаКомпоновкиДанных;
ИД = СКД.ИсточникиДанных.Добавить();
ИД.Имя = "ИсточникДанных";
ИД.ТипИсточникаДанных = "Local";
НаборДанных = СКД.НаборыДанных.Добавить(
Тип("НаборДанныхОбъединениеСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных1";
Набор1 = НаборДанных.Элементы.Добавить(
Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
Набор1.Имя = "ЦеныСборки";
Набор1.ИмяОбъекта = "ЦеныСборки";
Набор1.ИсточникДанных = "ИсточникДанных";
Набор2 = НаборДанных.Элементы.Добавить(
Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
Набор2.Имя = "ЦеныПоступления";
Набор2.ИмяОбъекта = "ЦеныПоступления";
Набор2.ИсточникДанных = "ИсточникДанных";
…
В первый набор – объект добавим поле: Номенклатура, ЦенаСборки с заголовком Цена и Собрано с заголовком Количество. Во второй набор – объект добавим поле: Номенклатура, ЦенаПриход с заголовком Цена и Поступило с заголовком Количество. Обратите внимание, что имя поля и путь к данным у полей внешних наборов данных совпадают (листинг 2.70).
Листинг 2.70. Процедура программной установки схемы компоновки
…
Поле1 = Набор1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле1.Поле = "Номенклатура";
Поле1.ПутьКДанным = "Номенклатура";
Поле1.Заголовок = "Номенклатура";
Поле2 = Набор1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле2.Поле = "ЦенаСборки";
Поле2.ПутьКДанным = "ЦенаСборки";
Поле2.Заголовок = "Цена";
Поле3 = Набор1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле3.Поле = "Собрано";
Поле3.ПутьКДанным = "Собрано";
Поле3.Заголовок = "Количество";
Поле1 = Набор2.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле1.Поле = "Номенклатура";
Поле1.ПутьКДанным = "Номенклатура";
Поле1.Заголовок = "Номенклатура";
Поле2 = Набор2.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле2.Поле = "ЦенаПриход";
Поле2.ПутьКДанным = "ЦенаПриход";
Поле2.Заголовок = "Цена";
Поле3 = Набор2.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле3.Поле = "Поступило";
Поле3.ПутьКДанным = "Поступило";
Поле3.Заголовок = "Количество";
…
Далее добавим вычисляемое поле Выручка и зададим его формат без вывода дробной части. Затем добавим поля ресурсов ЦенаПриход, ЦенаСборки, Поступило, Собрано и Выручка и зададим выражения для их расчета (листинг 2.71).
Листинг 2.71. Процедура программной установки схемы компоновки
…
ВычПоле = СКД.ВычисляемыеПоля.Добавить();
ВычПоле.ПутьКДанным = "Выручка";
ВычПоле.Заголовок = "Выручка";
ВычПоле.Оформление.УстановитьЗначениеПараметра("Формат", "ЧЦ=6; ЧДЦ=0");
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = "ЦенаПриход";
ПолеРесурса.Выражение = "Среднее(ЦенаПриход)";
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = "ЦенаСборки";
ПолеРесурса.Выражение = "Среднее(ЦенаСборки)";
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = "Поступило";
ПолеРесурса.Выражение = "Сумма(Поступило)";
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = "Собрано";
ПолеРесурса.Выражение = "Сумма(Собрано)";
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = "Выручка";
ПолеРесурса.Выражение = "Сумма(Собрано) * (Среднее(ЦенаСборки) –
Среднее(ЦенаПриход))";
…
В заключение нам осталось задать формат полей ЦенаПриход и ЦенаСборки также без вывода дробной части. Но поскольку на уровне наборов данных – объектов нет возможности задать оформление, эти поля сначала нужно добавить в набор данных – объединение. Автоматически, как в конструкторе компоновки данных, в родительский набор они не добавляются (листинг 2.72).
Листинг 2.72. Процедура программной установки схемы компоновки
…
ПолеЦены = НаборДанных.Поля.Добавить(
Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеЦены.Поле = "ЦенаСборки";
ПолеЦены.ПутьКДанным = "ЦенаСборки";
ПолеЦены.Оформление.УстановитьЗначениеПараметра("Формат", "ЧЦ=6; ЧДЦ=0");
ПолеЦены = НаборДанных.Поля.Добавить(
Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеЦены.Поле = "ЦенаПриход";
ПолеЦены.ПутьКДанным = "ЦенаПриход";
ПолеЦены.Оформление.УстановитьЗначениеПараметра("Формат", "ЧЦ=6; ЧДЦ=0");
Возврат СКД;
КонецФункции
Проверим результат. Мы получим абсолютно такой же отчет, как и при использовании схемы компоновки данных (см. рис. 2.313). Таким образом, мы убедились, что каждый этап процесса компоновки данных можно сформировать программным образом. Стоит ли это делать – зависит от конкретной задачи и подхода разработчика. В большинстве случаев при разработке отчетов можно обойтись интерактивными возможностями платформы.
Итак, на этом примере мы научились: