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

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

При работе с подсистемой Библиотека стандартных подсистем (БСП) часто возникает задача ограничить пользователя в выборе файлов. Например, если в конкретном документе допустимы только изображения (png, jpg), а форма выбора показывает все присоединенные документы, включая pdf или xlsx. Рассмотрим подробно, как реализовать проверку типа файла и запретить выбор неподходящих элементов, даже если в стандартном событии выбора отсутствует параметр Отказ.

Метод 1. Установка фильтра при открытии формы (рекомендуемый способ)

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

В вызывающей форме (например, в вашем документе) при инициализации выбора программно подготовим структуру параметров. Мы можем использовать ключ ФильтрПоРасширениям. Рассмотрим пример кода:


&НаКлиенте
Процедура ВыбратьПрисоединенныйФайл()
    
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ВладелецФайлов", Объект.Ссылка);
    
    // Формируем список разрешенных расширений
    РазрешенныеРасширения = Новый Массив;
    РазрешенныеРасширения.Добавить("png");
    РазрешенныеРасширения.Добавить("jpg");
    РазрешенныеРасширения.Добавить("jpeg");
    
    ПараметрыОткрытия.Вставить("ФильтрПоРасширениям", РазрешенныеРасширения);
    
    ОткрытьФорму("ОбщаяФорма.ПрисоединенныеФайлы", ПараметрыОткрытия, ЭтаФорма);
    
КонецПроцедуры

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

Метод 2. Программная отмена выбора в событии списка

Если по каким-то причинам нам нужно оставить все файлы видимыми, но запретить выбор конкретных из них, нам придется работать с событием СписокВыбор. Вы правильно заметили, что в этом событии у таблицы формы нет параметра Отказ. Однако в платформе 1С предусмотрен механизм управления стандартной обработкой.

Выясним причину, по которой это работает: если установить СтандартнаяОбработка = Ложь, платформа не будет автоматически закрывать форму и возвращать значение. Мы можем выполнить свою проверку и, если файл подходит, завершить выбор вручную методом ОповеститьОВыборе(). Проанализируем реализацию в коде формы выбора:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // 1. Отменяем штатное поведение платформы
    СтандартнаяОбработка = Ложь;
    
    ТекущиеДанные = Элемент.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // 2. Определяем массив разрешенных типов
    МассивРасширений = Новый Массив;
    МассивРасширений.Добавить("png");
    МассивРасширений.Добавить("jpg");
    МассивРасширений.Добавить("jpeg");
    
    // Извлекаем расширение (обычно оно хранится в реквизите "Расширение")
    // В БСП расширение часто хранится без точки
    РасширениеФайла = НРег(ТекущиеДанные.Расширение);
    
    // 3. Проверяем соответствие
    Если МассивРасширений.Найти(РасширениеФайла) <> Неопределено Тогда
        // Файл подходит, завершаем выбор программно
        ОповеститьОВыборе(ВыбраннаяСтрока);
    Иначе
        // Выводим предупреждение пользователю
        ТекстСообщения = "Выбран файл не того типа! Разрешены только изображения (png, jpg).";
        ПоказатьПредупреждение(, ТекстСообщения);
    КонецЕсли;
    
КонецПроцедуры

Метод 3. Валидация на стороне вызывающей формы

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

Когда в подчиненной форме (форме выбора файлов) пользователь нажимает "Выбрать", управление возвращается в основную форму. Разберем по шагам, как выполнить проверку здесь:

  1. Пользователь выбирает файл в стандартной форме.
  2. В вызывающей форме срабатывает событие ОбработкаВыбора.
  3. Проверяем тип файла по ссылке.
  4. Если тип неверный — выводим сообщение и очищаем реквизит или просто прерываем операцию.

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    
    // Проверяем, что значение пришло именно из формы выбора файлов
    Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ПрисоединенныеФайлы") Тогда
        
        // Для проверки расширения может потребоваться серверный вызов
        Если НЕ ФайлСоответствуетТребованиям(ВыбранноеЗначение) Тогда
            ПоказатьПредупреждение(, "Выбран файл недопустимого формата!");
            // Здесь мы просто ничего не делаем с полученным значением
            Возврат;
        КонецЕсли;
        
        // Если проверка пройдена, записываем файл в документ
        Объект.ФайлНарушения = ВыбранноеЗначение;
        
    КонецЕсли;
    
КонецПроцедуры

Метод 4. Ограничение при загрузке новых файлов

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

Рассмотрим пример настройки фильтра для диалога выбора. Это гарантирует, что при нажатии кнопки "Добавить" пользователь увидит в проводнике Windows только нужные типы файлов. Посмотрим на синтаксис настройки фильтра:


Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите изображение";
// Формат фильтра: "Описание|*.расширение1;*.расширение2"
Диалог.Фильтр = "Картинки (*.jpg;*.png)|*.jpg;*.png";

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

Использование свойства Фильтр объекта ДиалогВыбораФайла является стандартом для платформы 1С:Предприятие 8.3. Это предотвращает загрузку ошибочных данных на самом начальном этапе.

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

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

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

← На главную