Как программно переместить отбор или параметр на панели быстрых настроек отчета?

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

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

Проблема стандартного размещения в СКД

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

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

Способ 1: Использование переопределяемых модулей БСП

Если ваша конфигурация построена на БСП (например, ERP, УТ 11, КА или БП 3.0), мы можем «вклиниться» в процесс создания формы отчета, не снимая общую форму с поддержки. Для этого проанализируем последовательность действий.

Во-первых, необходимо зарегистрировать наш отчет в механизме вариантов отчетов. В общем модуле ВариантыОтчетовПереопределяемый найдем процедуру НастройкиВариантовОтчета и добавим код для нашего отчета:


ОписаниеОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.МойУникальныйОтчет);
ОписаниеОтчета.ОпределитьНастройкиФормы = Истина; // Позволяет также настраивать доступность элементов у пользователей

После этого в модуле объекта самого отчета нам нужно создать две экспортные процедуры, которые позволят управлять формой:


// Определяем, что мы хотим перехватить событие создания формы на сервере
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.События.ПриСозданииНаСервере = ИСТИНА;
КонецПроцедуры

// Реализуем логику перемещения элементов
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
    // Здесь мы будем работать с коллекцией Форма.Элементы
КонецПроцедуры

Как правильно перемещать элементы на форме

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

Рассмотрим алгоритм правильного перемещения:

  1. Найдем идентификатор настройки в компоновщике.
  2. Определим имя элемента формы, соответствующее этому идентификатору (оно часто начинается с префикса КомпоновщикНастроекПользовательскиеНастройкиЗначение...).
  3. Используем метод Элементы.Переместить().

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


// Пример перемещения элемента "Отбор" перед элементом "Параметр"
ЭлементОтбор = Форма.Элементы.Найти("ИмяЭлементаОтбора");
ЭлементКудаПереместить = Форма.Элементы.Найти("ИмяЭлементаПараметра");

Если ЭлементОтбор <> Неопределено И ЭлементКудаПереместить <> Неопределено Тогда
    Форма.Элементы.Переместить(ЭлементОтбор, ЭлементОтбор.Родитель, ЭлементКудаПереместить);
КонецЕсли;

Способ 2: Замена отбора на параметр (Архитектурный подход)

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

Разберем по шагам, как это реализовать:

  1. В схеме СКД на закладке «Параметры» создаем новый параметр, например, П_Организация.
  2. Устанавливаем для него нужный тип данных (например, СправочникСсылка.Организации).
  3. Включаем его в «Быстрые настройки».
  4. В тексте запроса или на закладке «Условия» прописываем логику фильтрации, которая будет учитывать, заполнен ли параметр:

ГДЕ (Таблица.Организация = &П_Организация ИЛИ &П_Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка))

Или, используя возможности СКД для необязательных параметров:


ГДЕ (Организация = &П_Организация) // И включить параметр в список доступных для настройки пользователем

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

Особенности работы с динамическими именами

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

Проанализируем лучший способ поиска:


// Функция для поиска элемента формы по идентификатору настройки
Для Каждого ЭлементНастройки Из Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
    ИмяЭлемента = "КомпоновщикНастроекПользовательскиеНастройкиЗначение" + Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификатор(ЭлементНастройки);
    НайденныйЭлемент = Форма.Элементы.Найти(ИмяЭлемента);
    // Теперь у нас есть ссылка на элемент, и мы можем менять его положение
КонецЦикла;

Выводы и рекомендации

Подводя итоги, можно выделить два основных пути решения задачи:

  1. Программный путь: через ВариантыОтчетовПереопределяемый и метод Элементы.Переместить(). Этот способ сохраняет семантику «отбора», но требует аккуратности при поиске динамических имен элементов и понимания структуры формы БСП.
  2. Визуальный путь: использование параметров вместо отборов. Это максимально надежный способ, который не ломается при обновлении конфигурации и позволяет пользователю видеть красивый, упорядоченный интерфейс «из коробки».

Выбор зависит от того, насколько критично для бизнес-логики использование именно механизма отборов (например, если нужны сложные виды сравнения «В списке», «Не равно» и т.д.). Если же достаточно простого равенства, то использование параметров будет более рациональным и стабильным решением.

← На главную