Как сохранить данные из 1С в CSV-файл при работе в веб-клиенте?

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

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

Способ 1: Использование ТабличногоДокумента (наиболее простой путь)

Многие разработчики привыкли выгружать данные в Excel, используя метод Записать объекта ТабличныйДокумент. Важно знать, что начиная с версии платформы 8.3.6, системное перечисление ТипФайлаТабличногоДокумента включает в себя значение CSV. Это значительно упрощает задачу, так как платформа берет на себя все вопросы экранирования кавычек и расстановки разделителей.

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


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

Проанализируем этот подход: метод Записать с типом CSV автоматически преобразует ячейки таблицы в текстовые строки, разделенные запятыми (или точкой с запятой, в зависимости от локальных настроек). Это избавляет от необходимости вручную перебирать строки РезультатаЗапроса или ТаблицыЗначений.

Способ 2: Использование ТекстовогоДокумента (гибкая настройка)

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

Сначала подготовим данные на сервере, собрав их в одну большую строку, и поместим в объект ТекстовыйДокумент:


&НаСервере
Функция СформироватьТекстCSVНаСервере(ТЗ, СимволРазделителя = ",")
    
    ТекстCSV = "";
    
    // Формируем шапку (необязательно)
    Для Каждого Колонка Из ТЗ.Колонки Цикл
        ТекстCSV = ТекстCSV + Колонка.Имя + СимволРазделителя;
    КонецЦикла;
    ТекстCSV = ТекстCSV + Символы.ПС;
    
    // Заполняем строки данными
    Для Каждого СтрокаТЗ Из ТЗ Цикл
        ТекстCSV = ТекстCSV + Строка(СтрокаТЗ.Поле1) + СимволРазделителя +
                   Строка(СтрокаТЗ.Поле2) + СимволРазделителя +
                   Строка(СтрокаТЗ.Поле3) + Символы.ПС;
    КонецЦикла;
    
    ТекстДок = Новый ТекстовыйДокумент;
    // Устанавливаем кодировку, например ANSI или UTF8
    ТекстДок.УстановитьТипФайла(КодировкаТекста.ANSI);
    ТекстДок.УстановитьТекст(ТекстCSV);
    
    // Записываем во временный файл и помещаем в хранилище
    ИмяФайла = ПолучитьИмяВременногоФайла("csv");
    ТекстДок.Записать(ИмяФайла);
    
    Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
    
КонецФункции

Передача файла на сторону клиента в веб-приложении

После того как файл сформирован на сервере и помещен во временное хранилище, его нужно «отдать» браузеру пользователя. В современных версиях платформы (начиная с 8.3.15) рекомендуется использовать асинхронные методы, такие как НачатьПолучениеФайлаССервера. Это позволяет избежать блокировки интерфейса и требования установки расширения работы с файлами в некоторых случаях.

Выясним, как выглядит процедура сохранения на клиенте:


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

Важный момент: использование НачатьПолучениеФайлаССервера вместо устаревшего ПолучитьФайл позволяет веб-клиенту корректно обработать загрузку через стандартный менеджер закачек браузера.

Особенности формата CSV и спецификация RFC 4180

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

  1. Разделители внутри данных: Если в наименовании товара или организации есть запятая (например, "ООО ""Ромашка, Плюс"""), то всё поле обязательно должно быть заключено в двойные кавычки.
  2. Двойные кавычки: Если внутри текста самой ячейки встречается кавычка, её необходимо удваивать.
  3. Кодировка и BOM: Для корректного открытия UTF-8 файлов в Excel рекомендуется добавлять в начало файла метку BOM (Byte Order Mark). В 1С это можно сделать при использовании метода ПолучитьДвоичныеДанныеИзСтроки, передав параметр кодировки с BOM.

Если вы формируете CSV вручную через сборку строки, рассмотрите возможность использования вспомогательной функции для экранирования:


&НаСервере
Функция ЭкранироватьСтрокуCSV(Значение)
    
    Текст = Строка(Значение);
    // Если есть спецсимволы, оборачиваем в кавычки и удваиваем существующие кавычки
    Если Найти(Текст, ",") > 0 Или Найти(Текст, """") > 0 Или Найти(Текст, Символы.ПС) > 0 Тогда
        Текст = """" + СтрЗаменить(Текст, """", """""") + """";
    КонецЕсли;
    
    Возврат Текст;
    
КонецФункции

Резюме

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

← На главную