Как установить фильтр на тип (расширение) файлов в форме присоединенных файлов

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

В процессе разработки в среде 1С часто возникает задача ограничить список отображаемых или выбираемых файлов конкретными расширениями. Например, если в табличную часть документа должны попадать только счета в формате PDF или изображения. В типовых конфигурациях, построенных на Библиотеке стандартных подсистем (БСП), для управления файлами используется форма «Присоединенные файлы». Настройка фильтров в такой форме имеет свои нюансы, связанные с работой динамических списков и асинхронностью платформы.

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

Почему не работают стандартные методы в процедуре ПриОткрытии

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

Кроме того, динамические списки в БСП часто используют сложные программно формируемые запросы. В коде можно встретить конструкции вида &ИмяСправочника КАК Файлы. Это означает, что текст запроса подменяется в коде динамически в зависимости от того, к какому объекту (документу или справочнику) прикреплены файлы. Попытки «в лоб» отредактировать такой запрос в конфигураторе могут привести к ошибкам выполнения.

Способ 1. Передача отбора через параметры открытия формы

Наиболее правильным и «чистым» способом ограничить список файлов является передача структуры отбора в момент вызова формы. Если вы открываете форму программно, используйте параметр Отбор. Рассмотрим пример кода:


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

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

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

// Открываем форму присоединенных файлов
ОткрытьФорму("Справочник.ДоговорыКонтрагентовПрисоединенныеФайлы.Форма.ФормаСписка", ПараметрыФормы);

В этом случае платформа автоматически применит фильтр к динамическому списку, и пользователь увидит только те файлы, расширения которых входят в ваш массив.

Способ 2. Установка фиксированного отбора в Компоновщике настроек

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

Проанализируем шаги для реализации этого метода:

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

Пример программной реализации:


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

КонецПроцедуры

Важный нюанс: использование ФиксированныеНастройки гарантирует, что пользователь не сможет отключить этот фильтр через стандартное меню «Настроить список».

Способ 3. Ограничение типов при выборе файлов с диска

Если ваша задача — не только отфильтровать уже имеющиеся файлы, но и запретить добавление новых файлов «неправильных» типов, нужно воздействовать на объект ДиалогВыбораФайла. В БСП за добавление файлов обычно отвечают экспортные процедуры в модулях РаботаСФайламиКлиент.

Выясним, как программно задать маску выбора. У объекта ДиалогВыбораФайла есть свойство Фильтр, которое принимает строку специального формата. Рассмотрим пример установки фильтра для диалога:


Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите документы для загрузки";
Диалог.ПолноеИмяФайла = "";
// Формат: Описание|*.расширение1;*.расширение2
Диалог.Фильтр = "Документы PDF (*.pdf)|*.pdf|Документы Word (*.docx)|*.docx";
Диалог.МножественныйВыбор = Ложь;

Если Диалог.Выбрать() Тогда
    // Обработка выбранного файла
КонецЕсли;

Работа с динамическим запросом (&ИмяСправочника)

Как упоминалось в сообщении (9), в БСП текст запроса динамического списка часто содержит параметры-заполнители. Если вам все же необходимо изменить текст запроса программно, помните, что конструкция &ИмяСправочника — это не параметр запроса в обычном понимании 1С (который устанавливается через УстановитьПараметр), а текстовая метка, которую код БСП заменяет на реальное имя таблицы перед выполнением.

Для корректной отладки такого запроса в консоли запросов замените &ИмяСправочника на реальное имя, например, Справочник.ДоговорыКонтрагентовПрисоединенныеФайлы. В коде формы лучше не менять текст запроса без крайней необходимости, отдавая предпочтение Компоновщику настроек, так как поле Расширение практически всегда присутствует в стандартных выборках БСП.

Подведем итог: для фильтрации списка используйте КомпоновщикНастроек или параметры открытия формы, а для ограничения выбора новых файлов — свойство Фильтр объекта ДиалогВыбораФайла. Это обеспечит стабильную работу системы и корректное поведение интерфейса для пользователя.

← На главную