При разработке механизмов выгрузки данных из 1С часто возникает задача: передать сформированный на сервере файл пользователю так, чтобы при сохранении система автоматически подставляла нужное расширение (например, .xml или .xlsx) и ограничивала выбор типов файлов в диалоговом окне. Однако многие разработчики сталкиваются с тем, что стандартный объект ПараметрыДиалогаПолученияФайлов игнорирует расширение или предлагает пользователю выбор «Все файлы (*.*)».
В этой статье мы подробно разберем, почему это происходит, проанализируем ограничения платформы 1С и рассмотрим наиболее эффективные способы решения этой задачи для Тонкого и Веб-клиентов.
Рассмотрим стандартную ситуацию. Программист пытается использовать метод НачатьПолучениеФайлаССервера и передает в него настройки через специальный объект. Код выглядит примерно так:
ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов;
ИмяФайла = "Выгрузка_Данных_" + Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd") + ".xml";
НачатьПолучениеФайлаССервера(АдресФайлаВоВременномХранилище, ИмяФайла, ПараметрыДиалога);
На практике мы видим следующее поведение:
.xml может «отвалиться», если пользователь случайно изменит имя или если платформа некорректно интерпретирует строку.Выясним причину: объект ПараметрыДиалогаПолученияФайлов — это упрощенная структура. В отличие от классического объекта ДиалогВыбораФайла, у него отсутствует свойство Фильтр. Это архитектурное ограничение платформы 8.3, связанное с унификацией работы на разных устройствах, включая мобильные платформы и браузеры. Для более детального знакомства с особенностями клиент-серверного взаимодействия можно изучить руководство по работе с файлами в управляемых формах 1С 8.3.
Проанализируем ситуацию: если нам критически важно, чтобы пользователь видел маску *.xml и не мог сохранить файл с произвольным расширением, нам нужно разделить процесс на два этапа. Сначала мы просим пользователя выбрать путь сохранения с помощью полноценного диалога, а затем передаем этот путь в процедуру скачивания.
Разберем этот алгоритм по шагам:
ДиалогВыбораФайла в режиме РежимДиалогаВыбораФайла.Сохранение.Фильтр, где жестко прописываем расширение.Показать.НачатьПолучениеФайлаССервера.Посмотрим на пример реализации:
&НаКлиенте
Процедура СохранитьФайлСФильтром()
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите путь для сохранения выгрузки";
Диалог.ПолноеИмяФайла = "Выгрузка.xml";
Диалог.Фильтр = "Файлы XML (*.xml)|*.xml";
Оповещение = Новый ОписаниеОповещения("ПослеВыбораПутиДляСохранения", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораПутиДляСохранения(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
ПутьКФайлу = ВыбранныеФайлы[0];
// Теперь используем ПараметрыДиалогаПолученияФайлов,
// но отключаем повторный выбор пути (ВыборПути = Ложь)
ПараметрыПолучения = Новый ПараметрыДиалогаПолученияФайлов;
ПараметрыПолучения.ВыборПути = Ложь;
НачатьПолучениеФайлаССервера(АдресНаСервере, ПутьКФайлу, ПараметрыПолучения);
КонецЕсли;
КонецПроцедуры
Важный момент: Установка свойства ВыборПути = Ложь в ПараметрыДиалогаПолученияФайлов является ключевой. Если этого не сделать, платформа сначала покажет ваш диалог, а потом — свой стандартный, что запутает пользователя.
Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), мы можем упростить себе жизнь. Рассмотрим метод СохранитьФайлКак из общего модуля РаботаСФайламиКлиент. Программисты БСП уже реализовали внутри этого метода всю «макаронную» логику обработки диалогов, проверки расширений и особенностей работы в разных клиентах. Для быстрого поиска и изучения готовых процедур подсистемы можно использовать справочник по методам БСП с примерами вызовов.
Использование этого метода позволяет избежать написания собственных обработчиков оповещения для каждого чиха. В ЗУП или ERP таким образом сохраняются справки, отчеты и выгрузки в XML. Проанализируем вызов:
ПараметрыФайла = РаботаСФайламиКлиент.ПараметрыСохраненияФайла();
ПараметрыФайла.ИмяФайла = "Отчет.xml";
ПараметрыФайла.ДанныеФайла = АдресВоВременномХранилище;
РаботаСФайламиКлиент.СохранитьФайлКак(Неопределено, ПараметрыФайла);
Внутри БСП сама определит, нужно ли показывать диалог (в зависимости от настроек клиента) и как правильно передать фильтры расширений в операционную систему.
Проанализируем ситуацию с браузерами. Важно понимать, что ни ПараметрыДиалогаПолученияФайлов, ни ДиалогВыбораФайла не могут заставить браузер вести себя вопреки его настройкам безопасности.
Рассмотрим два сценария:
НачатьПолучениеФайлаССервера откроется стандартное системное окно Windows/Linux/macOS. В этом случае расширение подставится из параметра ИмяФайла.Downloads. Здесь единственный способ повлиять на расширение — убедиться, что строка имени файла заканчивается на .xml (или любое другое нужное расширение) и не содержит запрещенных символов вроде двоеточий или косой черты.Совет: Перед передачей имени файла в метод получения, всегда очищайте его от «лишних» точек. Например, имя "Выгрузка.01.01.2023.xml" может быть обрезано некоторыми системами до первого вхождения точки, и пользователь получит файл без расширения.
Выясним основные правила работы с расширениями при получении файлов:
ПараметрыДиалогаПолученияФайлов не поддерживает фильтры (маски файлов) по определению.ДиалогВыбораФайла (для выбора пути) + НачатьПолучениеФайлаССервера с флагом ВыборПути = Ложь.РаботаСФайламиКлиент.СохранитьФайлКак.Следуя этим рекомендациям, мы обеспечим предсказуемое поведение интерфейса и корректное сохранение данных пользователями в любых режимах работы платформы 1С:Предприятие.