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