Почему не работают отборы в отчете СКД при программном выводе и как это исправить?

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

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

Анализ основной проблемы: настройки по умолчанию против настроек пользователя

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

Проанализируем фрагмент кода, который приводит к «потере» отборов:


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

В чем здесь подвох? Свойство НастройкиПоУмолчанию объекта СхемаКомпоновкиДанных содержит те параметры и отборы, которые вы жестко задали в конфигураторе на вкладке "Настройки". Когда пользователь в режиме 1С:Предприятие меняет отборы на форме, эти изменения попадают в КомпоновщикНастроек, но никак не меняют саму схему. Используя настройки по умолчанию, мы фактически приказываем системе игнорировать всё, что ввел пользователь.

Решение №1: Правильное использование настроек компоновщика

Чтобы отчет учитывал пользовательские изменения, необходимо использовать настройки, накопленные в объекте КомпоновщикНастроек. Рассмотрим правильный порядок действий:

  1. Устанавливаем СтандартнаяОбработка = Ложь, чтобы система не пыталась вывести отчет дважды.
  2. Получаем полные настройки с помощью метода ПолучитьНастройки(). Этот метод собирает воедино фиксированные настройки, пользовательские настройки и текущие настройки компоновщика.
  3. Передаем именно эти настройки в КомпоновщикМакета.

Выясним, как выглядит эталонный код для ручного вывода отчета:


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

Решение №2: Когда лучше ничего не писать

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

Посмотрим, почему это работает. По умолчанию свойство СтандартнаяОбработка равно Истина. Это значит, что платформа 1С сама выполнит все шаги, описанные выше: возьмет схему, применит настройки пользователя, сформирует макет и выведет его в форму. Если вы не добавляете в этот процесс специфическую логику (например, программное изменение текста запроса или добавление внешних наборов данных), ручное вмешательство только создает риск ошибок.

Разберем важные детали объектов СКД

Для глубокого понимания работы с отчетами важно различать функции ключевых объектов:

КомпоновщикНастроек.ПолучитьНастройки() — возвращает объект НастройкиКомпоновкиДанных. Это «снимок» всех фильтров, группировок и полей оформления, актуальных на момент вызова.

КомпоновщикМакетаКомпоновкиДанных — этот объект превращает абстрактную схему и настройки в конкретный МакетКомпоновкиДанных. Именно на этом этапе происходит соединение таблиц, расчет итогов (на уровне логики макета) и подготовка запросов.

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

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

Практические советы

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

← На главную