Работа в веб-клиенте 1С накладывает определенные ограничения на привычные методы манипуляции с файлами. В отличие от тонкого клиента, где доступ к файловой системе компьютера пользователя более прямой, веб-приложение требует использования механизмов временного хранилища и специализированных методов платформы для передачи данных между сервером и браузером. Одной из частых задач является выгрузка отчетов или таблиц в формат CSV. Разберем подробно, как реализовать этот алгоритм, какие объекты использовать и как избежать типичных ошибок форматирования.
Многие разработчики привыкли выгружать данные в Excel, используя метод Записать объекта ТабличныйДокумент. Важно знать, что начиная с версии платформы 8.3.6, системное перечисление ТипФайлаТабличногоДокумента включает в себя значение CSV. Это значительно упрощает задачу, так как платформа берет на себя все вопросы экранирования кавычек и расстановки разделителей.
Рассмотрим пример функции на сервере, которая подготавливает файл для скачивания:
&НаСервере
Функция ПодготовитьCSVИзТабДока(ТабличныйДокумент) Экспорт
// Генерируем уникальное имя временного файла на сервере
ИмяФайла = ПолучитьИмяВременногоФайла("csv");
// Сохраняем табличный документ в формате CSV
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.CSV);
// Помещаем двоичные данные файла во временное хранилище
// Это необходимо для последующей передачи на клиент
АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
Возврат АдресХранилища;
КонецФункции
Проанализируем этот подход: метод Записать с типом CSV автоматически преобразует ячейки таблицы в текстовые строки, разделенные запятыми (или точкой с запятой, в зависимости от локальных настроек). Это избавляет от необходимости вручную перебирать строки РезультатаЗапроса или ТаблицыЗначений.
Если структура CSV-файла должна быть специфической (например, особый разделитель вроде $ или нестандартная кодировка), лучше использовать объект ТекстовыйДокумент. Рассмотрим ситуацию, когда мы формируем текст файла вручную на основе таблицы значений.
Сначала подготовим данные на сервере, собрав их в одну большую строку, и поместим в объект ТекстовыйДокумент:
&НаСервере
Функция СформироватьТекстCSVНаСервере(ТЗ, СимволРазделителя = ",")
ТекстCSV = "";
// Формируем шапку (необязательно)
Для Каждого Колонка Из ТЗ.Колонки Цикл
ТекстCSV = ТекстCSV + Колонка.Имя + СимволРазделителя;
КонецЦикла;
ТекстCSV = ТекстCSV + Символы.ПС;
// Заполняем строки данными
Для Каждого СтрокаТЗ Из ТЗ Цикл
ТекстCSV = ТекстCSV + Строка(СтрокаТЗ.Поле1) + СимволРазделителя +
Строка(СтрокаТЗ.Поле2) + СимволРазделителя +
Строка(СтрокаТЗ.Поле3) + Символы.ПС;
КонецЦикла;
ТекстДок = Новый ТекстовыйДокумент;
// Устанавливаем кодировку, например ANSI или UTF8
ТекстДок.УстановитьТипФайла(КодировкаТекста.ANSI);
ТекстДок.УстановитьТекст(ТекстCSV);
// Записываем во временный файл и помещаем в хранилище
ИмяФайла = ПолучитьИмяВременногоФайла("csv");
ТекстДок.Записать(ИмяФайла);
Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
КонецФункции
После того как файл сформирован на сервере и помещен во временное хранилище, его нужно «отдать» браузеру пользователя. В современных версиях платформы (начиная с 8.3.15) рекомендуется использовать асинхронные методы, такие как НачатьПолучениеФайлаССервера. Это позволяет избежать блокировки интерфейса и требования установки расширения работы с файлами в некоторых случаях.
Выясним, как выглядит процедура сохранения на клиенте:
&НаКлиенте
Процедура СохранитьФайлНаКлиент(Команда)
// Вызываем серверный метод для формирования файла
АдресХранилища = СформироватьТекстCSVНаСервере(Объект.ДанныеДляВыгрузки);
Если ЗначениеЗаполнено(АдресХранилища) Тогда
ИмяФайлаДляСохранения = "Выгрузка_Данных.csv";
// Современный асинхронный способ получения файла
ПараметрыПолучения = Новый ПараметрыПолученияФайлаССервера;
НачатьПолучениеФайлаССервера( , АдресХранилища, ИмяФайлаДляСохранения, ПараметрыПолучения);
Иначе
Сообщить("Ошибка при формировании данных!");
КонецЕсли;
КонецПроцедуры
Важный момент: использование НачатьПолучениеФайлаССервера вместо устаревшего ПолучитьФайл позволяет веб-клиенту корректно обработать загрузку через стандартный менеджер закачек браузера.
Проанализируем ситуацию с корректностью данных. Часто разработчики забывают, что CSV — это не просто текст с запятыми. Существуют правила, несоблюдение которых приведет к тому, что файл не откроется корректно в Excel или других системах:
"ООО ""Ромашка, Плюс"""), то всё поле обязательно должно быть заключено в двойные кавычки.ПолучитьДвоичныеДанныеИзСтроки, передав параметр кодировки с BOM.Если вы формируете CSV вручную через сборку строки, рассмотрите возможность использования вспомогательной функции для экранирования:
&НаСервере
Функция ЭкранироватьСтрокуCSV(Значение)
Текст = Строка(Значение);
// Если есть спецсимволы, оборачиваем в кавычки и удваиваем существующие кавычки
Если Найти(Текст, ",") > 0 Или Найти(Текст, """") > 0 Или Найти(Текст, Символы.ПС) > 0 Тогда
Текст = """" + СтрЗаменить(Текст, """", """""") + """";
КонецЕсли;
Возврат Текст;
КонецФункции
Подведем итог: для выгрузки данных в CSV из веб-клиента 1С наиболее надежным и современным способом является формирование файла на сервере, помещение его во временное хранилище и последующий вызов асинхронного метода получения файла на клиенте. Использование встроенного ТабличногоДокумента с типом файла CSV — самый быстрый путь, гарантирующий соблюдение стандартов формата, в то время как ТекстовыйДокумент дает максимальный контроль над структурой выгрузки.