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