Как программно изменить заголовки полей в отчете СКД в 1С?

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

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

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

Проанализируем основные причины, по которым платформа 1С может игнорировать установленный заголовок:

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

Рассмотри три проверенных способа решения этой задачи.

Вариант 1. Изменение заголовка поля напрямую в схеме компоновки данных

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

Посмотрим на пример кода в модуле объекта отчета:


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

КонецПроцедуры

Вариант 2. Перебор элементов выбора в настройках компоновщика

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

Разберем пример реализации:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    Дата1 = Строка(КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек, "Период1").Значение);
    Дата2 = Строка(КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек, "Период2").Значение);

    Для Каждого ЭлементВыбора Из Настройки.Выбор.Элементы Цикл
        Если ЭлементВыбора.Поле = Новый ПолеКомпоновкиДанных("Период1") Тогда
            ЭлементВыбора.Заголовок = Дата1;
            ЭлементВыбора.Использование = Истина;
        КонецЕсли;
        
        Если ЭлементВыбора.Поле = Новый ПолеКомпоновкиДанных("Период2") Тогда
            ЭлементВыбора.Заголовок = Дата2;
            ЭлементВыбора.Использование = Истина;
        КонецЕсли;
    КонецЦикла;

    КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

КонецПроцедуры

Вариант 3. Ручная компоновка с подстановкой шаблонов в макет

Разберем ситуацию, когда стандартный механизм вывода приводит к сдвигу пользовательских макетов при отключении колонок. В этом случае отключают стандартную обработку компоновки (СтандартнаяОбработка = Ложь), генерируют МакетКомпоновкиДанных и программно заменяют ключевые текстовые метки (например, %НачалоПериода%) прямо в ячейках макета.

Рассмотрим пошаговый алгоритм выполнения:

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

Посмотрим на практическую реализацию данного способа:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;
    НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
    
    ЗначениеПериода = НастройкиКомпоновки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
    
    Дата1 = "";
    Дата2 = "";
    Если ЗначениеПериода <> Неопределено И ЗначениеПериода.Использование Тогда
        Дата1 = Формат(ЗначениеПериода.Значение.ДатаНачала, "ДФ=dd.MM.yyyy");
        Дата2 = Формат(ЗначениеПериода.Значение.ДатаОкончания, "ДФ=dd.MM.yyyy");
    КонецЕсли;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки, ДанныеРасшифровки);

    Для Каждого ТекМакет Из МакетКомпоновки.Макеты Цикл
        Если НЕ ТипЗнч(ТекМакет.Макет) = Тип("МакетОбластиКомпоновкиДанных") Тогда
            Продолжить;
        КонецЕсли;
        
        Для Каждого Макет Из ТекМакет.Макет Цикл
            Для Каждого Ячейка Из Макет.Ячейки Цикл
                Для Каждого Элемент Из Ячейка.Элементы Цикл
                    Если Найти(Элемент.Значение, "%НачалоПериода%") > 0 Тогда
                        Элемент.Значение = СтрЗаменить(Элемент.Значение, "%НачалоПериода%", Дата1);
                    ИначеЕсли Найти(Элемент.Значение, "%КонецПериода%") > 0 Тогда
                        Элемент.Значение = СтрЗаменить(Элемент.Значение, "%КонецПериода%", Дата2);
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

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

КонецПроцедуры
← На главную