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