При разработке на платформе 1С:Предприятие 8.3 часто возникает задача ограничить выбор данных в стандартных формах. Типичный пример — форма присоединенных файлов, где пользователю нужно разрешить выбор только определенных типов документов (например, PDF и Word) или, наоборот, запретить выбор служебных файлов (например, табличных документов 1С с расширением .mxl). В этой статье мы подробно разберем, как реализовать такие условия, используя возможности платформы и механизмы Библиотеки стандартных подсистем (БСП).
Самый простой и элегантный способ установить отбор по нескольким значениям — это передать Массив в структуру параметров формы. Рассмотрим ситуацию, когда нам нужно отфильтровать список файлов по расширениям "pdf", "doc" и "docx". Система 1С достаточно интеллектуальна, чтобы понять: если в стандартный параметр Отбор передается массив, значит, нужно использовать вид сравнения В списке.
Разберем программный код реализации этого метода:
// 1. Подготавливаем массив допустимых расширений
МассивРасширений = Новый Массив;
МассивРасширений.Добавить("pdf");
МассивРасширений.Добавить("doc");
МассивРасширений.Добавить("docx");
// 2. Формируем структуру отбора
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Расширение", МассивРасширений);
// 3. Подготавливаем параметры открытия формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("ВладелецФайла", Объект.Ссылка); // Ссылка на владельца файлов
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
// 4. Открываем форму
ОткрытьФорму("ОбщаяФорма.ПрисоединенныеФайлы", ПараметрыФормы, ЭтаФорма);
Этот метод хорош тем, что он не требует модификации самой формы выбора. Однако у него есть ограничение: через стандартную структуру Отбор можно реализовать только условия равенства или вхождения в список. Если нам нужно условие "Не равно", придется использовать более сложные инструменты.
Если ваша конфигурация построена на базе БСП, мы можем воспользоваться готовыми программными интерфейсами. В библиотеке существует специальный общий модуль ОбщегоНазначенияКлиентСервер, который позволяет гибко управлять элементами отбора ДинамическийСписок.
Проанализируем ситуацию, когда форму нужно открыть, а затем программно донастроить ее список. В этом случае мы можем вызвать процедуру установки отбора. Важно понимать, что это чаще всего делается внутри модуля самой открываемой формы, но метод применим и при разработке универсальных механизмов.
Пример использования функции БСП:
// Пример вызова внутри формы (например, в ПриСозданииНаСервере)
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список, // Имя реквизита - ДинамическийСписок
"Расширение", // Имя поля
МассивРасширений, // Значение (массив или одиночное значение)
ВидСравненияКомпоновкиДанных.ВСписке,
"Фильтр по расширениям", // Представление
Истина // Использование
);
Преимущество этого подхода заключается в том, что БСП берет на себя проверку существующих отборов, корректное добавление новых элементов и управление их активностью.
Рассмотрим более сложный, но максимально гибкий сценарий: нам нужно установить отбор "Не равно" (например, исключить файлы .mxl) без изменения кода типовой формы. Для этого мы сначала получаем объект формы, модифицируем настройки ее динамического списка и только потом выводим ее пользователю.
Выясним, как это реализовать пошагово:
ПолучитьФорму вместо ОткрытьФорму. Это позволяет нам обратиться к реквизитам формы до того, как они будут отрисованы.Список.Отбор.Элементы.ЭлементОтбораКомпоновкиДанных.Посмотрим на пример кода:
// 1. Получаем форму, но не открываем ее сразу
ФормаВыбора = ПолучитьФорму("ОбщаяФорма.ПрисоединенныеФайлы", ПараметрыФормы, Элемент);
// 2. Находим динамический список (обычно он называется Список)
// Добавляем новый элемент отбора
НовыйОтбор = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Расширение");
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
НовыйОтбор.ПравоеЗначение = "mxl";
НовыйОтбор.Использование = Истина;
НовыйОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
// 3. Теперь открываем настроенную форму
ФормаВыбора.Открыть();
Важный нюанс: Установка РежимОтображения в значение Недоступный гарантирует, что пользователь не сможет случайно или намеренно отключить этот фильтр через меню "Настроить список".
Проанализируем ситуацию с точки зрения производительности. Если мы открываем форму и только после открытия добавляем отбор, динамический список может выполнить запрос к базе данных дважды: первый раз при инициализации, второй — после программного изменения отбора. Чтобы избежать этого "мигания" и лишней нагрузки, рекомендуется использовать ФиксированныеНастройки.
Разберем, как подготовить настройки компоновки данных заранее и передать их в параметрах открытия:
// Создаем компоновщик настроек для подготовки фильтра
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
// Здесь можно было бы загрузить настройки из схемы, но для простого отбора это не обязательно
// Добавляем условие "Не в списке" для исключения нескольких расширений
ЭлементОтбора = Компоновщик.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Расширение");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке;
МассивИсключений = Новый Массив;
МассивИсключений.Добавить("mxl");
МассивИсключений.Добавить("exe");
МассивИсключений.Добавить("bat");
ЭлементОтбора.ПравоеЗначение = МассивИсключений;
ЭлементОтбора.Использование = Истина;
// Передаем подготовленные настройки в параметры формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", Компоновщик.Настройки);
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("ОбщаяФорма.ПрисоединенныеФайлы", ПараметрыФормы, ЭтаФорма);
Этот метод считается наиболее профессиональным, так как ФиксированныеНастройки применяются платформой в момент инициализации данных формы, что обеспечивает максимальное быстродействие.
Мы рассмотрели различные подходы к фильтрации данных в формах 1С. Подведем итоги, когда и какой метод лучше использовать:
Отбор (Способ 1). Это минимум кода и отсутствие зависимости от структуры формы.ОбщегоНазначенияКлиентСервер (Способ 2).ФиксированныеНастройки (Способ 4). Это наиболее надежный способ, исключающий двойное считывание данных из БД.ПолучитьФорму и прямое обращение к элементам списка (Способ 3).Помните, что при работе с расширениями файлов в 1С регистр строк может иметь значение (хотя обычно платформа игнорирует его в отборах динамических списков). Для надежности всегда проверяйте, как расширения хранятся в вашей базе данных — с точкой или без, в верхнем или нижнем регистре.