Как выгрузить файл из внешней обработки в безопасном режиме в новых версиях БСП

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

При обновлении типовых конфигураций (например, «Бухгалтерия предприятия», ред. 3.0) до релизов с версией Библиотеки Стандартных Подсистем (БСП) 2.4 и выше разработчики внешних обработок часто сталкиваются с ошибками выполнения. Старые общие модули, такие как ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера, а также функции вроде ТекстовыйДокументВДвоичныеДанные перестают существовать. Разберем, почему это произошло и как правильно переписать алгоритм выгрузки файлов для корректной работы, в том числе в сервисе 1С:Фреш.

Причины изменений в подсистеме безопасного режима

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

Из конфигураций были полностью удалены общие модули:

  1. ДополнительныеОтчетыИОбработкиВБезопасномРежиме
  2. ДополнительныеОтчетыИОбработкиВБезопасномРежимеВызовСервера

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

Шаг 1. Проверка версии БСП при регистрации обработки

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

Рассмотрим пример заполнения сведений о внешней обработке:


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

Шаг 2. Формирование данных в памяти и работа с временным хранилищем

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

Выясним, как это реализовать на сервере:


&НаСервере
Функция СформироватьФайлНаСервере()
    // Формируем текстовую строку с данными
    ТекстФайла = "Пример выгружаемых данных";
    
    // Преобразуем строку в двоичные данные без записи на диск сервера
    ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(ТекстФайла);
    
    // Помещаем двоичные данные во временное хранилище.
    // Передача УникальногоИдентификатора формы обеспечивает автоочистку памяти.
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
    
    Возврат АдресХранилища;
КонецФункции

Шаг 3. Сохранение файла на стороне клиента

Поскольку в облачных сервисах и веб-клиенте прямая работа с файлами на сервере ограничена, полученный адрес временного хранилища передается на клиент. Для передачи файла пользователю применяются асинхронные методы платформы 1С.

Посмотрим на пример клиентской процедуры:


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

Важные правила для успешного прохождения аудита в 1С:Фреш

Если обработка предназначена для публикации в сервисе 1С:Фреш, необходимо учитывать следующие требования безопасности:

  1. Асинхронность на клиенте: Нельзя использовать синхронные вызовы диалогов выбора файлов или работу с файловой системой. Все операции скачивания должны вызывать асинхронные методы (например, ПолучитьФайлы или НачатьПолучениеФайлов).
  2. Очистка ресурсов: При вызове функции ПоместитьВоВременноеХранилище обязательно передавайте вторым параметром ЭтаФорма.УникальныйИдентификатор, чтобы данные автоматически удалялись из памяти при закрытии формы обработки.
  3. Запрет динамического кода: В безопасном режиме платформой полностью блокируются функции Выполнить() и Вычислить(), а также прямое использование COM-объектов.
← На главную