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