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