Как правильно считывать данные из Excel в 1С:Fresh для успешного прохождения аудита?

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

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

Почему возникают сложности с аудитом?

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

Способ 1: Использование разрешений в СведенияОВнешнейОбработке

Рассмотрим классический и наиболее распространенный вариант решения проблемы через описание разрешений в модуле объекта внешней обработки. Для того чтобы платформа позволила создать временный файл на сервере для последующего чтения через ТабличныйДокумент, необходимо в функции СведенияОВнешнейОбработке добавить запрос на использование каталога временных файлов.

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


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

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

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

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

Способ 2: Чтение данных через поток (MemoryStream) для XLSX

Современные версии платформы (начиная с 8.3.14) позволяют считывать файлы формата XLSX напрямую из потока в памяти, не создавая физический файл на диске сервера. Это «золотой стандарт» для Fresh, так как такой подход вообще не требует запроса разрешений на работу с файловой системой и проходит аудит практически мгновенно.

Рассмотрим, как реализовать этот механизм:


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

К сожалению, этот метод имеет ограничение: он не поддерживает старый бинарный формат XLS (Excel 97-2003). Если вашим пользователям критично загружать именно старые файлы, придется комбинировать этот метод с записью во временный файл, как описано в первом способе.

Способ 3: Правильный алгоритм загрузки через временное хранилище

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

  1. На клиенте пользователь выбирает файл с помощью диалога.
  2. Файл помещается во временное хранилище.
  3. На сервере данные извлекаются и записываются в строго отведенное платформой место.

Пример реализации серверной части после того, как файл уже был помещен во временное хранилище (адрес передан в АдресФайла):


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

Важный совет: всегда используйте конструкцию Попытка...Исключение...КонецПопытки или Попытка...Фактически, чтобы гарантированно удалить временный файл после его прочтения. Аудиторы Fresh внимательно следят за тем, чтобы код не оставлял «мусора» в файловой системе сервера.

Способ 4: Вынос логики в расширение конфигурации

Если требования вашего проекта подразумевают сложную работу с файлами, внешними библиотеками или COM-объектами (что во Fresh практически невозможно), стоит рассмотреть вариант использования расширения конфигурации вместо внешней обработки.

К расширениям в облачном сервисе применяются более гибкие требования:

Разберем ситуацию: вы можете создать в расширении функцию, которая принимает ДвоичныеДанные, выполняет всю «грязную» работу по записи и чтению файла в привилегированном модуле и возвращает уже готовую ТаблицуЗначений. Ваша внешняя обработка будет просто вызывать эту функцию из расширения.

Рекомендации для успешного прохождения аудита

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

  1. Недостаточная аргументация: В поле описания разрешения в СведенияОВнешнейОбработке пишите подробно. Вместо «Для работы» напишите: «Необходим временный доступ к файловой системе для чтения файлов формата XLS (Binary), так как данный формат не поддерживает чтение напрямую из потока памяти через объект ТабличныйДокумент».
  2. Отсутствие очистки: Всегда вызывайте УдалитьФайлы() для всех созданных временных объектов.
  3. Использование устаревших механизмов: Не пытайтесь использовать Excel.Application (COM-объекты) на сервере. Во Fresh это запрещено фундаментально. Используйте только ТабличныйДокумент.Прочитать().
  4. Игнорирование клиентской части: Если файл небольшой, рассмотрите возможность прочитать его методом ТабДок.Прочитать(ПутьКФайлу) прямо на клиенте, а на сервер передать уже готовую таблицу или массив структур. Это полностью снимет вопросы по безопасности сервера.

Подводя итог, отметим, что наиболее стабильным и современным способом загрузки данных из Excel во Fresh является сочетание чтения из потока для XLSX и аккуратного использования временных файлов с явными разрешениями для XLS. Следуя этим правилам и сопровождая код понятными комментариями для аудиторов, вы значительно сократите время внедрения ваших разработок в облачный сервис.

← На главную