Как использовать метод Прочитать табличного документа в безопасном режиме 1С:Фреш

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

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

Выясним причину возникновения ошибки

Прежде всего, проанализируем ситуацию: почему стандартный код, который отлично работает в локальной базе, ломается в облаке? В безопасном режиме (Safe Mode) платформа 1С блокирует любые операции, которые могут потенциально нанести вред серверной системе или получить несанкционированный доступ к данным. Метод Прочитать() требует доступа к файловой системе сервера. Даже если вы используете ПолучитьИмяВременногоФайла(), система безопасности может блокировать доступ к этому пути, если он не был явно разрешен в профиле безопасности обработки.

Шаг 1. Настройка разрешений в функции СведенияОВнешнейОбработке

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

Добавим в функцию СведенияОВнешнейОбработке следующий блок кода:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    
    // ... другие параметры регистрации ...

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

    Возврат ПараметрыРегистрации;
КонецФункции

Здесь метод РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина) запрашивает права как на чтение, так и на запись в специально выделенную "песочницу" для вашей обработки. Обратите внимание, что использование УстановитьОтключениеБезопасногоРежима(Истина) во Фреше недопустимо — такая обработка никогда не пройдет аудит.

Шаг 2. Реализация трехшаговой схемы передачи файла

Теперь рассмотрим правильную архитектуру передачи данных с клиента на сервер. Прямое чтение файла по пути на сервере невозможно, так как сервер не видит файлы на диске пользователя. Мы должны реализовать цепочку: Выбор файла на клиенте -> Помещение во временное хранилище -> Запись во временный файл на сервере -> Чтение в Табличный документ.

Разберем по шагам реализацию на примере управляемых форм:


&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    // Шаг 1: Выбор файла пользователем
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
    ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
    ПараметрыДиалога.Заголовок = "Выберите файл для загрузки";
    ПараметрыДиалога.Фильтр = "Excel (*.xls;*.xlsx)|*.xls;*.xlsx|CSV (*.csv)|*.csv";
    
    НачатьПомещениеФайлаНаСервер(Оповещение, , , , ПараметрыДиалога, ЭтаФорма.УникальныйИдентификатор);
КонецПроцедуры

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

&НаСервере
Процедура ПрочитатьФайлНаСервере(ОписаниеФайла)
    // Получаем данные из хранилища
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(ОписаниеФайла.Адрес);
    
    // Создаем имя временного файла через механизмы БСП (это важно!)
    ИмяФайла = ПолучитьИмяВременногоФайла(ОписаниеФайла.Расширение);
    
    // Записываем данные во временный файл
    ДвоичныеДанные.Записать(ИмяФайла);
    
    // Шаг 3: Чтение в табличный документ
    ТабДок = Новый ТабличныйДокумент;
    Попытка
        ТабДок.Прочитать(ИмяФайла);
        // Далее работаем с ТабДок (например, переносим в ТЗ или документ)
        ОбработатьДанныеТаблицы(ТабДок);
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка чтения файла: " + ОписаниеОшибки());
    КонецПопытки;
    
    // Обязательно удаляем временный файл после работы
    УдалитьФайлы(ИмяФайла);
КонецПроцедуры

Альтернативный вариант: Использование потоков (без записи на диск)

Проанализируем ситуацию, когда запись на диск все равно блокируется или вы хотите сделать код максимально "чистым" для аудита 1С:Фреш. В современных версиях платформы (8.3.9+) метод Прочитать() может работать с объектом ЧтениеДанных, который, в свою очередь, может быть создан из потока в памяти.

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


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

Важный нюанс: метод чтения из потока для ТабличныйДокумент официально поддерживает форматы, которые 1С умеет разбирать нативно. Для старых форматов .xls (Excel 97) это может не сработать, так как они часто требуют системных библиотек. Всегда рекомендуйте пользователям использовать формат .xlsx.

Особенности работы с CSV в безопасном режиме

Если ваша задача — прочитать CSV-файл, то использование ТабличныйДокумент.Прочитать() является избыточным и потенциально проблемным. Самый надежный способ для безопасного режима — чтение файла как текста. Это гарантированно проходит любой аудит и работает быстрее.

Разберем алгоритм загрузки CSV:

  1. Получаем ДвоичныеДанные из временного хранилища.
  2. Преобразуем их в строку с помощью ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8).
  3. Разбиваем строку на массив строк методом СтрРазделить().
  4. Каждую строку разбиваем по разделителю (например, точка с запятой).

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

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

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

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

← На главную