Как расположить элементы отбора динамического списка горизонтально в одну строку?

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

При разработке управляемых форм списков документов или справочников часто требуется вынести отборы динамического списка в шапку формы для быстрого доступа пользователей. Однако при стандартном связывании группы формы с пользовательскими настройками динамического списка разработчики сталкиваются с особенностью платформы 1С:Предприятие 8.3: платформа генерирует элементы отбора строго вертикально в две колонки.

Проанализируем причины такого поведения и разберем практические способы выстроить элементы отбора в горизонтальную линию.

Почему не работают стандартные свойства группы формы

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

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

Чтобы обойти это платформенное ограничение, рассмотрим два рабочих подхода.

Способ 1. Программная генерация элементов через метод СоздатьЭлементыФормыПользовательскихНастроек

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

Синтаксис метода выглядит следующим образом:

СоздатьЭлементыФормыПользовательскихНастроек(<ГруппаПользовательскихНастроек>, <Режим>, <КоличествоКолонок>)

Разберем назначение параметров:

  1. ГруппаПользовательскихНастроек — группа управляемой формы (обычно обычная группа без отображения), внутри которой будут сгенерированы элементы. Обратите внимание: в свойствах таблицы динамического списка свойство Группа пользовательских настроек связывать с этой группой не нужно, иначе платформа перезапишет ваши настройки.
  2. Режим — значение системного перечисления РежимОтображенияНастроекКомпоновкиДанных. Для компактного вывода элементов отбора необходимо использовать значение РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ. Если указать значение Все, платформа сгенерирует громоздкие закладки настроек СКД.
  3. КоличествоКолонок — ключевой параметр для решения нашей задачи. Если мы хотим расположить все отборы в одну строку по горизонтали, передаем сюда число, равное количеству выводимых отборов (или значение с запасом, например, 5 или 10).

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

Посмотрим на пример кода в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Генерируем элементы быстрого доступа в одну строку (например, до 5 колонок)
    СоздатьЭлементыФормыПользовательскихНастроек(
        Элементы.ГруппаШапкаОтборов, 
        РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ, 
        5
    );
    
КонецПроцедуры

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

Посмотрим, как правильно оформить этот обработчик:


&НаСервере
Процедура СписокПриОбновленииСоставаПользовательскихНастроекНаСервере(Элемент, СтандартнаяОбработка)
    
    // Отключаем стандартное платформенное создание элементов в 2 колонки
    СтандартнаяОбработка = Ложь;
    
    // Повторно генерируем разметку с горизонтальным расположением
    СоздатьЭлементыФормыПользовательскихНастроек(
        Элементы.ГруппаШапкаОтборов, 
        РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ, 
        5
    );
    
КонецПроцедуры

Флаг СтандартнаяОбработка = Ложь; здесь критически важен: именно он предотвращает повторную генерацию сетки по умолчанию.

Способ 2. Использование собственных реквизитов формы и фиксированных настроек

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

Шаги реализации:

  1. Добавляем в реквизиты формы поля для отборов, например, ОтборОрганизация и ОтборСостояние.
  2. Создаем на форме обычную группу с группировкой Горизонтальная или В строке и перетаскиваем туда добавленные поля ввода.
  3. В обработчиках событий ПриИзменении элементов формы устанавливаем отбор в динамическом списке через коллекцию ФиксированныеНастройки.Отбор.

Посмотрим на пример установки отбора:


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

Такой подход полностью исключает вмешательство механизмов автогенерации платформы и гарантирует, что визуальный интерфейс останется именно таким, каким его спроектировал разработчик.

← На главную