Как проинициализировать компоновщик настроек СКД на произвольной форме в 1С

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

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

Рассмотрим подробнее, почему возникают неактивные элементы отбора и как правильно проинициализировать компоновщик настроек на форме, чтобы отборы стали доступными для редактирования.

Причина возникновения проблемы

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

Без связи со схемой платформа не может проверить типы данных полей отбора, поэтому помечает элементы как недоступные для изменения и отображает их с красным крестом.

Решение: Инициализация компоновщика настроек

Чтобы отборы стали активными, разберем по шагам правильный алгоритм инициализации реквизита формы:

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

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


// Получаем макет схемы компоновки данных
СхемаКомпоновкиДанных = ПолучитьМакет("МакетОтчет");

// Помещаем схему во временное хранилище
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ФормаОтчета.УникальныйИдентификатор);

// Инициализируем компоновщик настроек на новой форме
ФормаОтчета.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));

// Загружаем настройки по умолчанию
ФормаОтчета.КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

Переформирование отчета с учетом внесенных отборов

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

  1. Получим актуальные настройки вызовом Настройки = КомпоновщикНастроек.ПолучитьНастройки(). Метод ПолучитьНастройки() гарантирует скомпонование общих и пользовательских настроек (включая установленные пользователем флаги и значения отборов).
  2. Сформируем макет компоновки с помощью объекта КомпоновщикМакетаКомпоновкиДанных.
  3. Инициализируем ПроцессорКомпоновкиДанных и выведем результат в табличный документ через ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.

Пример кода для кнопки «Сформировать» на форме отчета:


// Извлекаем итоговые настройки с учетом пользовательского отбора
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

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

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

ТабличныйДокумент = ЭлементыФормы.Результат;
ТабличныйДокумент.Очистить();

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

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

← На главную