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