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