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

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

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

Анализ корневой причины проблемы

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

Шаг 1. Настройка параметров в конструкторе СКД

Прежде чем переходить к коду, проверим настройки в самой схеме компоновки данных. Рассмотрим по шагам:

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

Шаг 2. Особенности типа СтандартныйПериод

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

Рассмотрим правильный способ инициализации в коде:


ПараметрПериод = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
Если ПараметрПериод <> Неопределено Тогда
    // Создаем новый объект СтандартныйПериод и заполняем его
    НовоеЗначениеПериода = Новый СтандартныйПериод();
    НовоеЗначениеПериода.ДатаНачала = НачалоДня(ВыбраннаяДатаНачала);
    НовоеЗначениеПериода.ДатаОкончания = КонецДня(ВыбраннаяДатаОкончания);
    
    // Устанавливаем объект в значение параметра
    ПараметрПериод.Значение = НовоеЗначениеПериода;
    ПараметрПериод.Использование = Истина;
КонецЕсли;

Шаг 3. Учет иерархии настроек: Основные и Пользовательские

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

Проанализируем ситуацию: вы меняете значение в коде в основных настройках, но система при выполнении отчета берет "пустое" значение из пользовательских настроек, которые перекрывают ваш код. Чтобы этого избежать, нужно находить параметр именно в пользовательских настройках по его идентификатору.

Посмотрим на пример правильного кода для установки через пользовательские настройки:


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

Если ПараметрПериод <> Неопределено Тогда
    // Ищем соответствующий элемент в пользовательских настройках
    Идентификатор = ПараметрПериод.ИдентификаторПользовательскойНастройки;
    ЭлементПользовательскойНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Идентификатор);
    
    Если ЭлементПользовательскойНастройки <> Неопределено Тогда
        // Устанавливаем значение периода
        ЭлементПользовательскойНастройки.Значение.ДатаНачала = НачалоПериода;
        ЭлементПользовательскойНастройки.Значение.ДатаОкончания = КонецПериода;
        ЭлементПользовательскойНастройки.Использование = Истина;
    КонецЕсли;
КонецЕсли;

Шаг 4. Программный вывод отчета (Диаграммы)

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


&НаСервере
Процедура ВывестиОтчетНаСервере(НачалоПериода, КонецПериода)
    // 1. Получаем схему из макета объекта
    СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // 2. Инициализируем компоновщик настроек
    КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    
    // Загружаем настройки по умолчанию
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    ТекущиеНастройки = КомпоновщикНастроек.Настройки;
    
    // 3. Устанавливаем параметры периода (упрощенно без пользовательских настроек для прямого вывода)
    ПараметрПериод = ТекущиеНастройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
    Если ПараметрПериод <> Неопределено Тогда
         ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоПериода, КонецПериода);
         ПараметрПериод.Использование = Истина;
    КонецЕсли;
    
    // 4. Формируем макет компоновки
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    
    // Важно: передаем именно наши измененные ТекущиеНастройки
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ТекущиеНастройки, ДанныеРасшифровки);
    
    // 5. Выполняем компоновку
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    // 6. Выводим результат в табличный документ на форме
    Результат = Элементы.РезультатОтчета; // Ваша область на форме
    Результат.Очистить();
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры

Дополнительные советы по отладке диаграмм

Если после всех манипуляций с кодом диаграмма все равно остается пустой, проанализируем следующие моменты:

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

← На главную