При работе с управляемыми формами в 1С:Предприятии часто возникает необходимость предоставить пользователю возможность выбора файла с диска для последующего помещения его во временное хранилище. Методы НачатьПомещениеФайла() и НачатьПомещениеФайлов() предназначены именно для этой цели. Однако изначально не всегда очевидно, как при этом установить фильтр по типу файла, чтобы пользователь видел только нужные расширения (например, только изображения или только текстовые документы).
В этой статье мы подробно разберем, как решить эту задачу, рассмотрим различные подходы и выясним нюансы их применения в зависимости от версии платформы и типа клиента (тонкий клиент, веб-клиент).
Разработчики 1С, работающие с управляемыми формами, сталкиваются с тем, что метод НачатьПомещениеФайла() в своей базовой реализации не предоставляет явного параметра для установки фильтра по типу файлов. Документация для этого метода обычно указывает, что третий параметр, НачальноеИмяФайла, ожидает строку — путь к файлу на диске, либо, если он не указан, будет отображен простейший диалог выбора файла без какой-либо фильтрации.
Это приводит к вопросу: как же предоставить пользователю удобный диалог выбора файла с заранее заданными типами (например, только .txt или .jpg), а затем поместить выбранный файл во временное хранилище без использования сложных "костылей" или модальных окон, которые могут быть проблематичны в веб-клиенте?
Прежде чем перейти к решениям, давайте разберем различия между двумя ключевыми методами для помещения файлов во временное хранилище:
НачатьПомещениеФайла() (единственное число): Этот метод предназначен для помещения одного файла. В ранних версиях платформы 1С:Предприятие (например, 8.3.8.1652) его третий параметр, НачальноеИмяФайла, ожидался исключительно в виде строки. Это означало, что напрямую передать объект, который бы задавал фильтры, было невозможно. Однако в более поздних версиях платформы 1С функционал этого метода был расширен, и теперь он также может принимать объект ДиалогВыбораФайла.НачатьПомещениеФайлов() (множественное число): Этот метод является более расширенным и предназначен для помещения одного или нескольких файлов. Его преимущество состоит в том, что он изначально был разработан с учетом более гибких возможностей, и его третий параметр, ОпределяетНаборПомещаемыхФайлов, может принимать как строку поиска для метода НайтиФайлы, так и, что критически важно для нашей задачи, объект ДиалогВыбораФайла, предварительно подготовленный в режиме открытия файлов.Понимание этих различий позволяет нам выбрать наиболее подходящий путь решения проблемы с фильтрацией.
ДиалогВыбораФайла и его свойство ФильтрКлючевым инструментом для реализации фильтрации файлов является объект ДиалогВыбораФайла. Этот объект позволяет нам настроить внешний вид и поведение стандартного системного диалога выбора файла.
ФильтрСвойство Фильтр объекта ДиалогВыбораФайла — это строковое значение, которое определяет набор файловых фильтров. Формат этой строки зависит от операционной системы, но общий принцип таков:
| (вертикальная черта): строки представления (которая отображается пользователю) и строки маски (фактический фильтр).* (любое количество произвольных символов) и ? (один произвольный символ).|.Пример строки фильтра:
"Текстовые документы (*.txt)|*.txt|Файлы изображений (*.png;*.jpg)|*.png;*.jpg|Все файлы (*.*)|*.*"
Эта строка предоставит пользователю три варианта фильтрации: только текстовые файлы, только изображения или все файлы.
ДиалогВыбораФайлаОбъект ДиалогВыбораФайла может работать в различных режимах, определяемых перечислением РежимДиалогаВыбораФайла:
Открытие: Диалог предназначен для выбора существующих файлов.Сохранение: Диалог предназначен для указания имени файла для сохранения.Для нашей задачи по выбору файла мы будем использовать режим Открытие.
Следует отметить, что для использования диалогов выбора файла на веб-клиенте необходимо предварительно подключить расширение работы с файлами. Диалоги, реализуемые через это расширение, не создают проблем с модальностью, как обычные модальные окна браузеров, что делает их удобными для использования в веб-среде.
ДиалогВыбораФайла в НачатьПомещениеФайлов (и НачатьПомещениеФайла в новых версиях)Это наиболее "прямое" и предпочтительное решение, если ваша версия платформы 1С:Предприятие его поддерживает. Оно позволяет настроить фильтр и другие параметры диалога выбора файла, а затем передать этот настроенный объект напрямую в метод помещения файлов.
Этот подход применим, если вы используете относительно свежие версии платформы 1С:Предприятие (начиная с 8.3.16.1502 и новее, где метод НачатьПомещениеФайла получил соответствующую перегрузку, или для НачатьПомещениеФайлов, который поддерживал это изначально).
ДиалогВыбораФайла, указывая режим Открытие.Фильтр, определяя нужные типы файлов и их текстовые представления.ОписаниеОповещения, который будет вызван после завершения операции помещения файла. Это важно, так как методы НачатьПомещениеФайла/Файлов являются асинхронными.НачатьПомещениеФайлов() (или НачатьПомещениеФайла()), передавая ему наш настроенный объект ДиалогВыбораФайла в качестве третьего параметра. Параметр ИнтерактивныйРежим устанавливаем в Истина, чтобы диалог отобразился пользователю.НачатьПомещениеФайлов():Предположим, нам нужно выбрать один или несколько файлов изображений.
&НаКлиенте
Процедура ВыбратьИПоместитьИзображения(Команда)
// 1. Создаем объект ДиалогВыбораФайла в режиме открытия
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
// 2. Устанавливаем заголовок диалога
ВыборФайла.Заголовок = "Выберите файлы с изображениями";
// 3. Устанавливаем фильтр по типу файла (только PNG)
ВыборФайла.Фильтр = "Изображения (png)|*.png|"; // Можно добавить несколько фильтров: "Изображения (jpg, png)|*.jpg;*.png|"
// 4. Создаем описание оповещения для обработки завершения операции
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьПомещениеИзображенийЗавершение", ЭтотОбъект);
// 5. Вызываем НачатьПомещениеФайлов, передавая ДиалогВыбораФайла напрямую
// Параметры:
// 1 - ОписаниеОповещения
// 2 - Адрес во временном хранилище (пустая строка, будет создан новый)
// 3 - Объект ДиалогВыбораФайла, который будет использоваться для выбора
// 4 - Интерактивный режим (Истина - показать диалог выбора файла)
// 5 - УникальныйИдентификатор формы (для автоматического удаления из хранилища)
НачатьПомещениеФайлов(ОписаниеОповещения, "", ВыборФайла, Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьПомещениеИзображенийЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
// Обработчик вызывается после того, как пользователь выбрал файлы или отменил операцию.
// Параметр "ВыбранныеФайлы" - это массив строк, содержащий адреса файлов во временном хранилище.
// Если пользователь отменил выбор, ВыбранныеФайлы будет пустым массивом или Неопределено.
Если ВыбранныеФайлы = Неопределено Или ВыбранныеФайлы.Количество() = 0 Тогда
Сообщить("Выбор файлов отменен или файлы не выбраны.");
Возврат;
КонецЕсли;
Для Каждого АдресФайла Из ВыбранныеФайлы Цикл
Сообщить("Файл успешно помещен по адресу: " + АдресФайла);
// Здесь мы можем использовать АдресФайла, например, сохранить его в реквизит формы
// или передать на сервер для дальнейшей обработки.
КонецЦикла;
КонецПроцедуры
НачатьПомещениеФайла() (в новых версиях платформы):В более поздних версиях платформы 1С:Предприятие (например, 8.3.16.1502), метод НачатьПомещениеФайла() также был расширен и может принимать объект ДиалогВыбораФайла в качестве третьего параметра. Это позволяет использовать его для выбора одного файла с фильтрацией так же элегантно, как и НачатьПомещениеФайлов().
&НаКлиенте
Процедура ВыбратьИПоместитьФайл(Команда)
АдресФайлаВоВременномХранилище = ""; // Будет создан новый адрес
ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ВыборФайла.Заголовок = "Выберите файл";
// Пример условной фильтрации
// Здесь ИмяТаблицы - это условный реквизит формы для демонстрации
Если ИмяТаблицы = "КартинкиИФайлыНоменклатурыСПараметрами" Тогда
ВыборФайла.Фильтр = "Файлы изображений (*.bmp;*.emf;*.gif;*.ico;*.jpg;*.png;*.tif;*.wmf;*.jpeg)|*.bmp;*.emf;*.gif;*.ico;*.jpg;*.png;*.tif;*.wmf;*.jpeg|";
Иначе
ВыборФайла.Фильтр = "Архивы и SWF (*.swf;*.zip;)|*.swf;*.zip;|";
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьДанныеЗавершение", ЭтотОбъект);
// Вызываем НачатьПомещениеФайла, передавая объект ДиалогВыбораФайла как третий параметр
НачатьПомещениеФайла(ОписаниеОповещения, АдресФайлаВоВременномХранилище, ВыборФайла, Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьДанныеЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Сообщить("Выбор файла отменен.");
Возврат;
КонецЕсли;
// Результат - Булево, Истина если файл успешно помещен
// Адрес - строка, адрес помещенного файла во временном хранилище
// ВыбранноеИмяФайла - строка, путь к файлу на диске, указанный пользователем
Сообщить("Файл '" + ВыбранноеИмяФайла + "' успешно помещен по адресу: " + Адрес);
// Дальнейшая логика работы с Адрес
СсылкаНаКартинку = Адрес; // Пример сохранения адреса
КонецПроцедуры
ДиалогВыбораФайла.Показать() и НачатьПомещениеФайла()Это решение является более универсальным и будет работать даже в тех версиях платформы, где НачатьПомещениеФайла() (единственное число) не поддерживает прямую передачу объекта ДиалогВыбораФайла. Хотя некоторые могут назвать это "костылем", это на самом деле стандартный и корректный способ работы с немодальными диалогами в 1С.
Разработчик в начале обсуждения выразил желание избежать "манипуляций" и считал двухэтапный процесс "костылем". Однако, ключевое отличие здесь в немодальности. Метод ДиалогВыбораФайла.Выбрать() является модальным и блокирует исполнение кода до выбора файла. Это может быть проблематично в веб-клиенте. В то время как ДиалогВыбораФайла.Показать(ОписаниеОповещения) вызывает диалог немодально и продолжает выполнение кода, вызывая процедуру оповещения только после завершения выбора пользователя. Таким образом, этот двухэтапный подход обеспечивает асинхронную, немодальную работу с фильтром.
ДиалогВыбораФайла, устанавливаем его режим Открытие, заголовок и самое главное — свойство Фильтр.ОписаниеОповещения для обработки результата выбора файла из диалога.ДиалогВыбораФайла.Показать(ОписаниеОповещения). Это асинхронный вызов, который не блокирует интерфейс.НачатьПомещениеФайла() (единственное число) с параметром ИнтерактивныйРежим = Ложь. Это означает, что файл будет помещен во временное хранилище без повторного открытия диалога выбора, так как путь к файлу уже известен.НачатьПомещениеФайла() мы также создаем ОписаниеОповещения для обработки его завершения.Этот пример демонстрирует полный цикл: сначала немодальный выбор файла с фильтром, а затем помещение этого файла во временное хранилище, также асинхронно.
&НаКлиенте
Процедура ВыбратьФайлКартинки(Команда)
// 1. Создаем ДиалогВыбораФайла и настраиваем его
ОповещениеВыбора = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Заголовок = "Выберите картинку";
ДиалогВыбора.Фильтр = "Изображение JPEG (*.jpg;*.jpeg;*.jpe)|*.jpg;*.jpeg;*.jpe|Все файлы (*.*)|*.*";
// 2. Вызываем ДиалогВыбораФайла немодально
ДиалогВыбора.Показать(ОповещениеВыбора);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборФайла(РезультатВыбора, ДополнительныеПараметры) Экспорт
// Эта процедура будет вызвана после того, как пользователь закроет ДиалогВыбораФайла
// Проверяем, был ли файл выбран
Если РезультатВыбора = Неопределено Или РезультатВыбора.Количество() = 0 Тогда
Сообщить("Выбор файла отменен.");
Возврат;
КонецЕсли;
// РезультатВыбора - это массив путей к выбранным файлам
// В данном случае, мы ожидаем один файл, берем первый элемент
ПутьКВыбранномуФайлуНаДиске = РезультатВыбора[0];
// 3. Создаем описание оповещения для НачатьПомещениеФайла
ОповещениеПомещения = Новый ОписаниеОповещения("ОбработатьПомещениеФайла", ЭтотОбъект);
// 4. Вызываем НачатьПомещениеФайла неинтерактивно, используя полученный путь
// Параметры:
// 1 - ОповещениеПомещения
// 2 - Адрес во временном хранилище (пустая строка, будет создан новый)
// 3 - ПутьКВыбранномуФайлуНаДиске (файл, который нужно поместить)
// 4 - Интерактивный режим (Ложь - не показывать диалог выбора)
// 5 - УникальныйИдентификатор формы (для автоматического удаления из хранилища)
НачатьПомещениеФайла(ОповещениеПомещения, "", ПутьКВыбранномуФайлуНаДиске, Ложь, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьПомещениеФайла(РезультатПомещения, АдресПомещенногоФайла, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
// Эта процедура будет вызвана после того, как файл помещен во временное хранилище
Если Не РезультатПомещения Тогда
Сообщить("Ошибка при помещении файла.");
Возврат;
КонецЕсли;
Сообщить("Файл успешно помещен по адресу: " + АдресПомещенногоФайла);
// Теперь мы имеем адрес файла во временном хранилище (АдресПомещенногоФайла)
// и можем использовать его, например, для отображения картинки или сохранения в базу данных.
// Пример: СсылкаНаКартинку = АдресПомещенногоФайла;
КонецПроцедуры
ДиалогВыбораФайла в метод НачатьПомещениеФайла() (единственное число) появилась не сразу, а в более поздних версиях платформы 8.3 (например, начиная с 8.3.16.1502). Если вы работаете на более ранних версиях (например, 8.3.8.1652), вам придется использовать двухэтапный немодальный подход (Решение 2) или метод НачатьПомещениеФайлов() (множественное число), если он поддерживает передачу ДиалогВыбораФайла в вашей версии. Всегда рекомендуется проверять актуальную документацию для вашей версии платформы.ДиалогВыбораФайла.Показать() заключается в том, что они спроектированы таким образом, чтобы не вызывать проблем с блокировкой браузера, характерных для модальных системных окон.НачатьПомещениеФайлов() (множественное число), который предназначен именно для этой цели. Объект ДиалогВыбораФайла также имеет свойство МножественныйВыбор (Булево), которое нужно установить в Истина, если требуется разрешить выбор нескольких файлов. В этом случае, в обработчике оповещения, параметр РезультатВыбора будет содержать массив путей ко всем выбранным файлам.Мы рассмотрели два основных способа установки фильтра по типу файла при помещении файлов во временное хранилище в 1С:Предприятии, управляемые формы:
ДиалогВыбораФайла в методы НачатьПомещениеФайла() или НачатьПомещениеФайлов(). Этот подход является наиболее удобным и "чистым", если ваша версия платформы его поддерживает. Он позволяет задать фильтр и другие параметры диалога выбора файла напрямую, делая вызов асинхронным.ДиалогВыбораФайла.Показать(ОписаниеОповещения) для получения пути к файлу с фильтром, а затем неинтерактивного вызова НачатьПомещениеФайла() для помещения этого файла во временное хранилище. Этот метод более универсален, работает в более широком спектре версий платформы и полностью соответствует принципам асинхронной работы в управляемых формах.Выбор оптимального решения зависит от версии вашей платформы, требований к количеству выбираемых файлов (один или несколько) и личных предпочтений. В любом случае, оба метода позволяют успешно решить задачу фильтрации файлов, избегая при этом проблем с модальностью и обеспечивая удобство для пользователя.