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