Как сохранить файл в формате CSV на сервере 1С:Предприятие

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

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

Использование объекта ТекстовыйДокумент для сохранения данных

Рассмотрим самый простой и наглядный способ, который предложил автор вопроса. Объект ТекстовыйДокумент удобен тем, что позволяет постепенно формировать структуру файла в оперативной памяти, а затем одним методом записать всё содержимое на диск. Проанализируем программный код, который выполняет сборку данных из результата запроса или коллекции:


&НаСервере
Процедура СохранитьДанныеНаСервере()
    // Создаем объект для работы с текстом
    Документ = Новый ТекстовыйДокумент;
    
    // Формируем строку заголовка CSV
    СтрЗаголовок = "Номенклатура;" + "КоличествоОстаток;" + "СуммаОстаток";
    Документ.ДобавитьСтроку(СтрЗаголовок);
    
    // Обходим коллекцию данных (например, таблицу значений или результат запроса)
    Для каждого СтрокаДанных Из Объект.Результат Цикл
        // Формируем строку данных с разделителем "точка с запятой"
        СтрДанных = СокрЛП(СтрокаДанных.Номенклатура) + ";" + 
                    Строка(СтрокаДанных.КоличествоОстаток) + ";" + 
                    Строка(СтрокаДанных.СуммаОстаток);
        Документ.ДобавитьСтроку(СтрДанных);
    КонецЦикла;
    
    // Указываем путь, который доступен серверу ОС
    ПутьКФайлу = "C:\Exchange\ExportData.csv"; 
    
    // Записываем файл на диск
    Документ.Записать(ПутьКФайлу, КодировкаТекста.UTF8);
КонецПроцедуры

Разберем по шагам ключевой момент: метод Записать. Для корректного сохранения CSV-файла на сервере необходимо передать два параметра. Первый — это полный путь к файлу в файловой системе сервера. Второй — кодировка. Если вы планируете открывать этот файл в Microsoft Excel без дополнительных преобразований, лучше использовать КодировкаТекста.ANSI. Если же данные содержат специфические символы, используйте КодировкаТекста.UTF8. При необходимости автоматического преобразования полученных файлов в формат электронных таблиц можно использовать конвертор файлов из CSV в XLS.

Оптимизация записи больших объемов данных с помощью ЗаписьТекста

Если в вашем отчете или таблице десятки тысяч строк, объект ТекстовыйДокумент может потреблять значительный объем оперативной памяти сервера, так как он хранит весь текст в памяти до момента вызова метода Записать. Проанализируем более профессиональный и производительный метод — использование объекта ЗаписьТекста. Этот объект пишет данные в файл «потоково», не загружая память целиком.

Выясним, как изменить алгоритм для потоковой записи:


&НаСервере
Процедура СохранитьЧерезЗаписьТекста()
    ПутьКФайлу = "D:\Data\Export.csv";
    
    // Создаем объект записи сразу с указанием пути и кодировки
    Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.ANSI);
    
    // Записываем заголовок
    Запись.ЗаписатьСтроку("Номенклатура;Количество;Сумма");
    
    Для каждого Строка Из Объект.Результат Цикл
        // Формируем строку
        ТекстСтроки = Строка.Номенклатура.Наименование + ";" + 
                      Строка.КоличествоОстаток + ";" + 
                      Строка.СуммаОстаток;
        // Записываем строку сразу на диск
        Запись.ЗаписатьСтроку(ТекстСтроки);
    КонецЦикла;
    
    // Обязательно закрываем файл, чтобы освободить ресурсы ОС
    Запись.Закрыть();
КонецПроцедуры

Этот метод считается более надежным для серверных процедур, так как он минимизирует риски возникновения ошибки "Недостаточно памяти" при работе с очень большими выгрузками.

Важные нюансы: пути и права доступа на сервере

При выполнении кода в контексте &НаСервере, важно понимать, что система взаимодействует с файловой системой сервера, а не клиентского компьютера. Разберем основные причины, по которым файл может не сохраняться:

  1. Права учетной записи службы 1С: Служба сервера 1С:Предприятие обычно запускается от имени пользователя usr1cv8 (или аналогичного). Если у этого пользователя нет прав «Запись» на папку C:\Exchange, метод Записать() выдаст ошибку доступа. Решение: Убедитесь, что папка создана заранее и права для пользователя службы 1С настроены корректно.
  2. Пути в Linux: Если ваш сервер 1С работает под управлением Linux, пути будут выглядеть иначе, например: /home/1c/exchange/data.csv. Помните, что Linux чувствителен к регистру символов в именах папок.
  3. Сетевые диски: Сервер 1С часто «не видит» сетевые диски, подключенные в сессии пользователя (например, диск Z:). Рекомендуется использовать полные сетевые пути (UNC), такие как \\FileServer\Share\data.csv.

Работа с временными файлами

Зачастую файл на сервере нужен лишь временно (например, чтобы отправить его по электронной почте или передать во внешнюю систему по FTP). В этом случае не стоит жестко прописывать путь к диску C:. Посмотрим на пример использования временных папок:

Функция ПолучитьИмяВременногоФайла("csv") автоматически генерирует уникальный путь в системной временной директории сервера. Это исключает ситуацию, когда два пользователя одновременно запускают обработку и пытаются перезаписать один и тот же файл.


ИмяФайла = ПолучитьИмяВременногоФайла("csv");
ТекстовыйДок = Новый ТекстовыйДокумент;
// ... заполнение документа ...
ТекстовыйДок.Записать(ИмяФайла, КодировкаТекста.UTF8);
// После использования файла (например, отправки), его можно удалить
// УдалитьФайлы(ИмяФайла);

Специфика формата CSV

Чтобы ваш файл корректно воспринимался сторонними программами, проанализируем правила формирования CSV:

Таким образом, мы рассмотрели все этапы сохранения файла на сервере: от выбора объекта (ТекстовыйДокумент или ЗаписьТекста) до решения проблем с правами доступа и кодировками. Следуя этим рекомендациям, вы сможете настроить стабильный обмен данными в вашей системе. Для проверки серверных каталогов и передачи выгруженных файлов между клиентом и сервером можно использовать файловый менеджер для обмена файлами между клиентом и сервером.

← На главную