Как правильно использовать Компоновщик настроек СКД на управляемой форме элемента?

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

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

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

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

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

Решение №1: Инициализация через временное хранилище (рекомендуемый способ)

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

Разберем по шагам реализацию в процедуре ПриСозданииНаСервере:


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

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

Решение №2: Прямая инициализация объектом схемы

Если по каким-то причинам вы не хотите использовать временное хранилище, можно инициализировать компоновщик непосредственно объектом схемы. Однако стоит помнить, что это может увеличить нагрузку на память, так как вся схема будет "висеть" в контексте сервера.


&НаСервере
Процедура ИнициализироватьНапрямую()
    
    СхемаСКД = Справочники.ЭтикеткиИЦенники.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // Инициализация напрямую объектом схемы
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД);
    КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
    
    // Не забываем загрузить начальные настройки
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаСКД.НастройкиПоУмолчанию);
    
КонецПроцедуры

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

Синхронизация и применение пользовательских настроек

Важно понимать, что в компоновщике существует разделение на "основные настройки" (Settings) и "пользовательские настройки" (UserSettings). Когда пользователь меняет что-то в таблице на форме, изменения попадают в UserSettings.

Выясним, как программно применить эти изменения перед выполнением отчета. Рассмотрим пример функции, которая подготавливает итоговые настройки для процессора компоновки:


&НаСервере
Функция ПолучитьНастройкиДляВывода()
    
    // Если пользователь редактировал настройки на форме, 
    // их нужно "влить" в основные настройки компоновщика.
    КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки();
    
    // Теперь переменная Настройки содержит актуальный срез данных
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    Возврат Настройки;
    
КонецФункции

Программная установка параметров (Фильтрация по текущему объекту)

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

Рассмотрим пример установки значения параметра в ПриСозданииНаСервере:


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

Если вы хотите, чтобы этот отбор был жестким и не отображался в списке доступных пользователю, используйте Фиксированные настройки (FixedSettings). Настройки, добавленные туда, объединяются с пользовательскими по правилу "И", но скрыты от глаз пользователя.

Вывод результата на форму

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

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

Рассмотрим пример кода для обновления данных на форме:


&НаСервере
Процедура ОбновитьДанныеНаФорме()
    
    СхемаСКД = Справочники.ЭтикеткиИЦенники.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // Синхронизируем настройки
    КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки();
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Формируем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки);
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // Очищаем таблицу-результат на форме (Реквизит "ТаблицаРезультат")
    Объект.ТаблицаРезультат.Очистить();
    
    // Выводим данные в таблицу значений
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(Объект.ТаблицаРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Подведение итогов

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

← На главную