Как программно установить отбор в форме выбора по нескольким значениям или исключить определенные расширения

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

При разработке на платформе 1С:Предприятие 8.3 часто возникает задача ограничить выбор данных в стандартных формах. Типичный пример — форма присоединенных файлов, где пользователю нужно разрешить выбор только определенных типов документов (например, PDF и Word) или, наоборот, запретить выбор служебных файлов (например, табличных документов 1С с расширением .mxl). В этой статье мы подробно разберем, как реализовать такие условия, используя возможности платформы и механизмы Библиотеки стандартных подсистем (БСП).

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

Самый простой и элегантный способ установить отбор по нескольким значениям — это передать Массив в структуру параметров формы. Рассмотрим ситуацию, когда нам нужно отфильтровать список файлов по расширениям "pdf", "doc" и "docx". Система 1С достаточно интеллектуальна, чтобы понять: если в стандартный параметр Отбор передается массив, значит, нужно использовать вид сравнения В списке.

Разберем программный код реализации этого метода:


// 1. Подготавливаем массив допустимых расширений
МассивРасширений = Новый Массив;
МассивРасширений.Добавить("pdf");
МассивРасширений.Добавить("doc");
МассивРасширений.Добавить("docx");

// 2. Формируем структуру отбора
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Расширение", МассивРасширений);

// 3. Подготавливаем параметры открытия формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("ВладелецФайла", Объект.Ссылка); // Ссылка на владельца файлов
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);

// 4. Открываем форму
ОткрытьФорму("ОбщаяФорма.ПрисоединенныеФайлы", ПараметрыФормы, ЭтаФорма);

Этот метод хорош тем, что он не требует модификации самой формы выбора. Однако у него есть ограничение: через стандартную структуру Отбор можно реализовать только условия равенства или вхождения в список. Если нам нужно условие "Не равно", придется использовать более сложные инструменты.

Способ 2: Использование методов БСП для динамических списков

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

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

Пример использования функции БСП:


// Пример вызова внутри формы (например, в ПриСозданииНаСервере)
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
    Список,                 // Имя реквизита - ДинамическийСписок
    "Расширение",           // Имя поля
    МассивРасширений,       // Значение (массив или одиночное значение)
    ВидСравненияКомпоновкиДанных.ВСписке, 
    "Фильтр по расширениям", // Представление
    Истина                  // Использование
);

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

Способ 3: Прямое управление отбором через объект формы

Рассмотрим более сложный, но максимально гибкий сценарий: нам нужно установить отбор "Не равно" (например, исключить файлы .mxl) без изменения кода типовой формы. Для этого мы сначала получаем объект формы, модифицируем настройки ее динамического списка и только потом выводим ее пользователю.

Выясним, как это реализовать пошагово:

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

Посмотрим на пример кода:


// 1. Получаем форму, но не открываем ее сразу
ФормаВыбора = ПолучитьФорму("ОбщаяФорма.ПрисоединенныеФайлы", ПараметрыФормы, Элемент);

// 2. Находим динамический список (обычно он называется Список)
// Добавляем новый элемент отбора
НовыйОтбор = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Расширение");
НовыйОтбор.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеРавно;
НовыйОтбор.ПравоеЗначение = "mxl";
НовыйОтбор.Использование  = Истина;
НовыйОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

// 3. Теперь открываем настроенную форму
ФормаВыбора.Открыть();

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

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

Проанализируем ситуацию с точки зрения производительности. Если мы открываем форму и только после открытия добавляем отбор, динамический список может выполнить запрос к базе данных дважды: первый раз при инициализации, второй — после программного изменения отбора. Чтобы избежать этого "мигания" и лишней нагрузки, рекомендуется использовать ФиксированныеНастройки.

Разберем, как подготовить настройки компоновки данных заранее и передать их в параметрах открытия:


// Создаем компоновщик настроек для подготовки фильтра
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
// Здесь можно было бы загрузить настройки из схемы, но для простого отбора это не обязательно

// Добавляем условие "Не в списке" для исключения нескольких расширений
ЭлементОтбора = Компоновщик.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Расширение");
ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеВСписке;

МассивИсключений = Новый Массив;
МассивИсключений.Добавить("mxl");
МассивИсключений.Добавить("exe");
МассивИсключений.Добавить("bat");

ЭлементОтбора.ПравоеЗначение = МассивИсключений;
ЭлементОтбора.Использование  = Истина;

// Передаем подготовленные настройки в параметры формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", Компоновщик.Настройки);
ПараметрыФормы.Вставить("РежимВыбора", Истина);

ОткрытьФорму("ОбщаяФорма.ПрисоединенныеФайлы", ПараметрыФормы, ЭтаФорма);

Этот метод считается наиболее профессиональным, так как ФиксированныеНастройки применяются платформой в момент инициализации данных формы, что обеспечивает максимальное быстродействие.

Резюме и рекомендации

Мы рассмотрели различные подходы к фильтрации данных в формах 1С. Подведем итоги, когда и какой метод лучше использовать:

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

← На главную